资源简介

该算法为canny算子边缘检测,与matlab自带函数效果一致,程序可运行。有对比效果,并有很多注释。

资源截图

代码片段和文件信息

f=imread(‘大米.jpg‘);
f1 = rgb2gray(f);
f1=double(f1);
edg=edge(f1‘canny‘);
figure
subplot(121)
imshow(edg)
%高斯滤波:
h = fspecial(‘gaussian‘[3 3]1);%建立3*3高斯滤波模板
f2 = imfilter(f1h‘conv‘‘replicate‘);%将滤波模板与图像进行卷积
 
%计算梯度幅值和方向
[linerow] = size(f2);
w=fspecial(‘sobel‘);%方法三
gx=imfilter(f2w‘replicate‘);      %求横边缘
w=w‘;
gy=imfilter(f2w‘replicate‘);      %求竖边缘
grad=sqrt(gx.^2+gy.^2);   
angle = zeros(linerow);
for i = 2:line-1 %计算梯度方向
    for j = 2:row-1
        angle(ij) = atan(gx(ij)/gy(ij));
    end
end
gradtemp=grad;
 
%对梯度幅值进行非极大值抑制
for i = 2:line-1
    for j = 2:row-1
        if gradtemp(ij) ~= 0
           if angle(ij) > 0 && angle(ij) < pi/4
               w = angle(ij)/(pi/4);
               d1 = (1-w)*grad(ij+1)+w*grad(i-1j+1);
               d2 = (1-w)*grad(ij-1)+w*grad(i+1j-1);
              if gradtemp(ij) < d1 || gradtemp(ij) < d2
                  gradtemp(ij) = 0;
              end
           end
           if angle(ij) > pi/4 && angle(ij) < pi/2
               w = (angle(ij)-pi/4)/(pi/4);
               d1 = (1-w)*grad(i-1j)+w*grad(i-1j+1);
               d2 = (1-w)*grad(i+1j)+w*grad(i+1j-1);
              if gradtemp(ij) < d1 || gradtemp(ij) < d2
                  gradtemp(ij) = 0;
              end
           end
           if angle(ij) > (-pi/4) && angle(ij) < 0
               w = angle(ij)/(-pi/4);
               d1 = (1-w)*grad(ij+1)+w*grad(i+1j+1);
               d2 = (1-w)*grad(ij-1)+w*grad(i-1j-1);               
              if gradtemp(ij) < d1 || gradtemp(ij) < d2
                  gradtemp(ij) = 0;
              end
           end
           if angle(ij) < -pi/4 && angle(ij) > -pi/2
               w =(angle(ij)+pi/4)/(-pi/4);
               d1 = (1-w)*grad(i+1j)+w*grad(i+1j+1);
               d2 = (1-w)*grad(i-1j)+w*grad(i-1j-1); 
              if gradtemp(ij) < d1 || gradtemp(ij) < d2
                  gradtemp(ij) = 0;
              end
           end
           if angle(ij) == 0
              if gradtemp(ij) < grad(ij+1) || gradtemp(ij) < grad(ij-1)
                  gradtemp(ij) = 0;
              end
           end
           if angle(ij) == pi/4
              if gradtemp(ij) < grad(i-1j+1) || gradtemp(ij) < grad(i+1j-1)
                  gradtemp(ij) = 0;
              end
           end
           if angle(ij) == pi/2
              if gradtemp(ij) < grad(i-1j) || gradtemp(ij) < grad(i+1j)
                  gradtemp(ij) = 0;
              end
           end
           if angle(ij) == (-pi/4)
              if gradtemp(ij) < grad(i+1j+1) || gradtemp(ij) < grad(i-1j-1)
                  gradtemp(ij) = 0;
              end
           end
        else 
            gradtemp(ij) = grad(ij);
        end
    end
end
%高低阈值

m1=70;
m2=5;

%连接边缘
for i = 2:line-1
   for j = 2:row-1
       if gradtemp(ij) <= m2
          gradtemp(ij) = 0;
       elseif g

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3583  2019-03-30 22:40  canny\cannytest.m

     文件      10746  2019-03-31 10:07  canny\Untitled9.m

     文件      35163  2019-03-30 20:41  canny\大米.jpg

     文件      11667  2019-03-30 20:41  canny\大肠杆菌.jpg

     文件      31039  2019-03-30 20:41  canny\红细胞.jpg

     目录          0  2019-03-31 10:25  canny

----------- ---------  ---------- -----  ----

                92198                    6


评论

共有 条评论