[scikit-image] 66. レベルセット法による画像のセグメンテーション(skimage.segmentation chan_vese)

python

はじめに

本記事では、scikit-imageライブラリのskimage.segmentation.chan_vese関数を使用したレベルセット法による画像のセグメンテーション手法について解説します。Chan-Veseアルゴリズムの理論的背景から実装方法、パラメータの調整、応用例まで幅広く紹介します。画像の輪郭検出に特化したこの手法は、特にノイズの多い画像や複雑なテクスチャを持つ画像に効果的です。

コード

解説

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

画像の読み込み

下記の画像を指定サイトからダウンロードし、plt.imread()関数で読み込みました。その後、rgb2gray関数を使用してグレースケールに変換しました。

ペンギンのバンドのイラスト
いらすとやは季節のイベント・動物・子供などのかわいいイラストが沢山見つかるフリー素材サイトです。

chan_vese法によるセグメント化

muはエッジ長さのパラメータです。値が大きいほど丸いエッジが生成され、ゼロに近いほど小さいオブジェクトが検出されます。一般的に0〜1の範囲で調整しますが、輪郭が不明確な場合は1より大きい値も使用できます。

tolは反復間のレベルセットの変動許容値です。画像の面積で正規化された連続するレベルセット間のL2ノルムの差がこの値を下回ると、解に到達したと判断して計算を終了します。

max_iterは最大計算試行回数を指定します。

関数は3つの値を返します。1つ目はセグメンテーション画像、2つ目は最終的なレベルセット画像、3つ目は各ステップにおけるエネルギー値のリストで、これにより計算の収束状況を確認できます。

結果の表示

図では、左上にオリジナル画像、右上にセグメンテーション結果、左下にレベルセットの状態、右下にエネルギー変化のグラフを示しています。

muを変化させたときの結果

muの値を大きくすると、画像内の小さな領域が徐々に消えていくことが視覚的に確認できます。

形態学的なchan-base

形態学的なChan-Veseアルゴリズムによるセグメンテーションについては下記記事で詳しく解説しています。

[scikit-image] 102. MorphACWEによる画像のセグメンテーション(skimage.segmentation.morphological_chan_vese)
scikit-imageのmorphological_chan_vese関数を使用したMorphACWEによる画像セグメンテーション手法を解説。オブジェクト内外の平均ピクセル値の差を利用して効果的な領域分割を行う方法と実装例を紹介します。
コードをダウンロード(.pyファイル)

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

まとめ

scikit-imageのchan_vese関数を使用すると、複雑な数学的背景を持つレベルセット法による画像セグメンテーションを簡単に実装できます。パラメータを調整することで、様々な画像に対して効果的なセグメンテーション結果を得ることができます。特にエッジが不明瞭な画像や、ノイズが多い画像に対して優れた性能を発揮します。

参考

Chan-Vese Segmentation — skimage 0.25.2 documentation
skimage.segmentation — skimage 0.25.2 documentation
画像のセグメンテーション - Level set 法の実装 (Chan-Vese) -
画像処理のセグメンテーションの分野で用いられるLevel set 法を用いて画像のセグメンテーションを行います.

コメント