邊緣檢測算法

轉載出處:  http://blog.csdn.net/tianhai110html

索貝爾算子(Sobel operator)主要用做邊緣檢測,在技術上,它是一離散性差分算子,用來運算圖像亮度函數的灰度之近似值。在圖像的任何一點使用此算子,將會產生對應的灰度矢量或是其法矢量算法

 

Sobel卷積因子爲:函數

 

該算子包含兩組3x3的矩陣,分別爲橫向及縱向,將之與圖像做平面卷積,便可分別得出橫向及縱向的亮度差分近似值。若是以A表明原始圖像,Gx及Gy分別表明經橫向及縱向邊緣檢測的圖像灰度值,其公式以下:優化

 

 

具體計算以下:spa

Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1).net

      +(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)htm

      +(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)blog

= [f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)]get

 

Gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)it

      +0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)

      +(-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)

= [f(x-1,y-1) + 2f(x,y-1) + f(x+1,y-1)]-[f(x-1, y+1) + 2*f(x,y+1)+f(x+1,y+1)]

 

其中f(a,b), 表示圖像(a,b)點的灰度值;

 

圖像的每個像素的橫向及縱向灰度值經過如下公式結合,來計算該點灰度的大小:

 

一般,爲了提升效率 使用不開平方的近似值:

 

若是梯度G大於某一閥值 則認爲該點(x,y)爲邊緣點。

 

而後可用如下公式計算梯度方向:

 

 

 

Sobel算子根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對噪聲具備平滑做用,提供較爲精確的邊緣方向信息,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較爲經常使用的邊緣檢測方法。
  

 

普利維特算子(Prewitt operate) 

除sobel邊緣檢測外 還有Prewitt算子, 它的卷積因子以下:

 

其餘計算 和sobel差很少;

Prewitt算子利用像素點上下、左右鄰點灰度差,在邊緣處達到極值檢測邊緣。對噪聲具備平滑做用,定位精度不夠高。

 

羅伯茨交叉邊緣檢測(Roberts Cross operator

卷積因子以下:

 

灰度公式爲:

 

近似公式爲:

 

具體計算以下:

G(x,y)=abs(f(x,y)-f(x+1,y+1))+abs(f(x,y+1)-f(x+1,y))

 

灰度方向 計算公式爲:

Roberts算子採用對角線方向相鄰兩像素之差近似梯度幅值檢測邊緣。檢測水平和垂直邊緣的效果好於斜向邊緣,定位精度高,對噪聲敏感

 

 

 

Canny邊緣檢測基本原理

 

     (1)圖象邊緣檢測必須知足兩個條件:一能有效地抑制噪聲;二必須儘可能精確肯定邊緣的位置。

     (2)根據對信噪比與定位乘積進行測度,獲得最優化逼近算子。這就是Canny邊緣檢測算子。

     (3)相似與Marr(LoG)邊緣檢測方法,也屬於先平滑後求導數的方法。

 

2. Canny邊緣檢測算法:

     step1:用高斯濾波器平滑圖象

     step2:用一階偏導的有限差分來計算梯度的幅值和方向

     step3:對梯度幅值進行非極大值抑制

     step4:用雙閾值算法檢測和鏈接邊緣

 

step1:高斯平滑函數

(能夠理解下維基百科上關於卷積函數的定義,以下圖移動的紅色窗口表明咱們的高斯和函數,藍色爲圖像灰度函數)

經過高斯函數產生k*k的模板如3*3

 

用這個模板對每一個像素進行加權平均

 

Step2:一階微分卷積模板

step3:對梯度幅值進行非極大值抑制

      僅僅獲得全局的梯度並不足以肯定邊緣,所以爲肯定邊緣,必須保留局部梯度最大的點,而抑制非極大值。(non-maxima suppression,NMS)

解決方法:利用梯度的方向。



 

圖1非極大值抑制

四個扇區的標號爲0到3,對應3*3鄰域的四種可能組合。在每一點上,鄰域的中心象素M與沿着梯度線的兩個象素相比。若是M的梯度值不比沿梯度線的兩個相鄰象素梯度值大,則令M=0。

即: 

 

 Step4:用雙閾值算法檢測和鏈接邊緣:  

  對非極大值抑制圖像做用兩個閾值th1和th2,二者關係th1=0.4th2  。咱們把梯度值小於th1的像素的灰度值設爲0,獲得圖像1。而後把梯度值小於th2的像素的灰度值設爲0,獲得圖像2。因爲圖像2的閾值較高,去除大部分噪音,但同時也損失了有用的邊緣信息。而圖像1的閾值較低,保留了較多的信息,咱們能夠以圖像2爲基礎,以圖像1爲補充來連結圖像的邊緣。

  連接邊緣的具體步驟以下:

  對圖像2進行掃描,當遇到一個非零灰度的像素p(x,y)時,跟蹤以p(x,y)爲開始點的輪廓線,直到輪廓線的終點q(x,y)。

   考察圖像1中與圖像2中q(x,y)點位置對應的點s(x,y)的8鄰近區域。若是在s(x,y)點的8鄰近區域中有非零像素s(x,y)存在,則將其包括到圖像2中,做爲r(x,y)點。從r(x,y)開始,重複第一步,直到咱們在圖像1和圖像2中都沒法繼續爲止。

   當完成對包含p(x,y)的輪廓線的連結以後,將這條輪廓線標記爲已經訪問。回到第一步,尋找下一條輪廓線。重複第一步、第二步、第三步,直到圖像2中找不到新輪廓線爲止。

 

3. canny算法程序實現

   Canny算法程序中將上述的4個步驟再加以細分,分紅如下7步:

l 生成高斯濾波係數;

l 用生成的高斯濾波係數對原圖像進行平滑;

l 求濾波後圖像的梯度;

l 進行非最大抑制;

l 統計圖像的直方圖,對閾值進行斷定;

l 利用函數尋找邊界起點;

l 根據第6步執行的結果,從一個像素點開始搜索,搜索以該像素點爲邊界起點的一條邊界的一條邊界的全部邊界點;

 

參考:

http://blog.csdn.net/likezhaobin/article/details/6835049

http://blog.csdn.net/likezhaobin/article/details/6892176

http://blog.csdn.net/likezhaobin/article/details/6892629

http://www.cnblogs.com/cfantaisie/archive/2011/06/05/2073168.html

其餘參考資料

參考文章:

http://homepages.inf.ed.ac.uk/rbf/HIPR2/featops.htm

http://homepages.inf.ed.ac.uk/rbf/HIPR2/sobel.htm

相關文章
相關標籤/搜索