シリーズ3.ImageJマクロ言語を用いた画像解析~②二値化処理-1~

前回の記事シリーズ3からマクロ言語を用いた画像処理の実例を紹介しています。今回は第二回目として二値化処理についてご紹介します。

目次

【記事の目標】

前回の記事シリーズ3からマクロ言語を用いた画像処理の実例を紹介しています。
(第一回目→シリーズ3.ImageJマクロ言語を用いた画像解析~①輝度の統計量 ~)

今回は第二回目として二値化処理について勉強します。
画像を触ったことがない人を対象として、適切な画像解析を施すまでのImageJのマクロ言語を用いた学習過程を示す。

【二値化処理とは?】

グレースケール画像に対してある輝度値を基準 (閾値) としその閾値以上の輝度値を示す画素値を1、閾値以下の輝度値を示す画素値を0に変換し、画素値が0と255 (あるいは0と1) の2つの値しかとらないように処理を施す操作のことを二値化といいます
二値化処理を施した結果、画像は白と黒の2色だけで表示されます。

【二値化処理を施す目的】

画像の中に写っている様々なものを自分が注目している領域 (前景) とその他の背景に区別するために二値化処理を施します。単純には、領域を2つに分けることによって前景の数や面積、形態の測定などの画像処理が達成できます。

【簡単な二値化処理】

簡単な二値化処理には以下のようなものがあります。

*Percentile法

画像の中の2値化したい領域において、輝度値を昇順または降順に並べた場合の上位または下位x%を閾値として指定する手法です。例えば50パーセンタイルと指定すると、輝度値のヒストグラムで画素値が0をとるピクセルの数と1をとるピクセルの数がちょうど1:1になる輝度値tが閾値として設定されます。

*大津の二値化法 (Otsu)

画像を輝度ヒストグラムで表したときに、前景のピークと背景のピークの間で閾値tを決める手法です。輝度ヒストグラムをある閾値t で2つに分割したとき、2つのピークの分散 (広がり) が最も大きくなるような閾値を算出します。

【ImageJで二値化処理を施す方法】

それでは二値化処理をImageJで施す操作方法を見ていきましょう。

今回はImageJサンプル画像のEmbryos (42K) を用いて二値化処理を施した後、細胞数をカウントするという操作を紹介します。この画像は数える対象となる細胞が暗く、背景の方が明るいという特徴があるので、Process→Binary→Options にある "Black Background" (背景を黒に) のチェックを外した状態で説明します (*次回の記事で詳しく説明します)。

1、
File→Open Sample→Embryos (42K) を開きます。
2、
グレースケール画像に変換する必要があるので、Image→Type→8bitを選択します。
3、
Image→Adjust→Thresholdを選択します。

ここではOtsu法を試してみます。

下図のように白と黒の2色の画像に変換されます。

4、
二値化処理を施した画像を用いて、細胞数の測定を実行してみましょう。細胞の粒子解析を実行するために画像中の細胞の面積を測定します。サンプル画像にはツールバーが表示されているのでまずツールバーの長さを測定します。ここでは100 μm = 472 pixelsに相当します。

5、
Analyze→Set Scaleをクリックし、下記のように数値を設定します。

6、
次に黒で表示された部分のうち、細胞と細胞でない部分を区別するために細胞の面積を測定します。メニューバーにあるWandツールを選択し、黒で表示された細胞をクリックすると細胞の輪郭が選択された状態になります (拡大図)。

7、
Measureをクリックして面積を表示させます。これをいくつかの細胞について実行し、細胞のおおよその大きさを調べます。

また、細胞以外の黒い小さな点についても同様にして面積を求めておきます。

面積の測定結果から細胞とそれ以外を分ける大きさの範囲を「5 μm2よりも大きい」と設定します。
8、
細胞質の色が白になっている細胞については1個として適切にカウントされない可能性があります。そこで [Fill Holes] の処理を行い、白くなっている部分を黒く塗りつぶします。

9、
さらに隣り合う細胞を区別してカウントされるように [Watershed] の処理を行います。 この処理を実行すると隣接した細胞を分割することができます。

10、
Analyze→Analyze Particlesを選択します。Sizeを5 μm2-infinity、Circularity (真円率 0.00-1.00) 、Show: Outlines、Summarizeにチェック☑を入れOKをクリックします。

※真円率とは・・・真円のときが1.0で1.0より小さな値をとるほど円形から遠ざかることを意味する数値です。
11、
どの細胞を数えたかを示した画像、および細胞数の計測結果を示すSummaryが出力されます。

【マクロ言語を用いて二値化を施す】

ここでは ≪パターン①≫ Otsu法による自動二値化と ≪パターン②≫ 固定値を閾値とした二値化のスクリプトを紹介します。また画像には対象物が黒、背景が白のものと対象物が黒で背景が白のものがあります。今回の記事では、どちらの画像に対してもProcess→Binary→Options にある “Black Background” (背景を黒に) のチェックを外した状態で説明します (*次回の記事で詳しく説明します)。
≪パターン①≫ Otsu法による自動二値化

◆対象物が黒、背景が白

※上記のスクリプトでは細胞の大きさの範囲やスケールについてあらかじめ既知であるとして記述しています。スケールの設定をしないときは細胞の面積の指定はピクセル単位 (pixels) になるためrun ("set Scale..."以降のスクリプトは以下のようになります。細胞以外の黒い小さな点を測定すると20 pixels程度になるため、粒子の面積の範囲を100-infinity (単位; pixels) と設定します。結果は34個になるのでスケールを設定した場合と同じになります。

◆対象物が白、背景が黒

(サンプル画像Fluorescent Cells(RGB画像)をSplit Channelで赤、緑、青に分けたときの青の画像)

≪パターン②≫ 固定値を閾値とした二値化

撮像環境が整っている条件下で取得した画像を用いるときは、ある固定された輝度値を閾値としてその閾値よりも高い輝度値を示すピクセルを255、低い輝度値を示すピクセルを0に置き換えていくことによって二値化を施すことがあります。下記の太字で記述した部分で閾値を128と設定し二値化を施しています。 (以降のスクリプトはパターン①と同じです)



◆対象物が黒、背景が白

※1 for文については前回の記事を参照 シリーズ3.ImageJマクロ言語を用いた画像解析~①輝度の統計量 ~

※2 if文は()内の条件が検討されそれが真のときに{命令文}が実行され、偽のときは何も実行されないことを示す構文です。

if文(条件){

命令文

}



※3 if文はelse文とセットでなくても用いることが可能ですが、if文を複数回実行する必要がある場合にif (条件) {命令文}を2回以上記述するかわりにelse文が用いられます。if/else命令文の書き方は以下のようになります。

if (条件) {

命令文1

}else{

命令文2

}

ifの後の()内の条件が検討され、それが真のときは{命令文1}が実行され偽のときは{命令文2}が実行されることを意味します。ここでは閾値Thr=128よりも輝度値が小さいときは0に、そうでないときは1に置き換えるという命令文になります。



※4 ここでの二値化は以下のようなイメージをもつと理解しやすいと思います。

for文が二重に用いられているときは内側に書かれているfor文内の命令文から処理されます。つまり、y座標が0のままでx座標のみが画像の横幅まで1つずつ増えていき、各ピクセルの輝度値が閾値128よりも大きい場合は1、小さい場合は0に輝度値が置き換えられていくことを表しています。x座標が画像の横幅の最後まで到達すると、y座標が0から1になり、同じようにx座標が (0, 1), (1, 1), (2, 1)・・・(width, 1) まで処理されます。この処理を (0, hight), (1, hight), (2, hight)・・・(width, hight) まで繰り返すことによって二値化処理が施されます。

【まとめ】

ImageJで二値化を施す方法とマクロ言語での書き方が理解できたでしょうか。

今回は前回の記事で学習したfor文に加え、if/else文の書き方、細胞数などの計測に用いられる粒子解析の手法を学びました。粒子解析は数、面積および形態を自動的に取得することができるため、研究分野でよく用いられます。

次回は本文中でも予告したように二値化処理-2としてImageJにおける背景色の設定と二値化の関係について詳しく説明します。