『壹』 Canny邊緣檢測
Canny邊緣檢測是一種使用多種邊緣檢測演算法檢測邊緣的方法。由John F.Canny於1986年提出,並在論文中有詳盡的描述。
1)去噪。雜訊會影響邊緣檢測的准確度。通常採用高斯濾波去除圖像中的雜訊。濾波器的核越大,邊緣信息對雜訊的敏感度就越低。不過,核越大,邊緣檢測的定位錯誤也會隨之增加。通常一個5 X 5的核能滿足大多數情況。
2)計算梯度的幅度與方向。梯度的方向與邊緣的方向是垂直的,通常就取近似值為·水平、垂直、對角線等八個不同的方向。
3)非極大值抑制,即適當地讓邊緣變瘦。在獲得了梯度的幅度和方向後,遍歷圖像中的像素點,去除所有非邊緣的點。具體實現上,判斷當前像素點是否是周圍像素點中具有相同梯度方向的最大值,如果是,則保賀塵留該點;如果不是則抑制(歸零)。
4)確定邊緣。用雙閾值演算法確定最終的邊緣信息。完成之前三步驟後,圖像的強邊緣已經在當前獲取的邊緣圖像內。但一些虛邊緣可能也在邊緣圖像內,這些虛邊緣此拍仿可能是真實的圖像產生的,也可能是由於雜訊產生的(必須將其剔除)。
設置兩個閾值,其中一個為高閾值maxVal,另一個為低閾值minVal。根據當前邊緣像素的梯度值與這兩個閾值之間的森纖關系,判斷邊緣的屬性。如果當前邊緣像素的梯度值不小於maxVal,則將當前邊緣像素標記為強邊緣;如果介於maxVal與minVal之間,則標記為弱邊緣(先保留);如果小於minVal,則抑制當前邊緣像素。之後再判斷虛邊緣是否與強邊緣有連接,有連接,則處理為邊緣;無連接則抑制。
OpenCV提供了cv2.Canny()來實現邊緣檢測:
dst : 為計算得到的邊緣圖像
image: 為8位輸入圖像
threshold1: 表示處理過程中的的第一個閾值
threshold2: 表示處理過程中的的第二個閾值
apertureSize: 表示Sobel運算元的孔徑大小。
L2gradient: 為計算圖像梯度幅度的標識。其默認值是False。如果為True,則使用更精確的L2范數進行計算,否則使用L1范數。
例如:
『貳』 圖片處理-opencv-10.圖像銳化與邊緣檢測
Roberts運算元又稱為交叉微分演算法,它是基於交叉差分的梯度演算法,通過局部差分計算檢測邊緣線條。常用來處理具有陡峭的低雜訊圖像,當圖像邊緣接近於正45度或負45度時,該演算法處理效果更理想。其缺點是對邊緣的定位不太准確,提取的邊緣線條較粗。
Prewitt是一種圖像邊緣檢測的微分運算元,其原理是利用特定區域內像素灰度值產生的差分實現邊緣檢測。由於Prewitt運算元採用3 3模板對區域內的像素值進行計算,而Robert運算元的模板為2 2,故Prewitt運算元的邊緣檢測結果在水平方向和垂直方向均比Robert運算元更加明顯。Prewitt運算元適合用來識別雜訊較多、灰度漸變的圖像。
dst = filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
RSobel運算元是一種用於邊緣檢測的離散微分運算元,它結合了高斯平滑和微分求導。該運算元用於計算圖像明暗程度近似值,根據圖像邊緣旁邊明暗程度把該區域內超過某個數的特定點記為邊緣。Sobel運算元在Prewitt運算元的基礎上增加了權重的概念,認為相鄰點的距離遠近對當前像素點的影響是不同的,距離越近的像素點對應當前像素的影響越大,從而實現圖像銳化並突出邊緣輪廓。Sobel運算元的邊緣定位更准確,常用於雜訊較多、灰度漸變的圖像。
Sobel運算元根據像素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對雜訊具有平滑作用,提供較為精確的邊緣方向信息。因為Sobel運算元結合了高斯平滑和微分求導(分化),因此結果會具有更多的抗噪性,當對精度要求不是很高時,Sobel運算元是一種較為常用的邊緣檢測方法。
dst = Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
在進行Sobel運算元處理之後,還需要調用convertScaleAbs()函數計算絕對值,並將圖像轉換為8點陣圖進行顯示
dst = convertScaleAbs(src[, dst[, alpha[, beta]]])
拉普拉斯(Laplacian)運算元是n維歐幾里德空間中的一個二階微分運算元,常用於圖像增強領域和邊緣提取。它通過灰度差分計算鄰域內的像素,基本流程是:判斷圖像中心像素灰度值與它周圍其他像素的灰度值,如果中心像素的灰度更高,則提升中心像素的灰度;反之降低中心像素的灰度,從而實現圖像銳化操作。在演算法實現過程中,Laplacian運算元通過對鄰域中心像素的四方向或八方向求梯度,再將梯度相加起來判斷中心像素灰度與鄰域內其他像素灰度的關系,最後通過梯度運算的結果對像素灰度進行調整。
Laplacian運算元分為四鄰域和八鄰域,四鄰域是對鄰域中心像素的四方向求梯度,八鄰域是對八方向求梯度。當鄰域內像素灰度相同時,模板的卷積運算結果為0;當中心像素灰度高於鄰域內其他像素的平均灰度時,模板的卷積運算結果為正數;當中心像素的灰度低於鄰域內其他像素的平均灰度時,模板的卷積為負數。對卷積運算的結果用適當的衰弱因子處理並加在原中心像素上,就可以實現圖像的銳化處理。
dst = Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
由於Sobel運算元在計算相對較小的核的時候,其近似計算導數的精度比較低,比如一個33的Sobel運算元,當梯度角度接近水平或垂直方向時,其不精確性就越發明顯。Scharr運算元同Sobel運算元的速度一樣快,但是准確率更高,尤其是計算較小核的情景,所以利用3*3濾波器實現圖像邊緣提取更推薦使用Scharr運算元
Scharr運算元又稱為Scharr濾波器,也是計算x或y方向上的圖像差分,在OpenCV中主要是配合Sobel運算元的運算而存在的。Scharr運算元的函數原型如下所示,和Sobel運算元幾乎一致,只是沒有ksize參數.
dst = Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]]])
Canny邊緣檢測運算元(多級邊緣檢測演算法)是一種被廣泛應用於邊緣檢測的標准演算法,其目標是找到一個最優的邊緣檢測解或找尋一幅圖像中灰度強度變化最強的位置。最優邊緣檢測主要通過低錯誤率、高定位性和最小響應三個標准進行評價。
Canny運算元的實現步驟如下:
edges = Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
LOG(Laplacian of Gaussian)邊緣檢測運算元也稱為Marr&Hildreth運算元,它根據圖像的信噪比來求檢測邊緣的最優濾波器。該演算法首先對圖像做高斯濾波,然後再求其拉普拉斯(Laplacian)二階導數,根據二階導數的過零點來檢測圖像的邊界,即通過檢測濾波結果的零交叉(Zero crossings)來獲得圖像或物體的邊緣。
LOG運算元該綜合考慮了對雜訊的抑制和對邊緣的檢測兩個方面,並且把Gauss平滑濾波器和Laplacian銳化濾波器結合了起來,先平滑掉雜訊,再進行邊緣檢測,所以效果會更好。 該運算元與視覺生理中的數學模型相似,因此在圖像處理領域中得到了廣泛的應用。它具有抗干擾能力強,邊界定位精度高,邊緣連續性好,能有效提取對比度弱的邊界等特點。
『叄』 圖像卷積與邊緣檢測
邊緣檢測是圖像處理和計算機視覺中,尤其是特徵提取中的一個研究領域。
先灰度化,再用低通濾波器降噪,用高通濾波器提取邊緣,最後二值化。
低通濾波器見前面我發布的圖像預處理,下面講的都是高通濾波器。
為了提取到圖像的邊緣,我們需要濾波器的幫助。這類濾波器以矩陣的形式存在,通常被稱為卷積核,就是一些值網格,能夠對圖像進行修改。
對於圖像的每一個像素點,計算它的鄰歲磨握域像素和濾波器矩陣的對應元素的乘積,然後加起來,作為該像素位置的值。這樣就完成了濾波過程。這種計算被稱為圖像卷積。
濾波器的大小應該是奇數,這樣它才有一個中心,例如3x3,5x5或者7x7。有中心了,也有了半徑的稱呼,例如5x5大小的核的半徑就是2。
索貝爾過濾器常用於邊緣檢測和發現圖像中的強度模式。向圖像中應用索貝爾過濾器就相當於沿著 x 或 y 方向求圖像的(近似)導數。
Sobel_x和 Sobel_y的運算符分別如下所示:
Laplace運算元是一種各向同性運算元,二階微分運算元,在只關心邊緣的位置而不考慮其周圍的像素灰度差值時比較合適。
Laplace運算元對孤立象素的響應要比對邊緣或線的響應要更強烈,因此只適用於無雜訊圖象。存在雜訊情況下,使用Laplacian運算元檢測邊緣之前需要先進行低通濾波。
了解更多
Canny邊緣檢測是一種非常流行的邊緣檢測演算法,是John Canny在1986年提出的。它是一個多階段的演算法,即由多個步驟構成。
首先,圖像降噪。我們知道梯度運算元可以用於增強圖像,本質上是通過增強邊緣輪廓來實現的,也就是說是可以檢測到邊緣的。但是,它們受雜訊的影響都很大。那麼,我們第一步就是想到要先去除雜訊,因為雜訊就是灰度變化很大乎慶的地方,所以容易被識別為偽邊緣。
第二步,計算圖像梯度,得到可能邊緣。計算圖像梯度能夠得到圖像的邊緣,因為梯度是灰度變化明顯的地方,而邊緣也是灰度變化明顯的地方。當然這一步只能得到可能的邊緣。因為灰度變化的地方可能是邊緣,也可能不是邊緣。這一步就有了所有可能是邊緣的集合。
第三步,非極大值抑制。通常灰度變化的地方都比較集中,將局部范圍內的梯度方向上,灰度變化最大的保留下來,其它的不保留,這樣可以剔除掉一大部分的點。將有多個像素寬的邊緣變成一個單像素寬的邊緣。即「胖邊緣」變成「瘦邊緣」。
第四步,雙閾值篩選。通過非極大值抑制後,仍然有很多的可能邊緣點,進一步的設置一個雙閾值,即低閾值(low),高閾值(high)。灰度變游首化大於high的,設置為強邊緣像素,低於low的,剔除。在low和high之間的設置為弱邊緣。進一步判斷,如果其領域內有強邊緣像素,保留,如果沒有,剔除。這樣做的目的是只保留強邊緣輪廓的話,有些邊緣可能不閉合,需要從滿足low和high之間的點進行補充,使得邊緣盡可能的閉合。
『肆』 Canny邊緣檢測演算法的步驟和理解
姓名:高強 學號:17011210057
【嵌牛導讀】:本文主要介紹Canny圖像邊緣檢測演算法的步驟和對各個步驟的理解
【嵌牛鼻子】:邊緣檢測,Canny,步驟
【嵌牛提問】:canny邊緣檢測演算法的步驟是怎樣?
【嵌牛正文】:
1. Canny邊緣檢測演算法的提出和指標
Canny演算法是John Canny在1986年提出的,那年John Canny 28歲,該文章發表在PAMI頂級期刊上(1986.IEEE Transactions on Pattern Analysis and Machine Intelligence,vol. 8, 1986 , pp 679-698 )。
Canny運算元與Marr(LoG)邊緣檢測方法類似(Marr大爺號稱計算機視覺之父),也屬於是先平滑後求導數的方法。John Canny研究了最優邊緣檢測方法所需的特性,給出了評價邊緣檢測性能優劣的三個指標:
(1)好的信噪比 ,即將非邊緣點判定為邊緣點的概率要低,將邊緣點判為非邊緣點的概率要低;
(2)高的定位性能 ,即檢測出的邊緣點要盡可能在實際塵友邊緣的中心;
(3)對單一邊緣僅有唯一響應 ,即單個邊緣產生多個響應的概率要低,並且虛假響應邊緣應該得到最大抑制。
用一句話說,就是希望在提高對景物邊緣的敏感性的同時,可以抑制雜訊的方法才是好的邊緣提取方法。
2. Canny邊緣檢測演算法的步驟 :
(1)圖像高斯濾波進行降噪處理。
(2)用一階偏導的有限差分計算梯度告森的幅值和方向。
(3)對梯度幅值進行非極大值抑制。
(4)用雙閾值演算法檢測和連接邊緣。
3. Canny邊緣檢測演算法的通俗理解
Canny演算法的目的就是邊緣檢測,何為邊緣?圖象局部區域亮度變化顯著的部分,對於灰度圖像來說,也就是灰度值有一個明顯變化,既從一個灰度值在很小的緩沖區域內急劇變化到另一個灰度相差較大的灰度值。那麼襪兄畝怎麼表徵這種灰度值的變化呢?這里想到的就是導數微分,導數就是表徵變化率的,但是數字圖像都是離散的,也就是導數肯定會用差分來代替。也就是具體演算法中的步驟2,用相鄰像素的差分來計算梯度的大小和方向。但是在真實的圖像中,一般會有雜訊,雜訊會影響梯度的計算,所以步驟1要先濾波。理論上將圖像梯度幅值的元素值越大,說明圖像中該點的梯度值越大,但這不能說明該點就是邊緣。在Canny演算法中,步驟3的非極大值抑制是進行邊緣檢測的重要步驟,通俗意義上是指尋找像素點的局部最大值,沿著梯度方向,比較它前面和後面的梯度值,若梯度值局部最大則有可能為邊緣像素,進行保留,否則就進行抑制。步驟4是一個典型演算法,有時候我們並不能一刀切,也就是超過閾值的都是邊緣點,而是設兩個閾值,希望在高閾值和低閾值之間的點也可能是邊緣點,而且這些點最好在高閾值的附近,也就是說這些中間閾值的點是高閾值邊緣點的一種延伸。所以步驟4用了雙閾值來進行檢測和連接邊緣。雙閾值有時也叫做滯後閾值。
『伍』 圖像邊緣檢測演算法有哪些
早期的有邊緣運算元法、曲線擬合法、模板匹配法、門限化法。近年來又有許多新的邊緣檢測的演算法:小波變換、小波包的邊緣檢測等,基於數學形態學、模糊理論和神經網路的邊緣檢測演算法等。
『陸』 Matlab邊緣檢測問題
用mesh語句似乎可以,具體也不了解你的情況,感覺怪怪的,發一段我以前些的程序,用羅伯特運算元寫的,把運算元一改就是sobel了。兩種邊緣檢測近似演算法奉上:
clc
close all
clear all
%%%生成高斯平滑濾波模板%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
hg=zeros(3,3); %設定高斯平滑濾波模板的大小為3*3
delta=0.5;
for x=1:1:3
for y=1:1:3
u=x-2;
v=y-2;
hg(x,y)=exp(-(u^2+v^2)/(2*pi*delta^2));
end
end
h=hg/sum(hg(:));
%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%讀入圖像%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%
f = imread('1111.tif'); % 讀入圖像文件
f=rgb2gray(im2double(f));
imshow(f)
title('原始圖像');
[m,n]=size(f);
ftemp=zeros(m,n);
rowhigh=m-1;
colhigh=n-1;
%%%高斯濾波%%%
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
A=h.*mod;
ftemp(x,y)=sum(A(:));
end
end
f=ftemp
figure,imshow(f)
title('通過高斯濾波器後的圖像');
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %%%利用roberts運算元進行邊緣檢測%%%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=sqrt((sum(fsx(:)))^2+(sum(fsy(:)))^2);
end
end
fr=im2uint8(ftemp);
figure,imshow(fr)
title('用roberts運算元邊緣檢測的原始圖像');
%%%域值分割%%%
TH1=60; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fr(x,y)>=TH1)&((fr(x,y-1) <= fr(x,y)) & (fr(x,y) > fr(x,y+1)) )
fr(x,y)=200;
elseif(fr(x,y)>=TH1)&( (fr(x-1,y) <=fr(x,y)) & (fr(x,y) >fr(x+1,y)))
fr(x,y)=200;
else fr(x,y)=50;
end
end
end
figure,imshow(fr)
title('用roberts運算元邊緣檢測並細化後的圖像');
%%%%%%%%%%%%%%%%%%%%%%%%%%
利用第一種近似演算法進行邊緣檢測%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%3*3的sobel運算元%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
%sx=[0 1 2;-1 0 1;-2 -1 0];
%sy=[-2 -1 0;-1 0 1;0 1 2];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=abs(sum(fsx(:)))+abs(sum(fsy(:)));
end
end
fs=im2uint8(ftemp);
figure,imshow(fs)
title('用第一種近似演算法進行邊緣檢測的原始圖像');
%%%域值分割%%%
TH2=200; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH2)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200;
elseif(fs(x,y)>=TH2)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200;
else fs(x,y)=50;
end
end
end
figure,imshow(fs)
title('採用第一種近似演算法進行邊緣檢測後的圖像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%利用第二種近似演算法進行邊緣檢測%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%3*3的sobel運算元%%%%%%%%
sx=[-1 -2 -1;0 0 0;1 2 1];
sy=[-1 0 1;-2 0 2;-1 0 1];
%sx=[0 1 2;-1 0 1;-2 -1 0];
%sy=[-2 -1 0;-1 0 1;0 1 2];
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
mod=[f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1);f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
fsx=sx.*mod;
fsy=sy.*mod;
ftemp(x,y)=max(abs(sum(fsx(:))),abs(sum(fsy(:))));
end
end
fs=im2uint8(ftemp);
figure,imshow(fs)
title('用第二種近似演算法進行邊緣檢測的原始圖像');
%%%域值分割%%%
TH2=200; %設定閾值
for x=2:1:rowhigh-1
for y=2:1:colhigh-1
if (fs(x,y)>=TH2)&((fs(x,y-1) <= fs(x,y)) & (fs(x,y) > fs(x,y+1)) )
fs(x,y)=200;
elseif(fs(x,y)>=TH2)&( (fs(x-1,y) <=fs(x,y)) & (fs(x,y) >fs(x+1,y)))
fs(x,y)=200;
else fs(x,y)=50;
end
end
end
figure,imshow(fs)
title('採用第二種近似演算法進行邊緣檢測後的圖像');
『柒』 邊緣檢測的Sobel邊緣檢測
Soble邊緣檢測演算法比較簡,實際應用中效率比canny邊緣檢測效率要高孝閉陸巧頃,但是邊緣不如Canny檢測的准確,但是很多實際應用的場合,sobel邊緣卻是首選,尤其是對效率要求較高,而對細紋理不太關心的時候。
Soble邊緣檢測通常帶有方向性,可以只檢測豎直邊緣或垂直邊緣或都檢測。
所以我們先定義兩個梯度方向的系數:
kx=0;ky=1;% horizontal kx=1;ky=0;% vertical kx=1;ky=1;% both
然後我們來計算梯度圖像,我們知道邊緣點其實就是圖像中灰度跳變劇烈的點,所以先計算梯度圖像,然後將梯度圖像中較亮的那一部分提取出來就是簡單的邊緣部分。
Sobel運算元用了一個3*3的濾波器來對圖像進行濾波從而得到梯度圖像,這裡面不再態手詳細描述怎樣進行濾波及它們的意義等。
豎起方向的濾波器:y_mask=op = [-1 -2 -1;0 0 0;1 2 1]/8;
水平方向的濾波器:op的轉置:x_mask=op』;
定義好濾波器後,我們就開始分別求垂直和豎起方向上的梯度圖像。用濾波器與圖像進行卷積即可:
bx = abs(filter2(x_mask,a)); by = abs(filter2(y_mask,a));
上面bx為水平方向上的梯度圖像,by為垂直方向上的梯度圖像。為了更清楚的說明演算法過程,下面給出一張示例圖像的梯度圖像。
『捌』 怎樣理解微分運算元可以檢測圖像的邊界
常見的邊緣檢測運算元有Roberts運算元、Prewitt運算元、Sobel運算元、Marr-Hidreth邊緣檢測以及canny運算元等。
一、利用梯度進行哪汪早邊緣檢測
1、Roberts運算元採用對角線方向相鄰兩像素之差近似的梯度幅值來檢測邊緣。該運算元定位較准確,但對雜訊比較敏感,檢測水平和豎直邊緣效果好於斜向李雀邊緣。
2、Sobel運算元根據圖陵孝像的像素點上下、左右鄰點灰度加權差在邊緣處達到極值這一特點來檢測邊緣。該運算元對雜訊有較好的平滑作用,能提供建准確的邊緣方向信息,但是邊緣定位精度不高。
3、Prewitt運算元邊緣檢測的思路與Sobel運算元類似,也是在一個掩模中定義微分運算。運算元對雜訊具有平滑作用,同樣定位精度不夠高。
二、更為先進的邊緣檢測技術
1、Marr-Hildreth演算法(拉普拉斯運算元)
(1)採用高斯低通濾波器對圖像進行濾波;
(2)採用拉普拉斯模板對進行卷積;
(3)找到步驟(2)所得圖像的零交叉。
該運算元是二階微分運算元,利用邊緣點處二階導函數出現零交叉原理來檢測圖像的邊緣。對灰度突變及雜訊較敏感,不具有方向性,不能獲得圖像邊緣的方向信息。
2、Canny運算元
Canny邊緣檢測演算法步驟:
(1)用一個高斯濾波器平滑輸入圖像
(2)計算梯度幅值圖像和角度圖像
(3)對梯度幅值圖像進行非最大抑制
(4)用雙閾值處理和連接分析來檢測並連接邊緣
Canny運算元是上述中效果最好的運算元,該運算元去噪能力強,在連續性、細度和筆直度等線的質量方面也很出眾。但是Canny運算元的性能帶來的問題是:連接起來更復雜、執行時間較長。
綜上所述,在實際工業生產中,要求實時性較高的情況下,通常採用閾值梯度的方法;當對質量要求較高時,可選擇更為先進的方法,尤其是Canny運算元。
『玖』 canny演算法的演算法的實現步驟
Canny邊緣檢測演算法可以分為以下5個步驟: 應用高斯濾波來平滑圖像,目的是去除雜訊 找尋圖像的強度梯度(intensity gradients) 應用非最大抑制(non-maximum suppression)技術來消除邊誤檢(本來不是但檢測出來是) 應用雙閾值的方法來決定可能的(潛在的)邊界 利用滯後技術來跟蹤邊界 1. 圖像平滑(去雜訊)
任何邊緣檢測演算法都不可能在未經處理的原始數據上很好地工作,所以第一步是對原始數據與高斯 mask 作卷積,得到的圖像與原始圖像相比有些輕微的模糊(blurred)。這樣,單獨的一個像素雜訊在經過高斯平滑的圖像上變得幾乎沒有影響。以下為一個5X5高斯濾波器(高斯核,標准差delta=1.4),其中A為原始圖像,B為平滑後的圖像。
2. 尋找圖像中的強度梯度
Canny演算法的基本思想是找尋一幅圖相中灰度強度變化最強的位置。所謂變化最強,即指梯度方向。平滑後的圖像中每個像素點的梯度可以由Sobel運算元(一種卷積運算)來獲得(opencv中有封裝好的函數,可以求圖像中每個像素點的n階導數)。首先,利用如下的核來分別求得沿水平(x)和垂直(y)方向的梯度G_X和G_Y。
K_{GX} = [-1 0 1 ; -2 0 2 ; -1 0 1], K_{GY} = {1 2 1 ; 0 0 0 ; -1 -2 -1}
之後便可利用公式來求得每一個像素點的梯度度量值(gradient magnitude,可能翻譯得不準確)。
,有時為了計算簡便,也會使用G_X和G_Y的無窮大范數來代替二范數。把平滑後的圖像中的每一個點用G代替,可以獲得如下圖像。從下圖可以看出,在變化劇烈的地方(邊界處),將獲得較大的梯度度量值G,對應的顏色為白色。然而,這些邊界通常非常粗,難以標定邊界的真正位置。為了做到這一點(參考非極大抑制Non-maximum suppression一節),還必須存儲梯度方向,其公式如下圖所示。也就是說在這一步我們會存數兩塊數據,一是梯度的強度信息,另一個是梯度的方向信息。
3. 非極大抑制Non-maximum suppression
這一步的目的是將模糊(blurred)的邊界變得清晰(sharp)。通俗的講,就是保留了每個像素點上梯度強度的極大值,而刪掉其他的值。對於每個像素點,進行如下操作:
a) 將其梯度方向近似為以下值中的一個(0,45,90,135,180,225,270,315)(即上下左右和45度方向)
b) 比較該像素點,和其梯度方向正負方向的像素點的梯度強度
c) 如果該像素點梯度強度最大則保留,否則抑制(刪除,即置為0)
為了更好的解釋這個概念,看下圖。
圖中的數字代表了像素點的梯度強度,箭頭方向代表了梯度方向。以第二排第三個像素點為例,由於梯度方向向上,則將這一點的強度(7)與其上下兩個像素點的強度(5和4)比較,由於這一點強度最大,則保留。處理後效果如下圖所示。
上圖中,可以想像,邊界處的梯度方向總是指向垂直於邊界的方向,即最後會保留一條邊界處最亮的一條細線。
4.雙閾值(Double Thresholding)
經過非極大抑制後圖像中仍然有很多雜訊點。Canny演算法中應用了一種叫雙閾值的技術。即設定一個閾值上界和閾值下界(opencv中通常由人為指定的),圖像中的像素點如果大於閾值上界則認為必然是邊界(稱為強邊界,strong edge),小於閾值下界則認為必然不是邊界,兩者之間的則認為是候選項(稱為弱邊界,weak edge),需進行進一步處理。經過雙閾值處理的圖像如下圖所示
上圖中右側強邊界用白色表示,弱邊界用灰色表示。
5.利用滯後的邊界跟蹤
這里就不細作解釋了。大體思想是,和強邊界相連的弱邊界認為是邊界,其他的弱邊界則被抑制。
以上內容均翻譯自參考文獻【4】
上一個網路版本:
圖像中的邊緣可能會指向不同的方向,所以 Canny 演算法使用 4 個 掩模(mask) 檢測水平、垂直以及對角線方向的邊緣。原始圖像與每個 mask 所作的卷積都存儲起來。對於每個點我們都標識在這個點上的最大值以及生成的邊緣的方向。這樣我們就從原始圖像生成了圖像中每個點亮度梯度圖以及亮度梯度的方向。以下兩個公式分別求取高斯濾波後圖像的梯度幅值及其方向的表達式。這一步,也叫稱為非極大抑制(Non-maximum suppression)。
3. 在圖像中跟蹤邊緣
較高的亮度梯度比較有可能是邊緣,但是沒有一個確切的值來限定多大的亮度梯度是邊緣多大又不是,所以 Canny 使用了滯後閾值。
滯後閾值(Hysteresis thresholding) 需要兩個閾值,即高閾值與低閾值。假設圖像中的重要邊緣都是連續的曲線,這樣我們就可以跟蹤給定曲線中模糊的部分,並且避免將沒有組成曲線 的雜訊像素當成邊緣。所以我們從一個較大的閾值開始,這將標識出我們比較確信的真實邊緣,使用前面導出的方向信息,我們從這些真正的邊緣開始在圖像中跟蹤 整個的邊緣。在跟蹤的時候,我們使用一個較小的閾值,這樣就可以跟蹤曲線的模糊部分直到我們回到起點。
一旦這個過程完成,我們就得到了一個二值圖像,每點表示是否是一個邊緣點。
一個獲得亞像素精度邊緣的改進實現是在梯度方向檢測二階方向導數的過零點,它在梯度方向的三階方向導數滿足符號條件。
滯後閾值也可以用於亞像素邊緣檢測。