圖像邊緣是圖像的重要信息,而Canny算子則是用于邊緣檢測的經(jīng)典算法。在用Canny算子進行邊緣檢測之前必須有效地抑制噪聲,該算法使用的是高斯平滑濾波。接下來計算圖像中每一點的梯度向量,根據(jù)梯度向量可以得到梯度方向和梯度幅值。梯度方向在(-π,π]范圍內(nèi),將梯度方向離散到4個方向,分別為上下方向、左右方向、主對角線方向、副對角線方向,根據(jù)離散后的梯度方向?qū)μ荻确颠M行非極大值抑制。例如,如果圖像中點(x,y)的梯度方向沿上下方向,那么將點(x,y)的梯度幅值分別與點(x-1,y)和點(x+1,y)的梯度幅值進行比較;如果點(x,y)的梯度幅值大于另外兩點,那么該點有可能是邊緣點,將它的梯度幅值保留;如果點(x,y)的梯度幅值不大于另外兩點,那么該點一定不是邊緣點,將它的梯度幅值置零。接下來,用雙閾值算法檢測和連接邊緣,高閾值用于檢測邊緣,低閾值用于連接邊緣。在該算法中,取高閾值為梯度幅值大值的0.3倍,取低閾值為梯度幅值大值的0.1倍。如果某點的梯度幅值大于高閾值,那么該點一定是邊緣點;如果某點的梯度幅值小于低閾值,那么該點一定不是邊緣點;如果某點的梯度幅值介于低閾值和高閾值之間,那么該點有可能是邊緣點,進一步,如果該點的8鄰域的梯度幅值的大值大于高閾值,那么將該點判定為邊緣點。
創(chuàng)新互聯(lián)主營北碚網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,app軟件定制開發(fā),北碚h5微信小程序開發(fā)搭建,北碚網(wǎng)站營銷推廣歡迎北碚等地區(qū)企業(yè)咨詢二、實現(xiàn)步驟(1)調(diào)用自定義函數(shù)myGauss生成高斯模板,高斯模板的大小和標準差均可以改變;
(2)將原圖像f(x,y)與高斯模板做卷積,得到用高斯濾波器平滑后的圖像g(x,y);
(3)用2×2一階有限差分近似式來計算圖像中各點的梯度向量:
以上兩個公式對應的模板分別如下;
(4)利用梯度向量計算各點的梯度方向和梯度幅值:
(5)將梯度方向離散到4個方向,即上下方向、左右方向、主對角線方向和副對角線方向;
(6)根據(jù)離散后的梯度方向?qū)μ荻确颠M行非極大值抑制。例如,如果圖像中點(x,y)的梯度方向沿上下方向,那么將點(x,y)的梯度幅值分別與點(x-1,y)和點(x+1,y)的梯度幅值進行比較;如果點(x,y)的梯度幅值大于另外兩點,那么該點有可能是邊緣點,將它的梯度幅值保留;如果點(x,y)的梯度幅值不大于另外兩點,那么該點一定不是邊緣點,將它的梯度幅值置零。
(7)用雙閾值算法檢測和連接邊緣。高閾值和低閾值根據(jù)梯度幅值的大值來確定,在該算法中,?。?br />
如果某點的梯度幅值大于高閾值,那么該點一定是邊緣點;如果某點的梯度幅值小于低閾值,那么該點一定不是邊緣點;如果某點的梯度幅值介于低閾值和高閾值之間,那么該點有可能是邊緣點,進一步,如果該點的8鄰域的梯度幅值的大值大于高閾值,那么將該點判定為邊緣點。
(1)原始圖像;
(2)高斯平滑后的圖像;
(3)Canny邊緣檢測的結果。
%% Canny邊緣檢測算子,高斯模板的大小和標準差均可以改變
clear,close all
clc
srcImg = imread('Canny算子用.png');
figure;
imshow(srcImg);
title('原始圖像','fontsize',18);
srcImg = double(srcImg);
[rows,cols] = size(srcImg);
%% 用高斯濾波器平滑圖像
guassMask = myGauss(1,1,0.8);
filteredImg = conv2(srcImg,guassMask,'same');
figure;
imshow(uint8(filteredImg));
title('高斯平滑圖像','fontsize',18);
%% 計算梯度的幅值和方向
maskX = [-1 -1; 1 1];
maskY = [-1 1;-1 1];
gradX = conv2(filteredImg,maskX,'same');
gradY = conv2(filteredImg,maskY,'same');
M = sqrt(gradX.^2+gradY.^2);
theta = atan2(gradY,gradX);
%% 對梯度幅值進行非極大值抑制(向下為X+,向右為Y+)
for i = 1:rows
for j = 1:cols
if (theta(i,j)>=-pi/8 && theta(i,j)=pi*7/8 && theta(i,j)<=pi)||(theta(i,j)>-pi && theta(i,j)<-pi*7/8)
theta(i,j) = 0;
elseif (theta(i,j)>=pi/8 && theta(i,j)=-pi*7/8 && theta(i,j)<-pi*5/8)
theta(i,j) = 45;
elseif (theta(i,j)>=pi*3/8 && theta(i,j)=-pi*5/8 && theta(i,j)<-pi*3/8)
theta(i,j) = 90;
elseif (theta(i,j)>=pi*5/8 && theta(i,j)=-pi*3/8 && theta(i,j)<-pi/8)
theta(i,j) = 135;
end
end
end
NMS = zeros(rows,cols);
for i = 2:rows-1
for j = 2:cols-1
if theta(i,j)==0 && M(i,j)>M(i-1,j) && M(i,j)>M(i+1,j)% 比較中心像素點和上下兩像素點的梯度幅值
NMS(i,j) = M(i,j);
elseif theta(i,j)==45 && M(i,j)>M(i-1,j-1) && M(i,j)>M(i+1,j+1)% 比較中心像素點和主對角線兩像素點的梯度幅值
NMS(i,j) = M(i,j);
elseif theta(i,j)==90 && M(i,j)>M(i,j-1) && M(i,j)>M(i,j+1)% 比較中心像素點和左右兩像素點的梯度幅值
NMS(i,j) = M(i,j);
elseif theta(i,j)==135 && M(i,j)>M(i-1,j+1) && M(i,j)>M(i+1,j-1)% 比較中心像素點和副對角線兩像素點的梯度幅值
NMS(i,j) = M(i,j);
end
end
end
%% 用雙閾值算法檢測和連接邊緣
dstImg = zeros(rows,cols);
thresholdLow = 0.1*max(NMS(:));
thresholdHigh = 0.3*max(NMS(:));
for i = 2:rows-1
for j = 2:cols-1
if NMS(i,j) >thresholdHigh % 若某像素點的梯度幅值大于高閾值,則該像素點為邊緣點
dstImg(i,j) = 1;
elseif NMS(i,j)thresholdHigh % 若某像素點的梯度幅值介于高閾值和低閾值之間,則檢測該像素點的8鄰域是否存在邊緣像素點,如果存在,則該像素點為邊緣點
dstImg(i,j) = 1;
end
end
end
figure;
imshow(dstImg);
title('canny邊緣圖像','fontsize',18);
%% 函數(shù)定義:產(chǎn)生高斯模板
function gaussMask = myGauss(a,b,sigma)
m = 2*a+1;% m為高斯模板的行數(shù)
n = 2*b+1;% n為高斯模板的列數(shù)
gaussMask = zeros(m,n);
sigma2 = sigma*sigma;% sigma為標準差
for i = 1:m
for j = 1:n
gaussMask(i,j) = 1/(2*pi*sigma2)*exp(((i-a-1)*(i-a-1)+(j-b-1)*(j-b-1))/(-2*sigma2));% 計算高斯模板的系數(shù)
end
end
SUM = sum(gaussMask(:));
gaussMask = gaussMask/SUM;% 歸一化
end
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧