[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に結果を入れることで見やすい表を得ることができる。

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/L2 (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ファイル)

参考

skimage.draw — skimage 0.23.1 documentation
skimage.measure — skimage 0.23.1 documentation

コメント