[matplotlib] 112. クリックイベントでラベル画像のregionprops情報を表示

jupyter notebook, lab

はじめに

matplotlibのbutton_press_eventで、skimageのlabelで作成したlabel画像上の各ラベル情報を画像の横に表示する方法について説明する。

コード&解説

モジュールのインポート

バージョン

画像データの作成

1024 x 1024の2Dデータのランダムな位置に点を作成して、ガウシアンフィルターをかけた画像を用いる。threshold_otsuで大津の2値化を行い、閾値を求めて2値化する。2値化の端に接しているものはclear_borderで除去しておく。

画像を表示

生成した画像は以下のようになる。

ラベリング

skimageのlabelでラベル付けを行う。ラベル像の背景は0となり、画像を表示した時に見にくくなるので、floatに変換してから、0をnp.nanに変換する。ラベル像を表示すると下のようになる。

regionprops_tableでラベルの各種情報をDataFrameで取得

regionprops_tableでラベルの情報を取得する。取得した情報はそのままpandasのDataFrameとすることができ、下のようなTableが得られる。

labelcentroid-0centroid-1areaequivalent_diameterbbox-0bbox-1bbox-2bbox-3
0130.208041725.370772156744.667285670454748
1257.241617441.379383521981.5170972337891494
23101.108303928.963899138541.99329481908123951
34184.762435851.0283609168108.04193788797292890
45147.500000597.000000343666.142657106556190639
56172.625239284.09769112560126.459040112216238362
67364.404686418.89779753345260.616507195192536585
78222.029594791.613214145343.011825201770244814
89263.214478218.805863334365.241396228189299249
910255.175529714.618834156144.581688232693280736
1011299.49229774.433473142842.6401932795432196
1112331.690119721.2325209139107.870924288619387817
1213407.649929895.445545141442.430658387875429917
1314415.00688747.923554145242.9970213942743870
1415488.127493716.58182712887128.094645404615564795
1516598.818444456.35272624648177.151936526255684636
1617588.215704203.824593337565.552906552174626235
1718607.021014112.094928138041.91742658791629134
1819708.909523773.18441016203143.632518645680789852
1920682.09413554.043447138141.9326106613470476
2021720.035688146.964312137341.810978700126742168
2122771.388794436.85451811101118.887477706381841511
2223765.758831286.270097328464.663117736252797322
2324778.234241600.765759139642.159725758580800622
2425792.167994963.973208138141.932610772944814985
2526824.944483772.348184145943.100539803751847794
2627830.837456229.233922141542.445659810208853251
2728835.731739547.392372154744.381320813526861569
2829925.492110925.53650612231124.7917988538439911007
2930890.685933636.711003143642.759467870616913659
3031896.087719554.881092153944.266417872534920577

GridSpecによるFigの作成

GridSpecでFigを作成する。GridSpecについては下記記事で解説した。ax2,ax3,ax4の軸などは非表示としている。

[matplotlib] 10. グラフを作成する様々な方法(subplot, add_subplot, subplots, GridSpec)
matplotlibでひとつのグラフまたは複数グラフを表示する方法について説明する。

ラベル像とテキストを表示する準備

情報を表示する部分には、薄い文字でLabel、Centroid、Areaと表示する。ax1にラベル像を表示し、ax2、ax3、ax4には何も表示しないテキストを配置しておく。

クリックした時の処理

最初にlabel_image_fのnp.nanの部分をクリックした時の処理として、情報を表示するテキストをからにするようにする。

クリックしたラベルの値はlabel_image_f[int(np.rint(event.ydata)),int(np.rint(event.xdata))]で得ることはできるので、このラベル値を使ってregionprops_tableのDataFrameから重心(centroid)と面積(area)の情報を取得する。所得した値はset_textで図上に表示する。

イベントの有効化

fig.canvas.mpl_connect(‘button_press_event’, onclick)でマウスクリックイベントを有効にできる。
コメントアウトしてある部分の処理を実行することで無効となる。

実際に操作した感じは下のようになる。

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

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

参考

Module: measure — skimage v0.20.0.dev0 docs
Event handling and picking — Matplotlib 3.4.3 documentation

コメント