科学的研究や工業分野で、精密な画像解析が必要とされる場面は多々あります。ImageJはそのようなニーズに応える、非常に便利なツールです。特に形状分類や検出は、生物学の細胞計測から材料科学の粒子分析まで、幅広い応用があります。
前回の記事でPython (Jython) を利用したコロニーカウントの方法を紹介しました。今回はImageJ (Fiji) の機能を使って、カウントしたコロニーに対してどのような形状や大きさをしているかについて分類する方法について紹介します。
Windows 11(22H2), ImageJ 1.54f
形状分類について
形状分類(Shape Classification)は、さまざまな形状を識別し、分類するプロセスです。これは、コンピュータビジョン、パターン認識、機械学習などの分野で広く使用されています。形状分類の目的は、画像や物体内の特定の形状を識別し、それらを事前に定義されたカテゴリに分類することです。このプロセスは以下のステップで構成されます。
- データ収集と前処理: 形状を含む画像や物体のデータセットを収集し、ノイズの除去やサイズの調整などの前処理を行います。
- セグメンテーション:前処理された画像は、個々のオブジェクトを識別するためにセグメンテーションされます。
- 特徴抽出:各オブジェクトから形状記述子(面積、周囲長、円形度、アスペクト比、丸み、固体度など)を計算し、形状を識別するために重要な特徴を抽出します。
- 分類と評価: 抽出された特徴を使用して形状を分類し、例えば機械学習(ニューラルネットワーク、サポートベクターマシンなど)を利用し分類の制度を評価します。
形状分類は、医療画像の解析、工業的な品質検査、監視システム、ロボティクス、デジタルアートなど、多くの分野で応用されています。
Fijiでの形状分類について
今回はFijiを使って形状記述子を計算していきます。Fijiでは特に面積、周囲長、円形度(Circularity)、アスペクト比(Aspect Ratio)、丸み(Roundness)、固体度(Solidity)が計算できます。これらの記述子の詳細は以下の通りです。
- 面積: オブジェクトのピクセル数をカウントします。これは、オブジェクトの大きさを測定する最も基本的な方法です。
- 周周:ブジェクトの境界線の長さを測定します。これは、オブジェクトの複雑さや形状を理解するのに役立ちます。
- 真円度(Circularity):
4π × (面積)/(円周)^2
オブジェクトが完全な真円にどれだけ近いかを評価します。この値が1に近いほど、オブジェクトは円形に近いことを意味します。 - アスペクト比(Aspect Ratio):
(長軸)/(短軸)
オブジェクトの長さと幅の比率を評価します。これは、オブジェクトの形状と方向性を理解するのに役立ちます。 - 丸み(Roundness):
4 × (面積)/{π × (円周)^2}
オブジェクトがどれだけ丸いかを評価します。この値が大きいほど、オブジェクトはより丸みを帯びていることを意味します。 - 固体度(Solidity):
(面積)/(凸包の面積)
この値は、オブジェクトがどれだけ凹凸が少ないか、すなわち凸形(convex)にどれだけ近いかを評価します。固体度が高いほど、オブジェクトは凸形に近いと言えます。例えば、星形や月形などの凹みを持つ形状は、固体度が低くなります。一方で、円形や四角形などの凹みのない形状は、固体度が高くなります。
Fijiによる形状分類の方法
前回の記事では、Jythonでサンプル画像Cell_Colony.jpgのコロニーカウントを行いました。
この続きの処理としてカウントしたそれぞれのコロニーに対して形状記述子の計算を行います。
まず前回と同様にFile>New>Text Window
からテキストウィンドウを開き、Language>Python(Jython)
でPythonを入力できるように準備します。
プログラムを実行する
それでは、以下のコードを入力し、「Run」もしくはCtrl+R (MacではCommand)を押し実行します。
# @ImageJ ij
from ij import IJ
from ij.plugin.filter import ParticleAnalyzer
from ij.measure import ResultsTable, Measurements
from java.lang import Double
# サンプル画像を開く
image = IJ.openImage("http://imagej.nih.gov/ij/images/Cell_Colony.jpg")
image.show()
# 画像の二値化
IJ.setAutoThreshold(image, "Default dark")
IJ.run(image, "Convert to Mask", "")
# ノイズ除去
IJ.run(image, "Median...", "radius=2")
# 画像の反転
IJ.run(image, "Invert", "")
# 粒子解析と形状記述子の計算
min_size = 10 # 最小サイズ
max_size = 1000 # 最大サイズ
measurements = Measurements.AREA + Measurements.PERIMETER + Measurements.SHAPE_DESCRIPTORS
results = ResultsTable()
pa = ParticleAnalyzer(ParticleAnalyzer.SHOW_RESULTS + ParticleAnalyzer.INCLUDE_HOLES, \
measurements, results, min_size, max_size)
pa.analyze(image)
# 結果の詳細表示
for i in range(results.getCounter()):
area = results.getValue("Area", i)
perimeter = results.getValue("Perim.", i)
circularity = results.getValue("Circ.", i)
aspect_ratio = results.getValue("AR", i)
roundness = results.getValue("Round", i)
solidity = results.getValue("Solidity", i)
IJ.log("Colony " + str(i+1) + ": Area=" + str(area) +
", Perimeter=" + str(perimeter) +
", Circularity=" + str(circularity) +
", Aspect Ratio=" + str(aspect_ratio) +
", Roundness=" + str(roundness) +
", Solidity=" + str(solidity))
実行結果
以下のような2つのウィンドウが表示されれば成功です。
この結果をcsvファイルなどで出力すれば、エクセルやその他ソフトで解析にまわすことも可能です。
コードの解説
このコードを解説すると以下の通りです。
1. モジュールのインポート
# @ImageJ ij
from ij import IJ
from ij.plugin.filter import ParticleAnalyzer
from ij.measure import ResultsTable, Measurements
from java.lang import Double
from ij import IJ
: ImageJライブラリからIJクラスをインポートします。IJクラスはImageJの機能へのアクセスを提供します。from ij.plugin.filter import ParticleAnalyzer
: 粒子分析用のクラスをインポートします。from ij.measure import ResultsTable, Measurements
: 測定結果を格納するためのクラスと、使用する測定値の種類を指定するためのクラスをインポートします。from java.lang import Double
: JavaのDoubleクラスをインポートします。
2. 画像の読み込みと表示
# サンプル画像を開く
image = IJ.openImage("http://imagej.nih.gov/ij/images/Cell_Colony.jpg")
image.show()
IJ.openImage(url)
: 指定されたURLから画像を読み込みます。image.show()
: 画像を表示します。
3. 画像の前処理
# 画像の二値化
IJ.setAutoThreshold(image, "Default dark")
IJ.run(image, "Convert to Mask", "")
# ノイズ除去
IJ.run(image, "Median...", "radius=2")
IJ.setAutoThreshold(image, "Default dark")
: 画像を自動的に二値化(黒と白のみの画像に変換)します。IJ.run(image, "Convert to Mask", "")
: 二値化された画像をマスク(処理を行う領域を指定する画像)に変換します。IJ.run(image, "Median...", "radius=2")
: メディアンフィルターを使用してノイズを除去します。
4. 画像の反転
# 画像の反転
IJ.run(image, "Invert", "")
IJ.run(image, “Invert”, “”): 画像の色を反転します。これは、粒子分析のために通常必要です。
5. 粒子分析
# 粒子解析と形状記述子の計算
min_size = 10 # 最小サイズ
max_size = 1000 # 最大サイズ
measurements = Measurements.AREA + Measurements.PERIMETER + Measurements.SHAPE_DESCRIPTORS
results = ResultsTable()
pa = ParticleAnalyzer(ParticleAnalyzer.SHOW_RESULTS + ParticleAnalyzer.INCLUDE_HOLES, \
measurements, results, min_size, max_size)
pa.analyze(image)
- ここで設定されたパラメータ(最小サイズ、最大サイズなど)に基づいて、画像内の粒子(ここでは細胞やコロニーなど)を分析します。
- 分析には面積、周囲長、形状記述子などの測定が含まれます。
6. 結果の表示
# 結果の詳細表示
for i in range(results.getCounter()):
area = results.getValue("Area", i)
perimeter = results.getValue("Perim.", i)
circularity = results.getValue("Circ.", i)
aspect_ratio = results.getValue("AR", i)
roundness = results.getValue("Round", i)
solidity = results.getValue("Solidity", i)
IJ.log("Colony " + str(i+1) + ": Area=" + str(area) +
", Perimeter=" + str(perimeter) +
", Circularity=" + str(circularity) +
", Aspect Ratio=" + str(aspect_ratio) +
", Roundness=" + str(roundness) +
", Solidity=" + str(solidity))
粒子ごとに得られた各測定値(面積(Area)、周囲長(Perimeter)、円形度(Circularity)、アスペクト比(aspect_ratio)、丸み(Roundness)、固体度(Solidity))を表示します。
最後に
今回はImageJ(Fiji)の形状記述子を利用してコロニーの形を分類する方法を紹介しました。
この方法を利用することで、例えば顕微鏡写真にどのようなものが写っているを評価することができます。
ぜひ、Fijiを利用して画像解析を試していただければと思います。