はじめに
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ファイル)
コメント