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

matplotlib

はじめに

この記事では、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関数の詳細については下記記事で解説しています。

[scikit-image] 101. レベルセット法の初期レベルセット(ディスク)を作成するための関数(skimage.segmentation.disk_level_set)
scikit-imageの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関数がその役割を果たします。適切なパラメータ設定と前処理により、高精度なセグメンテーション結果が得られます。

参考

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

コメント