[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が得られる。

labelcentroid-0centroid-1areaequivalent_diameterbbox-0bbox-1bbox-2bbox-3
017.181818900.636364113.742410490011902
1298.048084833.40235811875122.96226922762180898
23169.329478628.53480740121226.01691029436281842
34223.166012988.172888101836.0021922039692441008
45278.717608392.896535210751.794939251364305423
56320.153846891.466268401771.516454266851358939
67322.887612687.623563626489.306061268648378728
78319.133052530.592968355567.278277283499355565
89333.917015429.939701335065.309666292389376468
910316.447531159.48045397235.179381303138330181
1011402.705808530.06060679231.755405389511418550
1112448.104914731.160386331764.987195396708499757
1213447.046938188.207078398471.222092401147503238
1314427.990085456.473088141242.400640407436450478
1415528.26707566.91978511918123.18469444417636116
1516546.451798576.83011012873128.025047461493673686
1617488.006569888.226462319763.800837461850519933
1718585.722155348.09214223236172.002890499212682502
1819579.878111824.479262590786.723849537778622877
1920605.535294142.75882417014.712264598133614154
2021635.350292735.399500119939.071911618715654757
2122671.596386927.879518132841.120094652908692949
2223678.788516177.692439175947.324712661139697210
2324761.076837618.42789116177143.517233678550895722
2425721.062047440.810709317563.580937691404750476
2526783.972820839.840091441574.975680734798841869
2627823.599375740.441222448375.550863784697864785
2728864.355526837.04660575130.922531843816881855
2829933.688589705.718927510980.653461879670986741
2930945.166023769.338996129540.605975924752968788

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

参考

Module: measure — skimage v0.20.0.dev0 docs
Event handling and picking — Matplotlib 3.4.3 documentation

コメント