John Canny于1986年提出Canny算子,它與Marr(LoG)邊緣檢測(cè)方法類似,也屬于是先平滑后求導(dǎo)數(shù)的方法。
John Canny研究了最優(yōu)邊緣檢測(cè)方法所需的特性,給出了評(píng)價(jià)邊緣檢測(cè)性能優(yōu)劣的三個(gè)指標(biāo):
l 好的信噪比,即將非邊緣點(diǎn)判定為邊緣點(diǎn)的概率要低,將邊緣點(diǎn)判為非邊緣點(diǎn)的概率要低;
l 高的定位性能,即檢測(cè)出的邊緣點(diǎn)要盡可能在實(shí)際邊緣的中心;
l 對(duì)單一邊緣僅有唯一響應(yīng),即單個(gè)邊緣產(chǎn)生多個(gè)響應(yīng)的概率要低,并且虛假響應(yīng)邊緣應(yīng)該得到最大抑制。
用一句話說,就是希望在提高對(duì)景物邊緣的敏感性的同時(shí),可以抑制噪聲的方法才是好的邊緣提取方法。
Canny算子求邊緣點(diǎn)具體算法步驟如下:
1. 用高斯濾波器平滑圖像.
2. 用一階偏導(dǎo)有限差分計(jì)算梯度幅值和方向.
3. 對(duì)梯度幅值進(jìn)行非極大值抑制 .
4. 用雙閾值算法檢測(cè)和連接邊緣.
步1. 圖像與高斯平滑濾波器卷積:


步3. 對(duì)梯度幅值進(jìn)行非極大值抑制(non_maxima suppression,NMS):
僅僅得到全局的梯度并不足以確定邊緣,因此為確定邊緣,必須保留局部梯度最大的點(diǎn),而抑制非極大值。
解決方法:利用梯度的方向:

步4. 用雙閾值算法檢測(cè)和連接邊緣:
對(duì)非極大值抑制圖像作用兩個(gè)閾值th1和th2,兩者關(guān)系th1=0.4th2。我們把梯度值小于th1的像素的灰度值設(shè)為0,得到圖像1。然后把梯度值小于th2的像素的灰度值設(shè)為0,得到圖像2。由于圖像2的閾值較高,去除大部分噪音,但同時(shí)也損失了有用的邊緣信息。而圖像1的閾值較低,保留了較多的信息,我們可以以圖像2為基礎(chǔ),以圖像1為補(bǔ)充來連結(jié)圖像的邊緣。
鏈接邊緣的具體步驟如下:
對(duì)圖像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)位置對(duì)應(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ù)第一步,直到我們?cè)趫D像1和圖像2中都無法繼續(xù)為止。
當(dāng)完成對(duì)包含p(x,y)的輪廓線的連結(jié)之后,將這條輪廓線標(biāo)記為已經(jīng)訪問?;氐降谝徊剑瑢ふ蚁乱粭l輪廓線。重復(fù)第一步、第二步、第三步,直到圖像2中找不到新輪廓線為止。
至此,完成canny算子的邊緣檢測(cè)。