はじめに
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ファイル)
コメント