[matplotlib animation] 72.しきい値を変化させた2値化とラベリングのアニメーション作成方法

matplotlib

はじめに

このブログ記事では、Pythonのmatplotlibライブラリを使用して、画像の2値化処理において、しきい値を連続的に変化させた場合の効果を視覚的に表現するアニメーションの作成方法を解説します。

コード

解説

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

画像データの生成

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

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

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

バイナリ画像の生成

threshold_otsuを使用して大津の方法により2値化のためのしきい値を取得します。

得られたしきい値を用いて画像imをバイナリ画像に変換します。

大津の方法による2値化の詳細については下記記事で解説しています。

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

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

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

しきい値はvlinesで表示しました。

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

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

label_imageの0の部分をnp.nanに置き換えて表示すると上記のような結果になります。タイトルには総ラベル数を表示しました。

アニメーションの設定

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

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

図の表示など

subplotsを使用して2×2のグリッドレイアウトを作成し、左上にオリジナル画像、右上にヒストグラム、左下にバイナリ画像、右下にラベル画像を表示します。

しきい値の表示については、vlinesではアニメーション関数内でデータを更新できなかったため、通常のplotを使用して「ax[1].plot(np.tile(thresh_v[0],2),[0,6000],’r-‘)」のように赤い線で表示しました。

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

最初にバイナリ画像を格納するリスト(imgs_b)とラベル画像を格納するリスト(imgs_l)を作成します。 imgs_b.pop().remove()などの処理は、リスト内の画像を消去するためのものです。画像の消去と表示を繰り返すことでアニメーション効果を実現しています。

imgs_b.append(img)を使用して、しきい値を変化させて生成したバイナリ画像をリストに追加します。 ラベル画像についても同様に、作成後にimgs_l.append(img)でリストに追加します。

アニメーションの表示

FuncAnimationを使用して、20フレーム、表示間隔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

コメント