[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が得られる。

label centroid-0 centroid-1 area equivalent_diameter bbox-0 bbox-1 bbox-2 bbox-3
0 1 30.208041 725.370772 1567 44.667285 6 704 54 748
1 2 57.241617 441.379383 5219 81.517097 23 378 91 494
2 3 101.108303 928.963899 1385 41.993294 81 908 123 951
3 4 184.762435 851.028360 9168 108.041937 88 797 292 890
4 5 147.500000 597.000000 3436 66.142657 106 556 190 639
5 6 172.625239 284.097691 12560 126.459040 112 216 238 362
6 7 364.404686 418.897797 53345 260.616507 195 192 536 585
7 8 222.029594 791.613214 1453 43.011825 201 770 244 814
8 9 263.214478 218.805863 3343 65.241396 228 189 299 249
9 10 255.175529 714.618834 1561 44.581688 232 693 280 736
10 11 299.492297 74.433473 1428 42.640193 279 54 321 96
11 12 331.690119 721.232520 9139 107.870924 288 619 387 817
12 13 407.649929 895.445545 1414 42.430658 387 875 429 917
13 14 415.006887 47.923554 1452 42.997021 394 27 438 70
14 15 488.127493 716.581827 12887 128.094645 404 615 564 795
15 16 598.818444 456.352726 24648 177.151936 526 255 684 636
16 17 588.215704 203.824593 3375 65.552906 552 174 626 235
17 18 607.021014 112.094928 1380 41.917426 587 91 629 134
18 19 708.909523 773.184410 16203 143.632518 645 680 789 852
19 20 682.094135 54.043447 1381 41.932610 661 34 704 76
20 21 720.035688 146.964312 1373 41.810978 700 126 742 168
21 22 771.388794 436.854518 11101 118.887477 706 381 841 511
22 23 765.758831 286.270097 3284 64.663117 736 252 797 322
23 24 778.234241 600.765759 1396 42.159725 758 580 800 622
24 25 792.167994 963.973208 1381 41.932610 772 944 814 985
25 26 824.944483 772.348184 1459 43.100539 803 751 847 794
26 27 830.837456 229.233922 1415 42.445659 810 208 853 251
27 28 835.731739 547.392372 1547 44.381320 813 526 861 569
28 29 925.492110 925.536506 12231 124.791798 853 843 991 1007
29 30 890.685933 636.711003 1436 42.759467 870 616 913 659
30 31 896.087719 554.881092 1539 44.266417 872 534 920 577

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

参考

skimage.measure — skimage 0.23.0rc0.dev0 documentation
https://matplotlib.org/stable/users/event_handling.html

コメント