動的輪郭モデル (active contour model) |
2018-03-11 - 2018-05-30 (update) |
|
|
*動的輪郭モデル とは
物体の輪郭を推定する方法です.輪郭は複数の点の集合で考え,初期値の状態から繰り返し計算により最適値を推定します.代表的な手法としてSnakes[1]やLevel set法[2]があります.
図1,2の例は,Snakesの方法による繰り返し計算の過程です.黒丸は,現時点の輪郭を表現する頂点です.
[img:nv57]
{{small:図1 うまくいく例}}
[img:7nyx]
{{small:図2 難しい例}}
{{small:[1] M.Kass, A.Witkin, D.Terzopoulos, "Snakes: Active contour models", International Journal of Computer Vision, 1988 }}
{{small:[link:http://ww.vavlab.ee.boun.edu.tr/courses/574/material/Variational%20Image%20Segmentation/kaas_snakes.pdf] }}
{{small:[2] S.Osher, R.P.Fedkiw, "Level Set Methods and Dynamic Implicit Surfaces", Springer-Verlag, 2002 }}
{{small:[link:http://physbam.stanford.edu/~fedkiw/papers/cam2000-08.pdf] }}
{{small:[3] 倉爪亮, "レベルセット法とその実装法について", CVIM 研究報告, 2006}}
{{small:[4] あるまじろ様の解説スライド (Snakes,Level set法 について分かりやすく解説されています)}}
{{small:[link:https://www.slideshare.net/Arumaziro/ss-37035661] }}
*サンプルコード (C++)
ライブラリ:[link:simplesp]
サンプルコード:simplesp/sample/sp/contour
Snakesの方法に基づいて,物体の輪郭を推定します.
*Snakes アルゴリズム
ここでは,Snakesのアルゴリズムについて簡単に解説します.より詳しい解説は[3]の文献を参照ください.
**輪郭を表す頂点データ
まずは,輪郭を次の式で表す2次元の頂点の集合として考えます.
{$$ v(s) = \begin{pmatrix} x(s) \\ y(s) \end{pmatrix} s \in [0,1]$$}
ただし,コンピュータによる数値計算上,{$ v_i $} とおいて有限個の頂点を考えます.
**目的関数
次に,輪郭の目的関数を考えます.
{$$ \mathcal{E}(v) = \mathcal{S}(v) + \mathcal{P}(v)$$}
{$$ \mathcal{S}(v)
= \frac{1}{2}\int_{0}^{1} w_1(s)\begin{vmatrix} \frac{dv}{ds} \end{vmatrix}^2
+ w_2(s)\begin{vmatrix} \frac{d^2v}{ds^2} \end{vmatrix}^2 ds, \quad
\mathcal{P}(v) = - c \int_{0}^{1} \begin{vmatrix} \nabla(G \otimes I(v(s))) \end{vmatrix} ds $$}
ここで,{$ \mathcal{S} $} は輪郭の長さと曲率に対応する項です.輪郭が短くまた曲率が小さいほど{$ \mathcal{S} $}の値は小さくなります.{$ \mathcal{P} $} は画像との適合度を表す項です.輪郭の位置に画像の勾配があると{$ \mathcal{P} $}の値は小さくなります(負値であるため).
Snakesでは,この目的関数を最小化する頂点データを推定します.
なお数値計算上,各項は有限個の頂点 {$ v_i $} に基づいて次の式で計算します.
{$$ \mathcal{E} = \alpha \mathcal{E}_{len} + \beta \mathcal{E}_{crv} + \gamma \mathcal{E}_{img}$$}
{$$ \mathcal{E}_{len} = \sum_{i=1}^{N} (v_i - v_{i-1})^2 , \quad
\mathcal{E}_{curv} = \sum_{i=1}^{N} (v_{i+1} + v_{i-1} - 2 v_i)^2 ,
\quad \mathcal{E}_{img} = - \sum_{i=1}^{N} I'(v_i) $$}
{{small:{$ \alpha, \beta, \gamma $}は各項の比率を調整する係数です.}}
{{small:各項の計算式は色々バリエーションがあるので,上記の計算方法以外を用いる場合も多いようです.}}
**処理の流れ
最後に,処理の手順を説明します.
1.初期値の頂点群{$v_i$}を設定する
2.頂点の位置を近傍の範囲で移動させた時の目的関数{$\mathcal{E}$}を計算し,{$\mathcal{E}$}が最小となる位置に頂点を移動させる.
{{small:例えば,8近傍の各位置に頂点を移動させた時の{$\mathcal{E}$}を計算する}}
3.2の処理をすべての頂点について行う.
処理2と3を繰り返すことで,段階的に頂点の位置を更新します.その繰り返し回数は固定値を設定するか,或いは処理3の更新の程度を見て決定します.
**補足
係数の値によって推定結果が変動しやすいため,実用上は画像の条件に合わせた微調整が必須になると思います.
>> ご意見・ご質問など お気軽にご連絡ください.info