はじめに
matplotlibのFuncAnimationでしきい値を連続的に変化させたときの2値化とラベリングのアニメーションを表示する。
コード
解説
モジュールのインポートなど
画像データの生成
画像データの作成は下記記事と同様に行った。

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

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

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

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

しきい値は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形式で保存することができる。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)
コメント