はじめに
本記事では、scikit-imageライブラリを使用して2値画像に対してラベリングを行い、各領域のアスペクト比と円形度を計算して画像上に表示する方法について解説します。skimage.measureモジュールのlabel関数とregionprops_table関数を活用した画像解析手法を紹介します。
解説
モジュールのインポートなど
バージョン
画像データの作成
画像はskimage.drawモジュールのrandom_shapes関数を使用して作成します。
image_shapeを(1024,1024)に設定し、min_shapes=10とmax_shapes=10のパラメータで10個の図形を生成します。min_size=50、max_size=200を指定することで、各図形のバウンディングボックスのサイズ範囲を定義できます。
allow_overlap=Trueを設定して図形同士の重なりを許可し、multichannel=Falseでカラー(RGB)ではなくグレースケール画像を生成します。
生成された画像はlabels変数で確認できます。
作成した画像を表示すると以下のようになります。

画像の2値化
imageのdtypeはuint8であるため、image < 255を使って背景とオブジェクトを分離できます。
処理後の画像は以下のように表示されます。

2値化像のラベリング
label関数を使用して2値化画像にラベル付けを行います。背景を透明にするため、値が0の箇所をnp.nanに置き換えます。処理後の画像は以下のように表示されます。

regionprops_tableによるラベリング領域の情報の取得
regionprops_tableを使用して、ラベル画像の各領域から様々な情報を取得できます。ここでは以下の情報を抽出します:
- ‘label’:ラベル番号
- ‘area’:面積
- “centroid”:重心の座標
- “major_axis_length”:楕円近似した際の長軸の長さ
- “minor_axis_length”:楕円近似した際の短軸の長さ
- “perimeter_crofton”:周囲長
これらの結果をpandasのDataFrameに格納することで、整理された見やすい表を作成できます。
label | area | centroid-0 | centroid-1 | major_axis_length | minor_axis_length | perimeter_crofton | |
---|---|---|---|---|---|---|---|
0 | 1 | 37136 | 251.970487 | 329.926029 | 320.764948 | 175.343631 | 933.515218 |
1 | 2 | 14052 | 270.136991 | 851.715983 | 166.762377 | 111.456696 | 483.540211 |
2 | 3 | 7770 | 348.000000 | 980.500000 | 128.166558 | 80.820789 | 342.086800 |
3 | 4 | 2039 | 320.000000 | 25.000000 | 51.498817 | 50.409012 | 160.082506 |
4 | 5 | 2109 | 726.000000 | 617.000000 | 51.820312 | 51.820312 | 161.193226 |
5 | 6 | 7537 | 869.336341 | 107.335943 | 108.045189 | 107.434535 | 394.478439 |
6 | 7 | 11368 | 899.500000 | 356.500000 | 226.318360 | 66.962676 | 480.503479 |
7 | 8 | 7600 | 962.500000 | 427.500000 | 175.510683 | 57.723479 | 381.905297 |
アスペクト比と円形度を求める
DataFrameにアスペクト比と円形度を追加します。アスペクト比は領域の縦横比であり、major_axis_length/minor_axis_lengthで計算され、値:1となります。円形度は4π × S/L² (Sは面積、Lは図形の周囲長)で計算される値で、1に近いほど真円に近い形状を示し、形状が複雑になるほど値が小さくなります。
label | area | centroid-0 | centroid-1 | major_axis_length | minor_axis_length | perimeter_crofton | aspect_ratio | circularity | |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 37136 | 251.970487 | 329.926029 | 320.764948 | 175.343631 | 933.515218 | 1.829350 | 0.535503 |
1 | 2 | 14052 | 270.136991 | 851.715983 | 166.762377 | 111.456696 | 483.540211 | 1.496208 | 0.755236 |
2 | 3 | 7770 | 348.000000 | 980.500000 | 128.166558 | 80.820789 | 342.086800 | 1.585812 | 0.834369 |
3 | 4 | 2039 | 320.000000 | 25.000000 | 51.498817 | 50.409012 | 160.082506 | 1.021619 | 0.999860 |
4 | 5 | 2109 | 726.000000 | 617.000000 | 51.820312 | 51.820312 | 161.193226 | 1.000000 | 1.019983 |
5 | 6 | 7537 | 869.336341 | 107.335943 | 108.045189 | 107.434535 | 394.478439 | 1.005684 | 0.608642 |
6 | 7 | 11368 | 899.500000 | 356.500000 | 226.318360 | 66.962676 | 480.503479 | 3.379769 | 0.618730 |
7 | 8 | 7600 | 962.500000 | 427.500000 | 175.510683 | 57.723479 | 381.905297 | 3.040542 | 0.654805 |
アスペクト比を画像上に表示

円形度を画像上に表示

まとめ
本記事では、scikit-imageライブラリを用いて2値画像のラベリングを行い、各領域のアスペクト比と円形度を計算して可視化する方法を解説しました。skimage.measureモジュールのlabel関数とregionprops_table関数を組み合わせることで、画像内の各オブジェクトの形状特性を効率的に分析できることが分かりました。この手法は物体検出や形状分析など様々な画像処理タスクに応用可能です。
コメント