[matplotlib animation] 72.しきい値を連続的に変化させたときの2値化とラベリングのアニメーション

matplotlib

はじめに

matplotlibのFuncAnimationでしきい値を連続的に変化させたときの2値化とラベリングのアニメーションを表示する。

コード

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

解説

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

画像データの生成

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

[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にして表示すると上記のようになる。タイトルに総ラベル数を表示した。

アニメーションの設定

しきい値として用いる配列の生成

バイナリ画像にするしきい値を小さくしていく配列をnp.linspace()で生成する。

図の表示など

subplotsで2×2の図を作成して左上にオリジナル画像、右上にヒストグラム、左下にバイナリ画像、右下にラベル画像を表示する。

しきい値の表示については、vlinesでアニメーション関数でデータの変更ができなかったので、ax[1].plot(np.tile(thresh_v[0],2),[0,6000],’r-‘)と普通のplotで表示した。

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

最初にバイナリ画像をいれるリスト(imgs_b)とラベル画像をいれるリストを(imgs_l)を作成しておく。
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形式で保存することができる。

参考

Module: filters — skimage v0.18.0.dev0 docs
Module: measure — skimage v0.18.0.dev0 docs

コメント