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