はじめに
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については下記記事で解説した。
セグメント化する物体と重ならないように大きさを調整した。
morphological_geodesic_active_contourの実行
からのリストevolutionに途中経過画像を加えていく。330回計算を行う。init_level_setで初期レベルセットを定義し、smoothingで平滑化演算子が適用される回数を設定する。1-4が適当な値となっている。値が大きいほどセグメンテーション結果がスムーズになる。thresholdで輪郭の拡張を止めるしきい値を設定する。balloonは負の値を設定すると輪郭が縮小し、正の値を設定すると輪郭が拡大する。
結果の表示
左に元画像と最終結果の等高線を、右に10回目の結果、100回目の結果、330回目の結果を等高線で示した。
セグメント結果の変化をアニメーションで表示
試行回数が増加するにつれて、輪郭が収縮し、セグメント化していく様子が見て取れる。
balloonを正の値とした場合
中心付近から輪郭が拡大し、セグメント化が進行していく。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)
コメント