バイオ系だけどプログラミング始めました

ImageJ (Fiji)の使い方や Python でのプログラミングなどを、主にバイオ系の研究者・大学院生向けに書いていこうと思います。

ImageJ で米粒(細胞)を数えて解析しよう。

目次

 

 

概要

ImageJ には色んな機能がありますが、一方で使い始めたばかりの時はコマンドの多さに圧倒されてしまいます。目的の解析をするためにいったいどのコマンドを選べばいいのかよくわからない状態になりがちです。

そこで、この投稿では「米粒の数を数える」「それぞれの米粒の大きさ・輝度・形の情報を定量的に解析する」という作業を通して ImageJ の機能を体験してもらおうと思います。

今回は例として米粒を解析しますが、米粒を細胞に置き換えればあなたの研究に応用できるかもしれません。

今回の解説は ImageJ Fiji で行うことを前提に書いています。Fiji について、Fiji のインストールについてはこちら。

ImageJ Fiji のインストールと Fiji - バイオ系だけどプログラミング始めました

 

 

 

米粒の画像を開く

 EMBL > Samples > rice.tiff で開けます。

f:id:shatoshi:20170612181622j:plain

サンプル画像を開くためにはネットに接続している必要があります。

閾値を決める

 ピクセルの輝度値をもとにして閾値(Threshold)を決めます。この Threshold よりも明るい(=輝度値が高い)所と暗いところに分けます。この作業を二値化と言います。二値化をすることで、コンピュータにモノを認識させやすくすることができます。

f:id:shatoshi:20170611233749j:plain

Image > Adjust > Threshold で Threshold window が出ます。

f:id:shatoshi:20170612005830j:plain

Threshold window の一番上のグラフがピクセル値のヒストグラムで、横軸がピクセルの輝度値、縦軸がピクセルの個数になります。なんとなく複数の山のガウス分布っぽい感じになっているのが分かります。

暗い背景に明るいモノがあるか、明るい背景に暗いものがあるのかを Dark Background  をチェックして選択します。このお米の画像は黒い背景に白いお米が映っているので Dark Background にチェックを入れます。

Methods から閾値の決定の仕方のアルゴリズムを選んで(キャプチャの Default の部分から選ぶ)、Auto を押すとピクセルの値の分布をもとに自動的に閾値を設定してくれます。その右のRedとなっている部分は、その閾値で選択される部分を赤色で示すって設定で、他の色にすることもできます。

 

上のバーをスライドさせることで自分で決めた閾値を設定することもできます。しかし、全体的なバックグラウンド明るさや、認識したい物体の輝度は、観察するときの光源の強さだったり、染色の仕方などで変化しやすいです。そういった場合、自分で閾値を決める際に毎回手で値を決定するのは面倒ですし、恣意性が強くなってしまいます。なので、閾値を決めるアルゴリズムを色々試してみて、自分のサンプルに適したアルゴリズムを用いるのが一番良いと思います。Method が多すぎてどのアルゴリズムを使えばいいかわからないって時には、Image > Adjust > Auto Threshold で Try all を選んで OK を押せば、どの Method で threshold 決めればどういう見た目になるのかを全部表示してくれます。

 

Set を押すと画像に閾値を設定することができます(Reset でもとに戻せます)。Apply を押すと、閾値を元に白黒(0 or 255)の画像に変換します(このとき元の画像は失われてしまうので注意)。

キャプチャでは、黒い背景に白い物体がある(白いピクセルピクセル値の高さにあたるb)という前提で、ImageJ の Defaut の手法でピクセル値の分布を元に閾値を決定しています。

f:id:shatoshi:20170612140025j:plain

キャプチャを見ると、上の方のお米の部分は赤くなっていて選択されていますが、画像の下の方は全体的に暗い(ピクセルの輝度値が低い)せいで、正しくお米と背景の部分が選択されていません。右の Plot of rice のウィンドウは rice.tiff の青い縦線で選択した部分のピクセルの値をプロットしたグラフになります(選択ツールで直線を引いて、Analyze > Plot Plofile)。これを見ると明らかに下の方が暗いですね

でも、ちゃんと下のお米も正しく認識したいですよね。では、どうすればいいのか?そこでバックグラウンドの減算をしましょう。

 

バックグラウンドの減算

 画像データのピクセルの値というのは、同じ条件で測定したつもりでもサンプルや光源の状態によりかなり変化します。また、上のキャプチャ画像のように画像の上の方と下の方で輝度値に差がある場合も少なくないです。そこで用いるのが Subtract Background です。

Process > Subtract Background で開けます。

 

f:id:shatoshi:20170612141244j:plain

左のウィンドウの画像が元の画像で、真ん中のウィンドウの画像に Subtract Background を適用しています。このバックグラウンドの減算は、画像を3Dとして見立てて、その表面の裏側からボールを転がすことで背景の値というのを計算しています。下のような図をイメージしてもらえればいいです。

f:id:shatoshi:20170612144033j:plain

これを三次元の面の上で行う感じです。なので、このボールの半径を物体の大きさよりも小さくしてしまうと、お米が背景として減算処理されてしまいますし、半径を大きくし過ぎると画像の背景が均一でなくなる可能性があります。Preview にチェックを入れて、ちょうどいい値を入れるのがいいでしょう。詳しい原理等は下のリンクを参考にしてください。

Subtract background [ImageJ Documentation Wiki]

 

お米の画像に対して、ボールの半径を40にしてバックグラウンドの減算をした例がこちらになります。

f:id:shatoshi:20170612145606j:plain

全体的な輝度値のムラがなくなり、お米と背景を、閾値を決めることできちんと分けられていることが分かると思います。

米粒のカウントと定量的解析

 次はこのお米を数えて、定量的に解析しましょう。

閾値を Set して、OK を押します。この閾値で選んだ部分を解析するには、Analyze > Analyze Particles を使います。

f:id:shatoshi:20170612151405j:plain

Size はどれくらいの大きさの粒子を解析対象にするか?Circularity は、どれぐらい真円に近い粒子を解析対象にするか(4π *(面積)/(周囲の長さの二乗)、得真円だと1になる)?という設定になります。

あとは解析の色々なオプションをチェックボックスから選びます。とりあえず、上のキャプチャの設定で適当に解析してみましょう。

f:id:shatoshi:20170612152552j:plain

こんな感じになりました。Results のところに、面積、画像の中心、画像の重心、X、Y 方向の長さ、などが出力されています。この結果は、Excel のファイル形式や csv 形式で出力できます(File > Save as > 拡張子を変えると保存形式を変えることができます。個人的には csv file がいいと思います)。解析したい値については、Analyze > Set Measurement で選ぶことができます。

f:id:shatoshi:20170612154649j:plain

色々解析する値がありますが、試しに上の四つを解析対象にしましょう。それぞれ、面積、領域内の平均のピクセルの値、重心、楕円フィット(対象を楕円とみなしたときの長軸・短軸・長軸の傾き)になります。

 

また、Roi Manager が起動して画像に番号が出てきていると思います。Roi とは Region of Interest のことで、直訳すると関心のある領域になります。Roi Manager を用いると、この Roi で選んだ部分を再度解析したり、解析したのは画像のどの部分なのかを確認したり、Roi の部分を塗りつぶしたりといったことが可能になります。また、この Roi も保存することがで、ドラッグアンドドロップで開くことができます。後で解析結果を見直すために、解析結果と一緒に保存しておくのが良いでしょう。

出力された結果を見ると、画面の端にあって見切れているお米も解析対象に含まれています。こういったお米が解析結果に含まれると面積の定量等に支障をきたすので、除外したいですよね。そういった場合には、Analyze Particles で Exclude on edges にチェックを入れます。また、一ピクセルしかないノイズを拾ってきてしまっている所もあります。これは、size で適切な値を入れてはじきましょう。

f:id:shatoshi:20170612155210j:plain

OKを押して解析すると次のようになります。

f:id:shatoshi:20170612155243j:plain

上手いこと、お米を認識して、測定ができていると思います。ただ、5番目と32番目のお米は、二つのお米が一つのお米として認識されています。Roi マネージャーを使うことで解析後に、そういう変な解析結果が紛れ込んでいるというのを確認することができます。

また、このような一つのお米として認識された二つのお米を、ちゃんと二つのお米として分ける方法があります。閾値の決定で二値化(Apply を押して 0 or 255 の画像に)した後で、Process > Binary > Watershed(分水嶺の意味)で二つに分けることができます( Binary [ImageJ Documentation Wiki] )。ただ、この二値化した画像からはピクセルの輝度値の情報を読み取ることができません。なので、Analyze Particles して、Roi Manager にお米領域を追加する > 二値化する前の元の画像を選択性して、Roi Manager の Measure で解析しましょう。後は、解析結果をcsv等に出力して他のソフトで解析しましょう。例えばこんな感じになります(Pythonヒストグラムを描写しました)。

f:id:shatoshi:20170612164654p:plain

 

f:id:shatoshi:20170612164727p:plain

 

この解析を自動で行う Python Script を書きました。少し勉強すればこんなことをできるようになります。

satoshithermophilus.hatenablog.com

 

 謝辞

この投稿は、新学術領域 少数性生物学(平成23-27年)が主催した第3回少数性生物学トレーニングコースで教わった内容を元に記述いたしました。少数生物学の領域の方々、特に ImageJ と Python での解析の実習でお世話になりました三浦先生と新井先生に感謝いたします。