はじめに
この記事では、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)を使用することでマウスクリックイベントを有効にできます。 なお、コメントアウトされている処理を実行するとこの機能は無効になります。
実際の操作結果は以下のようになります。
まとめ
本記事では、matplotlibのbutton_press_eventを活用して、ラベル画像上のクリックイベントを検知し、選択したラベルとその元画像を拡大表示する方法を解説しました。この技術により、画像処理やラベリング結果の詳細な確認が容易になり、効率的な画像分析が可能となります。Pythonのmatplotlibとskimageライブラリを組み合わせることで、インタラクティブな画像処理アプリケーションの開発に役立つ実装例として参考にしていただければ幸いです。
コメント