1. 程式人生 > >水平集詳解與程式碼分析一

水平集詳解與程式碼分析一

       前面我們從大體上描述了一下水平集方法的思想,實際上,各種水平集方法的區別只是在於如何構建能量函式E(C)。當構建好能量泛函E(C)之後,通過水平集的思想,將曲線C用水平集函式Φ代替,再通過求解能量泛函對應的Euler-Lagrange方程獲得水平集的演化方程。

       這裡,通過講解Chan-Vese模型來理解水平集方法的具體步驟。C-V模型是基於區域的水平集方法,它對於要分割物件與背景的畫素平均值具有明顯不同的影象具有很好的效果。根據定義可得C-V模型的能量公式:

       其中μ ,λ1 和λ2 是取值為正的常數,一般令λ1 = λ2= 1。c1和c2分別是演化曲線C 內部和外部的影象灰度均值。能量泛函的第一項是長度約束,用於規整演化曲線C ,保證獲得的是足夠短的曲線;而第二項和第三項合稱為保真項,負責將演化曲線C 吸引到目標輪廓上來。用水平集函式 φ ( x , y)來代替將演化曲線C,且設定如果點( x , y )在C 的內部,則水平集函式 φ ( x , y) > 0;如果點( x , y )在C 的外部時,則水平集函式 φ ( x , y) < 0;而如果點( x , y )恰好在C 上面時,則 φ ( x , y) = 0(這一步驟即是初始化水平集,一般令φ ( x , y)值為(x,y)與C的最小距離值,符號根據前面說的來取,即φ ( x , y)是符號距離函式)。於是:

        其中 H ε( z)和δε ( z)分別是海氏(Heaviside)函式 H ( z )和狄拉克(Dirac)函式 δ ( z)的正則化形式。 H ( z )和 δ ( z)的公式如下:

        通過對上述公式對應的Euler-Lagrange方程進行求解,可得到如下的演化方程:

        獲得此演化方程後,我們就不難對其進行數值求解了。其中div(Δφ/|Δφ|)是水平集曲面的曲率,c1和c2在每次演化都需要重新求解。對CV模型的直觀理解可以這樣:①首先是初始化水平集;②根據初始化的水平集計算(估算)前景和背景灰度均值;③利用前面估算的前景和背景均值對水平集每一個點進行調整(演化),因為根據定義前景>0,背景<0,所以如果當前點的灰度值接近前景估值,那麼該點水平集的值相應的就要增加,反之則減小。

       在實際運用中,只採用上述的演化公式在演化一段時間後會使水平集失去光滑性和距離函式的特性,具體表現為會出現一些小的孤島。為了避免這個問題,需要在演化一定時間後對水平集函式重新初始化。但是由於重新初始化水平集函式為距離函式需要消耗很多時間,為了解決這個問題,李純明提出了在水平集演化的過程中增加一個能量懲罰項,使得水平集函式在演化過程中保持近似的符號距離函式。該懲罰項表示為:

       對於該懲罰項的理解可以這樣:控制水平集梯度▽Φ穩定在1附近,當梯度很大的時候,使得能量變大,於是就會驅使水平集趨於平滑,這樣就使得水平集函式減少了出現孤島的情況,自然的保持了近似的符號距離函式(但這不能完全避免水平集在演化過程中不偏離符號距離函式)。通過增加懲罰項的演化函式只是在前述的演化函式中增加一項

而已。至此,一個不需要初始化水平集的CV模型已經分解完畢,下一節將程式碼貼上,謝謝大家的支援!如有問題,歡迎討論!