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

matplotlib

はじめに

scikit-imageライブラリのmorphological_chan_vese関数を使用した画像セグメンテーション手法について解説します。MorphACWE(Morphological Active Contours without Edges)は、オブジェクトの内側と外側の領域のピクセル値の平均値の差を利用してセグメンテーションを行います。

解説

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

バージョン

画像の読み込み

ノトカクタス すみれ丸の画像を使用します。まず、rgb2gray関数でグレースケールに変換し、その後img_as_float関数でfloat形式に変換します。画像サイズは(810,810)です。

コールバック関数

処理後に結果を検証できるよう、途中経過をリストに保存するためのコールバック関数を作成しておきます。

Morphological ACWE

初期レベルセットの定義

checkerboard_level_set関数を使用してチェッカーボード状のレベルセットを作成します。checkerboard_level_setの詳細については下記記事で解説しています。

[scikit-image] 100. レベルセット法の初期レベルセット(チェッカーボード)を作成するための関数(skimage.segmentation.checkerboard_level_set)
scikit-imageのcheckerboard_level_set関数を使って、レベルセット法によるセグメンテーションのための初期レベルセット(チェッカーボードパターン)を生成する方法を解説します。画像処理におけるセグメンテーション技術の基礎知識も紹介。

morphological_chan_veseの実行

空のリスト「evolution」に途中経過画像を追加していきます。計算は40回行われます。「smoothing」パラメータでは平滑化演算子が適用される回数を設定します。通常、1~4が適切な値です。この値が大きいほどセグメンテーション結果がよりスムーズになります。

結果の表示

図は左上に元画像と最終結果の等高線を、右上に4回目の反復処理の結果、左下に8回目の結果、右下に40回目の結果を示しています。

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

試行回数が増加するにつれて、画像の明るい部分と暗い部分が徐々に分離していく様子が明確に観察できます。特に画像下部の刺座(刺の付け根にある綿毛状の部分)を非常に精度よく分離できています。

Initial level setを大きくした場合

Initial level setの値を大きくしても、結果にはそれほど大きな違いは見られなかった。

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

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

まとめ

scikit-imageのmorphological_chan_vese関数を使用したMorphACWEは、エッジ情報を使わずにオブジェクトの内側と外側の領域のピクセル値の平均値の差に基づいてセグメンテーションを行います。特に対象物と背景の輝度差が明確な場合に効果を発揮し、ノイズにも比較的強いという特徴があります。パラメータ調整によって様々な画像に対応できる柔軟性を持ちますが、初期マスクや反復回数の設定が結果に大きく影響するため、適切な調整が必要です。

参考

Morphological Snakes — skimage 0.26.0rc0.dev0 documentation
skimage.segmentation — skimage 0.26.0rc0.dev0 documentation

コメント