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

jupyter notebook, lab

はじめに

この記事では、matplotlibのbutton_press_eventを使用して、skimageのlabelで作成したラベル画像をクリックすると、クリックしたラベルとその元画像を拡大表示する方法について解説しています。画像処理において重要なラベリング結果の詳細確認を効率化する技術を紹介します。

コード&解説

モジュールのインポート

バージョン

画像データの作成

1024 x 1024の2Dデータのランダムな位置に点を作成し、ガウシアンフィルターをかけた画像を使用します。大津の手法を使用するthreshold_otsuで閾値を求めて2値化を行います。画像の端に接しているオブジェクトはclear_border関数で除去します。

画像を表示

生成した画像は以下のようになります。

ラベリング

skimageのlabelを使用してラベル付けを行います。ラベル像の背景は0で、表示すると見にくくなるため、floatに変換してから0をnp.nanに置き換えます。これにより、ラベル像は以下のように表示されます。

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

regionprops_tableを使用してラベルの情報を取得します。取得した情報は直接pandasのDataFrameに変換でき、以下のようなテーブル形式で表示されます。

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の作成

3つのaxを横に並べて配置し、左側に固定のラベル画像、中央に拡大したラベル画像、右側に拡大した元画像を表示します。初期表示では、フルスケールの画像を表示しておきます。

クリックした時の処理

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

まとめ

本記事では、matplotlibのbutton_press_eventを活用して、ラベル画像上のクリックイベントを検知し、選択したラベルとその元画像を拡大表示する方法を解説しました。この技術により、画像処理やラベリング結果の詳細な確認が容易になり、効率的な画像分析が可能となります。Pythonのmatplotlibとskimageライブラリを組み合わせることで、インタラクティブな画像処理アプリケーションの開発に役立つ実装例として参考にしていただければ幸いです。

参考

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

コメント