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

Pandas

はじめに

scikit-imageのregionprops_tableは、画像処理におけるラベリングした領域の情報を取得し、それをpandasのDataFrameとして扱いやすい形式で提供する機能です。この記事では、画像内のオブジェクトをラベリングし、その各領域の特性(面積、周囲長、中心座標など)を効率的に取得する方法について解説します。

コード

label area centroid-0 centroid-1 equivalent_diameter
0 1 565 10 10 26.821267
1 2 1423 17 281 42.565477
2 3 3575 48 158 67.467261
3 4 7037 72 366 94.656150
4 5 256 60 268 18.054067
5 6 11557 138 70 121.304697
6 7 663 83 447 29.054394
7 8 1162 113 283 38.464326
8 9 3206 157 227 63.890578
9 10 188 152 396 15.471556
10 11 1200 185 310 39.088201
11 12 9337 230 419 109.033195
12 13 2120 265 28 51.954478
13 14 192 258 183 15.635280
14 15 240 278 265 17.480775
15 16 3345 326 120 65.260909
16 17 19675 409 163 158.275039
17 18 7976 352 464 100.773799
18 19 1349 336 15 41.443940
19 20 1689 384 362 46.373501
20 21 1077 431 408 37.030784
21 22 207 437 252 16.234549
22 23 188 453 27 15.471556
23 24 1166 480 313 38.530472
24 25 188 471 214 15.471556
25 26 174 477 450 14.884343
26 27 1780 494 398 47.606369

解説

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

画像データの生成

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

[matplotlib] 57. imshow使用時に軸を画像から離して表示する方法
matplotlibのplt.imshowで画像表示する際に軸を画像から離して配置する方法を解説します。tick_paramsとspinesの設定で軸の位置を調整し、視認性を高めるテクニックを紹介します。

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

バイナリ画像の生成

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

[scikit-image] 50. グレースケール画像のしきい値処理によるバイナリ変換(2値化)
グレースケール画像を二値化するしきい値処理の方法をscikit-imageを使って解説。Otsuのアルゴリズムを活用した自動しきい値決定や、さまざまな閾値設定手法について実践的なPythonコード例と共に紹介します。

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

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

labelでreturn_numオプションをTrueに設定すると、ラベル画像と総ラベル数が返り値として得られます。この場合、label_num = label_image[1]で総ラベル数を取得できます。また、label_imageの0の部分をnp.nanに置き換えて表示すると、上記のような結果になります。タイトルには総ラベル数を表示しました。

regionprops_tableによるデータの取得

まず、propertiesに取得したい項目を設定します。次に、regionprops_tableにラベル画像とプロパティを指定することで辞書形式のデータが得られます。この辞書データをpd.DataFrameに変換するだけで、整理されたテーブル形式のデータが完成します。取得可能な項目の詳細については、下記サイトをご参照ください。

skimage.measure — skimage 0.25.2 documentation

regionpropsで取得したデータを活用して、ラベル付けした領域に対して様々な処理が可能です。以下でその具体例を説明します。

ラベル領域を四角で囲む

面積が1000以上の領域を緑色の四角形で囲みます。region.bboxを使用して、四角形の4隅の座標を取得します。

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

面積が1000以上の領域の重心に緑点を表示します。重心の座標はregion.centroidプロパティから取得できます。

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

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

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

まとめ

scikit-imageのregionprops_tableを使用することで、ラベリングした画像の各領域の特性データをpandasのDataFrameとして簡単に取得できます。これにより、画像内のオブジェクトの特性を分析しやすくなり、データの可視化や統計処理が効率的に行えます。特に複数の領域を含む画像処理において、この機能は非常に有用です。

参考

skimage.measure — skimage 0.25.2 documentation
Explore and visualize region properties with pandas — skimage 0.26.0rc0.dev0 documentation

コメント