整理自关于通过matlab实现Canny边缘处理的一些笔记_matlab canny-CSDN博客
img = imread();
%% ========== CANNY ===========
TH = 0.5;
TL = 0.1;
k = 1;
c = 1;
% CANNY 1.gaussian filter
grayimg=load(img).result;
H=fspecial('gaussian',[2*k+1,2*k+1],c);
imgG=imfilter(grayimg, H, 'replicate');
% CANNY 2.梯度计算
sx=[1 0 -1;2 0 -2;1 0 -1];
imgx=imfilter(imgG,sx,'replicate');
sy=[1 2 1; 0 0 0;-1 -2 -1];
imgy=imfilter(imgG,sy,'replicate');
%梯度值
G=sqrt(imgx.^2+imgy.^2);
%梯度方向
G_d=atand(imgy./imgx);
%给空值赋0
for y=1:size(G,1)
for x=1:size(G,2)
if ismissing(G_d(y,x))
G_d(y,x)=90;
end
end
end
%判断梯度方向, 梯度方向分别为上下,左右,/,\,
G_s=zeros(size(grayimg,1),size(grayimg,2));
for y=1:size(G_d,1)
for x=1:size(G_d,2)
if (G_d(y,x)> 67.5 & G_d(y,x)<= 90 )| (G_d(y,x)< -67.5 & G_d(y,x)>= -90)
G_s(y,x)=1;
end
if (G_d(y,x)> 22.5 & G_d(y,x)<= 67.5 )
G_s(y,x)=2;
end
if (G_d(y,x)>= -22.5 & G_d(y,x)<= 22.5 )
G_s(y,x)=3;
end
if (G_d(y,x)>= -66.5 & G_d(y,x)< -22.5 )
G_s(y,x)=4;
end
end
end
% CANNY 3.NMS
G0=zeros(size(G,1)+2,size(G,2)+2);
G0(2:(size(G,1)+1),2:(size(G,2)+1))=G;
G_d=G;
for y=1:size(G,1)
for x=1:size(G,2)
if G_s(y,x)==1
if G0(y+1,x+1) < max(G0(y+1+1,x+1),G0(y+1-1,x+1))
G_d(y,x)=0;
end
end
if G_s(y,x)==2
if G0(y+1,x+1) < max(G0(y+1-1,x+1+1),G0(y+1+1,x+1-1))
G_d(y,x)=0;
end
end
if G_s(y,x)==3
if G0(y+1,x+1) < max(G0(y+1,x+1-1),G0(y+1,x+1+1))
G_d(y,x)=0;
end
end
if G_s(y,x)==4
if G0(y+1,x+1) < max(G0(y+1+1,x+1+1),G0(y+1-1,x+1-1))
G_d(y,x)=0;
end
end
end
end
% CANNY 4. double thresholds postprocessing
G_t=G_d;
%加个边
G0=zeros(size(G,1)+2,size(G,2)+2);
G0(2:(size(G,1)+1),2:(size(G,2)+1))=G_d;
for y=1:size(G_d,1)
for x=1:size(G_d,2)
if G_d(y,x)>=TH
elseif G0(y,x)<= TL
G_t(y,x)=0;
elseif G0(y,x)> TL & G0(y,x)< TH
if (G0(y+1,x+1)>=TH | G0(y+1,x)>=TH | G0(y+1,x-1)>=TH | G0(y,x+1)>=TH ...
| G0(y,x-1)>=TH | G0(y-1,x+1)>=TH | G0(y-1,x)>=TH | G0(y-1,x-1)>=TH)
else
G_t(y,x)=0;
end
end
end
end
figure, imshow(G_t);
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/npu_noj/article/details/127564082