CANNY边缘检测 matlab代码

整理自关于通过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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值