canny算子的运用
1.?Canny邊緣檢測基本原理
?
?????(1)圖象邊緣檢測必須滿足兩個條件:一能有效地抑制噪聲;二必須盡量精確確定邊緣的位置。
?????(2)根據(jù)對信噪比與定位乘積進行測度,得到最優(yōu)化逼近算子。這就是Canny邊緣檢測算子。
?????(3)類似與Marr(LoG)邊緣檢測方法,也屬于先平滑后求導(dǎo)數(shù)的方法。
?
2.?Canny邊緣檢測算法:
?????step1:用高斯濾波器平滑圖象;
?????step2:用一階偏導(dǎo)的有限差分來計算梯度的幅值和方向;
?????step3:對梯度幅值進行非極大值抑制;
?????step4:用雙閾值算法檢測和連接邊緣。
?
step1:高斯平滑函數(shù)
(可以理解下維基百科上關(guān)于卷積函數(shù)的定義,如下圖移動的紅色窗口代表我們的高斯和函數(shù),藍色為圖像灰度函數(shù))
通過高斯函數(shù)產(chǎn)生k*k的模板如3*3
?
用這個模板對每個像素進行加權(quán)平均
?
Step2:一階微分卷積模板
step3:對梯度幅值進行非極大值抑制
??????僅僅得到全局的梯度并不足以確定邊緣,因此為確定邊緣,必須保留局部梯度最大的點,而抑制非極大值。(non-maxima?suppression,NMS)
解決方法:利用梯度的方向。
?
圖1非極大值抑制
四個扇區(qū)的標號為0到3,對應(yīng)3*3鄰域的四種可能組合。在每一點上,鄰域的中心象素M與沿著梯度線的兩個象素相比。如果M的梯度值不比沿梯度線的兩個相鄰象素梯度值大,則令M=0。
即:?
?Step4:用雙閾值算法檢測和連接邊緣:
對非極大值抑制圖像作用兩個閾值th1和th2,兩者關(guān)系th1=0.4th2??。我們把梯度值小于th1的像素的灰度值設(shè)為0,得到圖像1。然后把梯度值小于th2的像素的灰度值設(shè)為0,得到圖像2。由于圖像2的閾值較高,去除大部分噪音,但同時也損失了有用的邊緣信息。而圖像1的閾值較低,保留了較多的信息,我們可以以圖像2為基礎(chǔ),以圖像1為補充來連結(jié)圖像的邊緣。
鏈接邊緣的具體步驟如下:
對圖像2進行掃描,當遇到一個非零灰度的像素p(x,y)時,跟蹤以p(x,y)為開始點的輪廓線,直到輪廓線的終點q(x,y)。
? 考察圖像1中與圖像2中q(x,y)點位置對應(yīng)的點s(x,y)的8鄰近區(qū)域。如果在s(x,y)點的8鄰近區(qū)域中有非零像素s(x,y)存在,則將其包括到圖像2中,作為r(x,y)點。從r(x,y)開始,重復(fù)第一步,直到我們在圖像1和圖像2中都無法繼續(xù)為止。
? 當完成對包含p(x,y)的輪廓線的連結(jié)之后,將這條輪廓線標記為已經(jīng)訪問。回到第一步,尋找下一條輪廓線。重復(fù)第一步、第二步、第三步,直到圖像2中找不到新輪廓線為止。
3.?canny算法程序?qū)崿F(xiàn)
???Canny算法程序中將上述的4個步驟再加以細分,分成以下7步:
l?生成高斯濾波系數(shù);
l?用生成的高斯濾波系數(shù)對原圖像進行平滑;
l?求濾波后圖像的梯度;
l?進行非最大抑制;
l?統(tǒng)計圖像的直方圖,對閾值進行判定;
l?利用函數(shù)尋找邊界起點;
l?根據(jù)第6步執(zhí)行的結(jié)果,從一個像素點開始搜索,搜索以該像素點為邊界起點的一條邊界的一條邊界的所有邊界點;
? ?
MATLAB代碼:
I=imread('lena.jpg'); % I=double(I); figure; imshow(I); title('原圖像'); I1=edge(I,'canny'); imshow(I1);
總結(jié)
以上是生活随笔為你收集整理的canny算子的运用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laplacian算子的运用
- 下一篇: MATLAB中常用的产生随机数的几种函数