[matplotlib] 113. ラベル画像のクリックイベントでラベルと元画像を拡大して表示

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 7.181818 900.636364 11 3.742410 4 900 11 902
1 2 98.048084 833.402358 11875 122.962269 22 762 180 898
2 3 169.329478 628.534807 40121 226.016910 29 436 281 842
3 4 223.166012 988.172888 1018 36.002192 203 969 244 1008
4 5 278.717608 392.896535 2107 51.794939 251 364 305 423
5 6 320.153846 891.466268 4017 71.516454 266 851 358 939
6 7 322.887612 687.623563 6264 89.306061 268 648 378 728
7 8 319.133052 530.592968 3555 67.278277 283 499 355 565
8 9 333.917015 429.939701 3350 65.309666 292 389 376 468
9 10 316.447531 159.480453 972 35.179381 303 138 330 181
10 11 402.705808 530.060606 792 31.755405 389 511 418 550
11 12 448.104914 731.160386 3317 64.987195 396 708 499 757
12 13 447.046938 188.207078 3984 71.222092 401 147 503 238
13 14 427.990085 456.473088 1412 42.400640 407 436 450 478
14 15 528.267075 66.919785 11918 123.184694 444 17 636 116
15 16 546.451798 576.830110 12873 128.025047 461 493 673 686
16 17 488.006569 888.226462 3197 63.800837 461 850 519 933
17 18 585.722155 348.092142 23236 172.002890 499 212 682 502
18 19 579.878111 824.479262 5907 86.723849 537 778 622 877
19 20 605.535294 142.758824 170 14.712264 598 133 614 154
20 21 635.350292 735.399500 1199 39.071911 618 715 654 757
21 22 671.596386 927.879518 1328 41.120094 652 908 692 949
22 23 678.788516 177.692439 1759 47.324712 661 139 697 210
23 24 761.076837 618.427891 16177 143.517233 678 550 895 722
24 25 721.062047 440.810709 3175 63.580937 691 404 750 476
25 26 783.972820 839.840091 4415 74.975680 734 798 841 869
26 27 823.599375 740.441222 4483 75.550863 784 697 864 785
27 28 864.355526 837.046605 751 30.922531 843 816 881 855
28 29 933.688589 705.718927 5109 80.653461 879 670 986 741
29 30 945.166023 769.338996 1295 40.605975 924 752 968 788

Figの作成

画像を表示するaxを3こ並べて、左に固定のラベル画像、中央に拡大するラベル像、右に拡大する元画像とする。初期状態として、フルスケールの画像を表示しておく。

クリックした時の処理

最初にlabel_image_fのnp.nanの部分をクリックした時の処理として、ax[1]とax[2]を消して、最初の画像を表示するようにする。

クリックしたラベルの値はlabel_image_f[int(np.rint(event.ydata)),int(np.rint(event.xdata))]で得ることはできるので、このラベル値を使ってregionprops_tableのDataFrameからbbox(バウンディングボックス:ラベルを囲む長方形の枠線)の位置を取得する。

label_image_f[minr:maxr,minc:maxc]のようにラベルイメージをバウンディングボックスの座標で切り取る。元画像も同様に切り取る。
切り取った画像は既にある画像をax.cla()で消して、imshowで表示する。

イベントの有効化

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

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

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

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

参考

skimage.measure — skimage 0.23.2rc2.dev0 documentation
https://matplotlib.org/stable/users/event_handling.html

コメント