[scikit-image] 93. ラベリングした部分のアスペクト比と円形度を求めて表示

matplotlib

はじめに

本記事では、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

アスペクト比を画像上に表示

円形度を画像上に表示

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

まとめ

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

参考

skimage.draw — skimage 0.25.2 documentation
skimage.measure — skimage 0.25.2 documentation

コメント