canny算子的語法原理分析
Canny算子Canny邊緣檢測算子是John F. Canny于 1986 年開發(fā)出來的一個(gè)多級邊緣檢測算法。更為重要的是 Canny 創(chuàng)立了邊緣檢測計(jì)算理論(ComputaTIonal theory of edge detecTIon)解釋這項(xiàng)技術(shù)如何工作。
Canny 算法包含許多可以調(diào)整的參數(shù),它們將影響到算法的計(jì)算的時(shí)間與實(shí)效。
高斯濾波器的大?。旱谝徊剿玫钠交瑸V波器將會直接影響 Canny 算法的結(jié)果。較小的濾波器產(chǎn)生的模糊效果也較少,這樣就可以檢測較小、變化明顯的細(xì)線。較大的濾波器產(chǎn)生的模糊效果也較多,將較大的一塊圖像區(qū)域涂成一個(gè)特定點(diǎn)的顏色值。這樣帶來的結(jié)果就是對于檢測較大、平滑的邊緣更加有用,例如彩虹的邊緣。
閾值:使用兩個(gè)閾值比使用一個(gè)閾值更加靈活,但是它還是有閾值存在的共性問題。設(shè)置的閾值過高,可能會漏掉重要信息;閾值過低,將會把枝節(jié)信息看得很重要。很難給出一個(gè)適用于所有圖像的通用閾值。目前還沒有一個(gè)經(jīng)過驗(yàn)證的實(shí)現(xiàn)方法。
Canny 算法適用于不同的場合。它的參數(shù)允許根據(jù)不同實(shí)現(xiàn)的特定要求進(jìn)行調(diào)整以識別不同的邊緣特性。對于PC上的實(shí)時(shí)圖像處理來說可能慢得無法使用,尤其是在使用大的高斯濾波器的情況下。但是,我們討論計(jì)算能力的時(shí)候,也要考慮到隨著處理器速度不斷提升,有望在未來幾年使得這不再成為一個(gè)問題。
canny算子的語法原理分析1. Canny邊緣檢測基本原理
?。?)圖象邊緣檢測必須滿足兩個(gè)條件:一能有效地抑制噪聲;二必須盡量精確確定邊緣的位置。
?。?)根據(jù)對信噪比與定位乘積進(jìn)行測度,得到最優(yōu)化逼近算子。這就是Canny邊緣檢測算子。
(3)類似與Marr(LoG)邊緣檢測方法,也屬于先平滑后求導(dǎo)數(shù)的方法。
2. Canny邊緣檢測算法:
step1:用高斯濾波器平滑圖象;
step2:用一階偏導(dǎo)的有限差分來計(jì)算梯度的幅值和方向;
step3:對梯度幅值進(jìn)行非極大值抑制;
step4:用雙閾值算法檢測和連接邊緣。
step1:高斯平滑函數(shù)
?。梢岳斫庀戮S基百科上關(guān)于卷積函數(shù)的定義,如下圖移動的紅色窗口代表我們的高斯和函數(shù),藍(lán)色為圖像灰度函數(shù))
通過高斯函數(shù)產(chǎn)生k*k的模板如3*3
用這個(gè)模板對每個(gè)像素進(jìn)行加權(quán)平均
Step2:一階微分卷積模板
step3:對梯度幅值進(jìn)行非極大值抑制
僅僅得到全局的梯度并不足以確定邊緣,因此為確定邊緣,必須保留局部梯度最大的點(diǎn),而抑制非極大值。(non-maxima suppression,NMS)
解決方法:利用梯度的方向。
圖1非極大值抑制
四個(gè)扇區(qū)的標(biāo)號為0到3,對應(yīng)3*3鄰域的四種可能組合。在每一點(diǎn)上,鄰域的中心象素M與沿著梯度線的兩個(gè)象素相比。如果M的梯度值不比沿梯度線的兩個(gè)相鄰象素梯度值大,則令M=0。
即:
Step4:用雙閾值算法檢測和連接邊緣:
對非極大值抑制圖像作用兩個(gè)閾值th1和th2,兩者關(guān)系th1=0.4th2 。我們把梯度值小于th1的像素的灰度值設(shè)為0,得到圖像1。然后把梯度值小于th2的像素的灰度值設(shè)為0,得到圖像2。由于圖像2的閾值較高,去除大部分噪音,但同時(shí)也損失了有用的邊緣信息。而圖像1的閾值較低,保留了較多的信息,我們可以以圖像2為基礎(chǔ),以圖像1為補(bǔ)充來連結(jié)圖像的邊緣。
鏈接邊緣的具體步驟如下:
對圖像2進(jìn)行掃描,當(dāng)遇到一個(gè)非零灰度的像素p(x,y)時(shí),跟蹤以p(x,y)為開始點(diǎn)的輪廓線,直到輪廓線的終點(diǎn)q(x,y)。
考察圖像1中與圖像2中q(x,y)點(diǎn)位置對應(yīng)的點(diǎn)s(x,y)的8鄰近區(qū)域。如果在s(x,y)點(diǎn)的8鄰近區(qū)域中有非零像素s(x,y)存在,則將其包括到圖像2中,作為r(x,y)點(diǎn)。從r(x,y)開始,重復(fù)第一步,直到我們在圖像1和圖像2中都無法繼續(xù)為止。
當(dāng)完成對包含p(x,y)的輪廓線的連結(jié)之后,將這條輪廓線標(biāo)記為已經(jīng)訪問?;氐降谝徊?,尋找下一條輪廓線。重復(fù)第一步、第二步、第三步,直到圖像2中找不到新輪廓線為止。
3. canny算法程序?qū)崿F(xiàn)
Canny算法程序中將上述的4個(gè)步驟再加以細(xì)分,分成以下7步:
l 生成高斯濾波系數(shù);
l 用生成的高斯濾波系數(shù)對原圖像進(jìn)行平滑;
l 求濾波后圖像的梯度;
l 進(jìn)行非最大抑制;
l 統(tǒng)計(jì)圖像的直方圖,對閾值進(jìn)行判定;
l 利用函數(shù)尋找邊界起點(diǎn);
l 根據(jù)第6步執(zhí)行的結(jié)果,從一個(gè)像素點(diǎn)開始搜索,搜索以該像素點(diǎn)為邊界起點(diǎn)的一條邊界的一條邊界的所有邊界點(diǎn);