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

matplotlib

はじめに

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

コード

解説

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

画像データの生成

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

[matplotlib] 57. imshow使用時に軸を画像から離して表示する方法
matplotlibのplt.imshowで画像表示する際に軸を画像から離して配置する方法を解説します。tick_paramsとspinesの設定で軸の位置を調整し、視認性を高めるテクニックを紹介します。

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

バイナリ画像の生成

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

[scikit-image] 50. グレースケール画像のしきい値処理によるバイナリ変換(2値化)
グレースケール画像を二値化するしきい値処理の方法をscikit-imageを使って解説。Otsuのアルゴリズムを活用した自動しきい値決定や、さまざまな閾値設定手法について実践的なPythonコード例と共に紹介します。

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

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

画像のヒストグラムとしきい値を示すと上記のようになる。
しきい値は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.26.0rc0.dev0 documentation
skimage.measure — skimage 0.26.0rc0.dev0 documentation

コメント