はじめに
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の軸などは非表示としている。
ラベル像とテキストを表示する準備
情報を表示する部分には、薄い文字で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ファイル)
コメント