数字图像处理笔记——Snakes算法、活动轮廓以及水平集(Snakes, active contours, and level sets)
Snakes算法
上一講我們講的圖像分割算法主要是基于像素的,這一講主要是基于曲線的。我們希望能得到一個能夠包圍住圖像輪廓的平滑的曲線,snakes算法就是一個很有用的算法。首先我們將曲線的坐標(biāo)x、y同一用參數(shù)s表示,s范圍從0-1代表從起點繞曲線一周再回到原點
我們假定初始化的時候這個曲線已經(jīng)給定,我們定義這個曲線的能量函數(shù),曲線衍進(jìn)的過程就是讓能量函數(shù)降低的的過程,能量函數(shù)分為外部能量和內(nèi)部能量
如下是內(nèi)部能量的定義,內(nèi)部能量只與曲線的形狀有關(guān)。能量由兩部分組成:一階導(dǎo)部分與二階導(dǎo)部分。一階導(dǎo)代表曲線的“彈性”,也就是曲線是否被拉伸的非常長;二階導(dǎo)代表曲線曲折程度,也就是曲線是否彎曲不平滑。曲線彈性越低,彎曲越少能量越低
第二部分是曲線的外部能量,代表曲線與邊緣的重合程度。重合程度大的時候能量低。
我們有了能量函數(shù)以后如何求它的最小值呢?這涉及到變分法,在此就不細(xì)講了。對于數(shù)字圖像,我們一般用一定數(shù)量的點對曲線進(jìn)行逼近,之后我們可以用梯度下降法來求得函數(shù)的最小值
在曲線衍進(jìn)的時候還需要注意有時我們需要對曲線的點進(jìn)行重排(再采樣)來保證下一次循環(huán)(衍進(jìn))時我們有更好的效果
當(dāng)然這種方法也存在問題,我們的活動輪廓無法看到遠(yuǎn)處的邊緣,因此當(dāng)周圍像素值都差不多的時候曲線可能不會繼續(xù)向內(nèi)收斂;第二點是當(dāng)圖像中存在噪聲時輪廓很可能和噪聲點重合。為了解決這個問題我們可以對圖像先進(jìn)行模糊處理,這相當(dāng)于將原本的邊界變得更加模糊了(即擴(kuò)大的邊界的影響范圍),這樣就能使輪廓有更好的收斂性
?
梯度向量流
采用模糊處理的效果實際上并不是很好,更好的方法是采用梯度向量流(gradient vector flow)。梯度向量流用一個新的矢量場來代替梯度場,從而替換外部能量的部分。
我們用如下方式定義這個新的矢量場v,當(dāng)梯度值較大的時候,我們另這個矢量場與梯度場的值大致相同;當(dāng)梯度值較小的時候我們讓v的值盡量平滑的變化。這也就意味著在圖像邊緣處,v的值與梯度場的值相同,當(dāng)我們逐漸遠(yuǎn)離邊界的時候,v的值不像梯度場一樣立馬變小,而是有一個逐漸變小的過程。實際上這個新的場v也是擴(kuò)大了邊界的影響范圍,使得輪廓能夠在更遠(yuǎn)的地方捕捉到邊緣
如果我們將這個場畫出來可以得到如下結(jié)果。我們可以看出在這種情況下如果初始輪廓在邊界外部,那么輪廓將會收縮;如果初始輪廓在邊界內(nèi)部,那么輪廓將會外擴(kuò),即朝著向v的模大的地方衍進(jìn)
Snakes算法也有很多令人頭疼的地方,例如追蹤每一個點不是一件容易的事,例如snake無法包圍多個物體等等
除此以外由于這種算法是基于邊緣的,它還會使曲線與我們不需要的邊緣重合,例如以下這個例子:曲線并不能很好地包圍手掌,而是被背景木桌的條紋所吸引了
?
水平集
為了解決snakes算法不能包圍多個物體與洞的問題,我們有水平集(level set)這個算法。與定義一條曲線不同的是,我們定義了一個三維的函數(shù),二維平面上的曲線實際上是這個函數(shù)在z=0的橫截面
我們用這種方法可以很好地表示包含多個物體或洞的曲線
舉個例子,下面右圖是我們需要的曲線,左邊是這個曲線對應(yīng)的函數(shù)
這種算法還有很多細(xì)節(jié)我們就不在這討論了
我們在以上討論的算法都是基于圖像邊緣的,當(dāng)然我們還有基于圖像區(qū)域的算法,這種算法的能量只與曲線本身的性質(zhì)以及兩個區(qū)域塊內(nèi)的像素有關(guān),而與圖像的邊界無關(guān)
比如以下的例子,我們運用基于區(qū)域的算法可以讓曲線很好地收斂到斑馬周圍,因為這種情況下曲線外部的顏色基本是綠色,曲線內(nèi)部基本是黑白的。但如果我們采用基于邊緣的算法來計算,那么這個曲線就會收斂到斑馬身上的條紋上
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的数字图像处理笔记——Snakes算法、活动轮廓以及水平集(Snakes, active contours, and level sets)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HandyJSON和SwiftyJSON
- 下一篇: rbf神经网络 c语言,RBF神经网络极