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

matplotlib

はじめに

skimage.measure の label, regionprops_tableで2値画像のラベリングと計測を行い、ラベリングした部分のアスペクト比と円形度を求めて画像上に表示する方法について説明する。

解説

モジュールのインポートなど

バージョン

画像データの作成

画像は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画像ではなく、grayscaleの画像を得る。
生成された画像は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に結果を入れることで見やすい表を得ることができる。

labelareacentroid-0centroid-1major_axis_lengthminor_axis_lengthperimeter_crofton
0137136251.970487329.926029320.764948175.343631933.515218
1214052270.136991851.715983166.762377111.456696483.540211
237770348.000000980.500000128.16655880.820789342.086800
342039320.00000025.00000051.49881750.409012160.082506
452109726.000000617.00000051.82031251.820312161.193226
567537869.336341107.335943108.045189107.434535394.478439
6711368899.500000356.500000226.31836066.962676480.503479
787600962.500000427.500000175.51068357.723479381.905297

アスペクト比と円形度を求める

DataFrameにアスペクト比と円形度を追加する。
アスペクト比は領域の縦横比なので、major_axis_length/minor_axis_lengthで求める値:1となる。
円形度は4π × S/L2 (S = 面積, L = 図形の周囲長)で求まる値で1に近ければ真円に近い形状で、複雑な形状になるほど値が低くなる。

labelareacentroid-0centroid-1major_axis_lengthminor_axis_lengthperimeter_croftonaspect_ratiocircularity
0137136251.970487329.926029320.764948175.343631933.5152181.8293500.535503
1214052270.136991851.715983166.762377111.456696483.5402111.4962080.755236
237770348.000000980.500000128.16655880.820789342.0868001.5858120.834369
342039320.00000025.00000051.49881750.409012160.0825061.0216190.999860
452109726.000000617.00000051.82031251.820312161.1932261.0000001.019983
567537869.336341107.335943108.045189107.434535394.4784391.0056840.608642
6711368899.500000356.500000226.31836066.962676480.5034793.3797690.618730
787600962.500000427.500000175.51068357.723479381.9052973.0405420.654805

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

円形度を画像上に表示

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

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

参考

skimage.draw — skimage 0.22.0 documentation
skimage.measure — skimage 0.22.0 documentation

コメント