今回はitk::MorphologicalWatershedImageFilterについて説明する。
以下、「itk::MorphologicalWatershedImageFilter」を「MorphologicalWatershedImageFilter」と、「itk::WatershedImageFilter」は「WatershedImageFilter」と記述する。
前回、WatershedImageFilterは、地形に雨が降ったとき雨滴が高い場所から低い場所へと滴り落ち集水域を形成するという、地球物理学的なモデルを明示的にアルゴリズム化していると説明した。このフィルターでは入力画像の全ての画素に対し、最急降下法によってどの局所最小値に移動するのかが計算される。
今回説明するMorphologicalWatershedImageFilterは、WatershedImageFilterとは全く違ったアルゴリズムを持っており、WatershedImageFilterのように全ての画素に対して処理を行うのではなく、集水域の境界(Watershed line)にあたる画素にのみ注目している。
MorphologicalWatershedImageFilterのアルゴリズム
MorphologicalWatershedImageFilterのアルゴリズムでは、局所最小値から水が湧き出て集水域が拡張されていくように、最小値を起点とした境界線が拡げられていく。簡単に説明すると、キュー(Queue)に境界にあたる画素のみがスタックされ、その画素の隣接画素に対して新しい境界になり得るかをチェックすることによって領域が広がっていく。下の左の図において、赤い正方形のマークは局所最小値であり、この点から境界(Watershed line)が移動していく様子が示されている。やがて境界がぶつかり、領域の拡張が終わる。これでセグメンテーション完了である。(右の図)
最小値の抑制
MorphologicalWatershedImageFilterではSetLevel関数を用いることによって局所最小値を抑制することができる。SetLevel関数で指定する値をhとするとき、h以下の深さは下の図(画素値を高さとする一次元モデル)のように抑制されて平らになる。これはH-minima変換と呼ばれ、変化が大きい部分を平滑化することなく、ノイズのような小さい変化のみを平滑化することができる。これは、オーバーセグメントを防ぐ働きがある。
なお、WatershedImageFilterのSetLevel関数とは別であるのでお気を付け頂きたい。またWatersedImageFilterのSetLevel関数ではパーセンテージで設定するが、MorphologicalWatershedImageFilterではダイレクトに画素値(=高さ)を指定する。
セグメンテーション処理の概要
セグメンテーション処理の概要はWatershedImageFilterと同様であり、入力画像から作成した勾配強度画像に対し、WatershedフィルターとしてMorphologicalWatershedImageFilterを適用する。詳細はこちらをご覧頂きたい。
プログラムの実装
勾配強度画像やラベリング画像の作成などWatershedImageFilterの場合と同様であるため、ここではMorphologicalWatershedImageFilterを用いるWatershedフィルター適用部分のみ説明する。以下に該当部分のコードを示す。
// モルフォロジカルWateshedフィルター処理 typedef itk::MorphologicalWatershedImageFilterMorphologicalWatershedFilterType; MorphologicalWatershedFilterType::Pointer morphologicalWatershedfilter = MorphologicalWatershedFilterType::New(); morphologicalWatershedfilter->SetInput(gradientMagnitudeFilter->GetOutput()); morphologicalWatershedfilter->SetMarkWatershedLine(1); morphologicalWatershedfilter->SetFullyConnected(0); morphologicalWatershedfilter->SetLevel(10); morphologicalWatershedfilter->Update();
境界を拡げていくにあたって、注目画素に対する隣接画素の範囲をSetFullyConnected関数で指定する。デフォルトではFalseが指定されており、注目画素の上下左右の画素のみが隣接する画素としてみなされる。2Dであれば隣接数は4、3Dであれば6となる。Trueを選択した場合、注目画素の上下左右に位置する画素だけでなく、斜め方向に位置する画素も隣接画素とみなされるため、2Dであれば、隣接数は8、3Dであれば26となる。前述したようにSetLevel関数によって最小値のしきい値を指定している。上記のコードでは画素値が10以下である領域や局所最小値は抑制される。また、SetMarkWatershedLine関数でTure=1を指定すると境界線(Watersed line)を得ることができる。
以下、結果画像を示す。左の画像はMorphologicalWatershedImageFilterへの入力である勾配強度画像である(上記のコードのMorphologicalWatershedFilter->SetInput(gradientMagnitudeFilter->GetOutput())の部分)。
右の結果画像で境界線が確認できる。(WatershedImageFilterの結果には境界線は存在しない。)
まとめ
WatershedImageFilterは画素値ベースのアルゴリズムであり、MorphologicalWatershedImageFilterはモルフォロジー(形態)ベースのアルゴリズムといえる。領域の境界線を得たい場合は、MorphologicalWatersheImageFilterを用いる。どちらが高速か、どちらが正確かについては厳密に測定していないので断定はできないが、経験的にはMorphologicalWatershedImageFilterのほうが高速に処理してくれる。
今回までITKの2種類のWatershedフィルターについて説明を行った。次回はこれらのフィルターを三次元画像に適用したいと思う。
以上。