[scikit-image] 102. MorphACWEによる画像のセグメンテーション(skimage.segmentation.morphological_chan_vese)

matplotlib

はじめに

skimage.segmentation の morphological_chan_veseで、モフォロジカル・スネーク法によるセグメンテーションを行うことができる。ここでは、Morphological Active Contours without Edges(MorphACWE)で画像をセグメンテーションした例について説明する。MorphACWEはオブジェクトの内側と外側の領域のピクセル値の平均値が異なる場合にうまく機能すると言われている。

解説

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

バージョン

画像の読み込み

ノトカクタス すみれ丸の画像を用いる。
rgb2grayでグレースケールにした後に、img_as_floatでfloat形式に変換する。サイズは(810,810)となっている。

コールバック関数

処理後に参照できるように途中経過をリストに入れるためのcallback関数を作成しておく。

Morphological ACWE

初期レベルセットの定義

checkerboard_level_setでチェッカーボード状のレベルセットを作成する。checkerboard_level_setについては下記記事で解説した。

[scikit-image] 100. レベルセット法の初期レベルセット(チェッカーボード)を作成するための関数(skimage.segmentation.checkerboard_level_set)
skimage.segmentation の checkerboard_level_setでレベルセット法で行うセグメンテーションのためのチェッカーボードの初期レベルセットを作成する方法について説明する。

morphological_chan_veseの実行

からのリストevolutionに途中経過画像を加えていく。40回計算を行う。smoothingで平滑化演算子が適用される回数を設定する。1-4が適当な値となっている。値が大きいほどセグメンテーション結果がスムーズになる。

結果の表示

左上に元画像と最終結果の等高線を、右上に4回目の結果、左下に8回目の結果、右下に40回目の結果を示した。

セグメント結果の変化をアニメーションで表示

試行回数が増加するにつれて、画像の明るい部分と暗い部分に分かれていく様子が見て取れる。特に画像の下部の刺座(の付け根にあるホワホワな部分)を綺麗に分離することができている。

Initial level setを大きくした場合

Initial level setを大きくしてもそれほど結果に大差はなかった。

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

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

参考

Morphological Snakes — skimage v0.20.0.dev0 docs
Module: segmentation — skimage v0.20.0.dev0 docs

コメント