[matplotlib animation] 73. Dilationを複数回実行したときの2値化とラベリングのアニメーション

matplotlib

はじめに

matplotlibのFuncAnimationでモルフォロジー処理の膨張(dilation)を複数回実行したときの2値化とラベリングのアニメーションを表示する。

コード

解説

モジュールのインポートなど

画像データの生成

画像データの作成は下記記事と同様に行った。

[matplotlib] 57. plt.imshow()で軸を画像から離して表示
matplotlibのplt.imshowで画像を表示する際に、軸を画像から離して表示する方法について説明する。

画像を表示すると下記のようになる。

バイナリ画像の生成

threshold_otsuで大津の方法により2値化のためのしきい値を得る。
そのしきい値を用いて画像imをバイナリ画像へと変換する。
大津の方法による2値化については下記記事で説明した。

[scikit-image] 50. しきい値処理でグレースケール画像をバイナリ画像に変換
skimage.filtersのthreshold_otsuによるしきい値処理について説明する。

図示すると下記のようになる。

ヒストグラムとしきい値の表示

画像のヒストグラムとしきい値を示すと上記のようになる。
しきい値はvlinesで表示した。

バイナリ画像のラベリング

labelでreturn_numをTrueにすると、ラベル画像と総ラベル数が返り値として得られるので、label_num = label_image[1]で総ラベル数を取得する。

label_imageの0の部分をnp.nanにして表示すると上記のようになる。タイトルに総ラベル数を表示した。

バイナリ画像の膨張処理

binary_dilationで膨張処理ができる。上記のように黄色い部分が一回り大きくなった画像が得られる。

アニメーションの設定

図の表示など

subplotsで2×2の図を作成して左上にオリジナル画像、右上にdilation処理で変化するラベル数の図、左下にバイナリ画像、右下にラベル画像を表示する。

アニメーション関数の設定

最初にバイナリ画像をいれるリスト(imgs_b)とラベル画像をいれるリストを(imgs_l)と変化するラベル数の図をいれるリスト(pllott)を作成しておく。
imgs_b.pop().remove()などは、リスト内にある画像を消去することを意味する。つまり画像を消して表示するを繰り返すことでアニメーションとしている。

imgs_b.append(img)でしきい値を変化させて作成したバイナリ画像をリストに入れる。
ラベル画像も同様に、作成した後にimgs_l.append(img)でリストに入れる。
ラベル数の図も同様に処理する。

アニメーションの表示

FuncAnimationで20framesの表示間隔500msのアニメーションを表示する。
HTML(ani.to_html5_video())により、jupyter notebook またはjupyter lab上にアニメーションを表示できる。

ani.save(‘ファイル名’, writer=”ffmpeg”,dpi=100)でアニメーションをMP4形式で保存することができる。

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

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

参考

skimage.filters — skimage 0.23.0rc1.dev0 documentation
skimage.measure — skimage 0.23.0rc1.dev0 documentation

コメント