[scikit-image] 68. ラベリングした領域のデータをregionprops_tableによりpandasのDataFrameで取得する(skimage.measure regionprops_table)

Pandas

はじめに

scikit-imageのregionprops_tableでラベリングした領域の情報を取得できるregionpropsのデータをpandasのDataFrameにする。

コード

labelareacentroid-0centroid-1equivalent_diameter
01565101026.821267
1214231728142.565477
2335754815867.467261
3470377236694.656150
452566026818.054067
561155713870121.304697
676638344729.054394
78116211328338.464326
89320615722763.890578
91018815239615.471556
1011120018531039.088201
11129337230419109.033195
121321202652851.954478
131419225818315.635280
141524027826517.480775
1516334532612065.260909
161719675409163158.275039
17187976352464100.773799
181913493361541.443940
1920168938436246.373501
2021107743140837.030784
212220743725216.234549
22231884532715.471556
2324116648031338.530472
242518847121415.471556
252617447745014.884343
2627178049439847.606369
コードをダウンロード(.pyファイル)コードをダウンロード(.ipynbファイル)

解説

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

画像データの生成

画像データの作成は下記記事と同様に行った。

[matplotlib] 57. plt.imshow()で軸を画像から離して表示
matplotlibのplt.imshowで画像を表示する際に、軸を画像から離して表示する方法について説明する。

画像を表示すると下記のようになる。

バイナリ画像の生成

threshold_otsuで大津の方法により2値化のためのしきい値を得る。
そのしきい値を用いて画像imをバイナリ画像へと変換する。
大津の方法による2値化については下記記事で説明した。

[scikit-image] 50. しきい値処理でグレースケール画像をバイナリ画像に変換
skimage.filtersのthreshold_otsuによるしきい値処理について説明する。

図示すると下記のようになる。

バイナリ画像のラベリング

labelでreturn_numをTrueにすると、ラベル画像と総ラベル数が返り値として得られるので、label_num = label_image[1]で総ラベル数を取得する。

label_imageの0の部分をnp.nanにして表示すると上記のようになる。タイトルに総ラベル数を表示した。

regionprops_tableによるデータの取得

propertiesに取得した項目を設定し、regionprops_tableにラベル画像とプロパティを記述することで辞書形式のデータが得られる。これをそのままpd.DataFrameでデータフレーム化することでTableが得られる。

取得できる項目については下記サイトが詳しい。

Module: measure — skimage v0.17.2 docs

このregionpropsで得られるデータを用いて、ラベルをつけた領域に対して様々な処理ができる。
その例を下記で説明する。

ラベル領域を四角で囲む

面積が1000以上のものを緑四角で囲む。region.bboxにより、4隅の座標を取得する。

ラベル領域の重心に点を表示

面積が1000以上のものの重心に緑点を表示する。region.centroidにより、重心の座標を取得する。

ラベル領域にラベル番号をつける

参考

Module: measure — skimage v0.17.2 docs
Explore and visualize region properties with pandas — skimage v0.18.dev0 docs

コメント