[matplotlib animation] 106. skimage.segmentation.expand_labelsによるラベル領域の非オーバーラップ展開

matplotlib

はじめに

skimageのlabel関数で作成したラベル画像を、expand_labels関数を使って重なり合わないように拡大する方法とその視覚化についての解説。matplotlibのFuncAnimationを使ってラベル領域の拡大過程をアニメーションとして表示する方法を紹介します。

コード&解説

モジュールのインポート

バージョン

画像データの作成

512 × 512の2Dデータ上のランダムな位置に点を作成し、ガウシアンフィルターをかけた画像を使用します。大津法(threshold_otsu)でしきい値を求め、画像を2値化します。その後、clear_border関数を用いて画像の端に接している領域を除去します。

画像を表示

生成した画像は以下のようになります。

ラベリング

skimageのlabel関数を使用してラベル付けを行います。このとき、ラベル像の背景は値0として表現されます。実際にラベル像を表示すると、以下のようになります。

expand_labelsにラベルの拡大

expand_labels関数を用いてラベルを拡大できます。例えば、ラベルを10ピクセル拡大した画像は下に示すとおりです。この画像から、ラベル同士が重なり合うことなく拡大していることが明確にわかります。

ラベルを背景を埋めるまで拡大するアニメーション

ラベルを順次拡大していった画像の取得

expand_labelsのdistanceパラメータを変更して複数の画像を生成し、空のリストに追加していくことで、アニメーション表示用の画像リストを作成します。背景が完全に埋まったかどうかを確認するために、len(np.where(expanded==0)[0])を使用して画像内の0(背景)のピクセル数をカウントします。

背景が消失し、初めて値0が出現するインデックスは104であることが判明した。

アニメーションの表示

アニメーション関数内で、img.set_data(im_list[i])を使用することで画像のアニメーションを生成できます。

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

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

まとめ

skimage.segmentation.expand_labelsを使うことで、ラベル領域を重なり合わないように拡大することができます。この処理をmatplotlibのFuncAnimationでアニメーション化することで、ラベル拡大の過程を視覚的に理解しやすくなります。画像セグメンテーションの結果を視覚化する際に役立つテクニックです。

参考

skimage.measure — skimage 0.26.0rc0.dev0 documentation
Expand segmentation labels without overlap — skimage 0.26.0rc0.dev0 documentation

コメント