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

matplotlib

はじめに

skimage.segmentation の morphological_geodesic_active_contourで、モフォロジカル・スネーク法によるセグメンテーションを行うことができる。ここでは、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)
skimage.segmentation の disk_level_setでレベルセット法で行うセグメンテーションのためのディスク状の初期レベルセットを作成する方法について説明する。

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

morphological_geodesic_active_contourの実行

からのリストevolutionに途中経過画像を加えていく。330回計算を行う。init_level_setで初期レベルセットを定義し、smoothingで平滑化演算子が適用される回数を設定する。1-4が適当な値となっている。値が大きいほどセグメンテーション結果がスムーズになる。thresholdで輪郭の拡張を止めるしきい値を設定する。balloonは負の値を設定すると輪郭が縮小し、正の値を設定すると輪郭が拡大する。

結果の表示

左に元画像と最終結果の等高線を、右に10回目の結果、100回目の結果、330回目の結果を等高線で示した。

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

試行回数が増加するにつれて、輪郭が収縮し、セグメント化していく様子が見て取れる。

balloonを正の値とした場合

中心付近から輪郭が拡大し、セグメント化が進行していく。

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

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

参考

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

コメント