天天看點

canny算子1. Canny邊緣檢測基本原理

1. Canny邊緣檢測基本原理

     (1)圖象邊緣檢測必須滿足兩個條件:一能有效地抑制噪聲;二必須盡量精确确定邊緣的位置。

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

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

2. Canny邊緣檢測算法:

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

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

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

     step4:用雙門檻值算法檢測和連接配接邊緣。

step1:高斯平滑函數

canny算子1. Canny邊緣檢測基本原理

(可以了解下維基百科上關于卷積函數的定義,如下圖移動的紅色視窗代表我們的高斯和函數,藍色為圖像灰階函數)

canny算子1. Canny邊緣檢測基本原理

通過高斯函數産生k*k的模闆如3*3

canny算子1. Canny邊緣檢測基本原理

用這個模闆對每個像素進行權重平均

Step2:一階微分卷積模闆

canny算子1. Canny邊緣檢測基本原理

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

      僅僅得到全局的梯度并不足以确定邊緣,是以為确定邊緣,必須保留局部梯度最大的點,而抑制非極大值。(non-maxima suppression,NMS)

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

canny算子1. Canny邊緣檢測基本原理

圖1非極大值抑制

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

即: 

canny算子1. Canny邊緣檢測基本原理

 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

繼續閱讀