はじめに
この記事では、scikit-imageライブラリのMorphological Geodesic Active Contours (MorphGAC)アルゴリズムを使用した画像セグメンテーションについて解説します。MorphGACは輪郭がはっきりした画像に適していますが、ノイジーな輪郭や不明瞭な部分がある場合は前処理が必要です。ここではinverse_gaussian_gradient関数を用いた例を紹介します。
解説
モジュールのインポートなど
バージョン
画像の読み込み
下記サイトのドライフルーツにされたデーツ(ナツメヤシの実)のイラストを用います。

画像をrgb2gray関数でグレースケールに変換した後、img_as_float関数でfloat形式に変換します。変換後の画像サイズは(644,644)です。

コールバック関数
処理後に参照できるように途中経過をリストに入れるためのcallback関数を作成しておきます。
Morphological GAC
inverse_gaussian_gradientによる前処理
inverse_gaussian_gradientは画像内の勾配の大きさを計算し、その結果を[0, 1]の範囲で反転して出力します。これにより、平らな部分には1に近い値が、境界付近には0に近い値が割り当てられます。結果は下のようになります。

初期レベルセットの定義
disk_level_set関数を使用してディスク状のレベルセットを作成します。disk_level_set関数の詳細については下記記事で解説しています。

セグメント化する物体と重ならないように大きさを調整しました。

morphological_geodesic_active_contourの実行
空のリスト「evolution」に途中経過画像を順次追加していきます。計算は330回実行されます。「init_level_set」パラメータで初期レベルセットを定義し、「smoothing」パラメータで平滑化演算子の適用回数を設定します。適切な値は1~4の範囲で、値が大きいほどセグメンテーション結果がスムーズになります。「threshold」パラメータは輪郭の拡張を停止するしきい値を設定します。「balloon」パラメータは、負の値を設定すると輪郭が縮小し、正の値では輪郭が拡大します。
結果の表示
左側には元画像と最終結果の等高線を表示し、右側には10回目、100回目、330回目の処理結果をそれぞれ等高線で示しています。

セグメント結果の変化をアニメーションで表示
試行回数が増えるにつれて、輪郭が徐々に収縮し、対象物がセグメント化されていく過程が明確に観察できる。
balloonを正の値とした場合

中心付近から輪郭が拡大し、セグメント化が進行していきます。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)まとめ
MorphGACアルゴリズムは、明確な輪郭を持つ画像に対して効果的なセグメンテーション手法です。ノイズの多い画像では前処理として輪郭強調が必要となり、inverse_gaussian_gradient関数がその役割を果たします。適切なパラメータ設定と前処理により、高精度なセグメンテーション結果が得られます。
コメント