Hello Mat

 找回密码
 立即注册
查看: 3389|回复: 0

Canny算子

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-2-5 11:35:53 | 显示全部楼层 |阅读模式
      Canny边缘检测算法是高斯函数的一阶导数,是对信噪比与定位精度之乘积的最优化逼近算子。Canny算法首先用二维高斯函数的一阶导数,对图像进行平滑;
   传统的Canny算法采用2x2邻域一阶偏导的有限差分来计算平滑后的数据阵列 I(x,y)的梯度幅值和梯度方向。
     Canny算子进行图像边缘检测是较为有效的,检测样本边缘的噪声和焊接位置是精确的,但是焊缝表面质量纹理较不规则,Canny检测纹理较细,增加了计算工作量,对噪声影响较大。
     Canny边缘检测算子程序如下:
  1. %% Canny
  2. clc,clear,close all                    % 清屏、清工作区、关闭窗口
  3. warning off                         % 消除警告
  4. feature jit off                       % 加速代码执行
  5. im=imread('1.jpg');                                  % 载入图像
  6. im=im2double(im);
  7. r=im(:,:,1);g=im(:,:,2);b=im(:,:,3);
  8. % 滤波器平滑系数
  9. filter= [2 4 5 4 2;
  10.          4 9 12 9 4;
  11.          5 12 15 12 5;
  12.          4 9 12 9 4;
  13.          2 4 5 4 2];
  14. filter=filter/115;
  15. % N-dimensional convolution
  16. smim= convn(im,filter);
  17. % imshow(smim);title('Smoothened image');

  18. % 计算梯度
  19. gradXfilt=[-1 0 1;                    % 卷积模板convolution mask
  20.            -2 0 2;
  21.            -1 0 1];
  22. gradYfilt=[1  2   1;                 % 卷积模板 convolution mask
  23.            0  0   0;
  24.           -1  -2  -1];
  25. GradX= convn(smim,gradXfilt);                          % 卷积
  26. GradY= convn(smim,gradYfilt);                          % 卷积
  27. absgrad=abs(GradX)+abs(GradY);                         % 绝对梯度值
  28. % 计算梯度角
  29. [a,b]=size(GradX);
  30. theta=zeros([a b]);
  31. for i=1:a
  32.       for j=1:b
  33.             if(GradX(i,j)==0)
  34.                theta(i,j)=atan(GradY(i,j)/0.000000000001);   % 避免字母为0情况
  35.             else
  36.                 theta(i,j)=atan(GradY(i,j)/GradX(i,j));
  37.             end
  38.       end
  39. end
  40.   theta=theta*(180/3.14);
  41.   for i=1:a
  42.       for j=1:b
  43.             if(theta(i,j)<0)
  44.                 theta(i,j)= theta(i,j)-90;
  45.                 theta(i,j)=abs(theta(i,j));
  46.             end
  47.       end
  48. end
  49.   for i=1:a
  50.       for j=1:b
  51.           if ((0<theta(i,j))&&(theta(i,j)<22.5))||((157.5<theta(i,j))&&(theta(i,j)<181))
  52.                 theta(i,j)=0;
  53.           elseif (22.5<theta(i,j))&&(theta(i,j)<67.5)
  54.                  theta(i,j)=45;
  55.           elseif (67.5<theta(i,j))&&(theta(i,j)<112.5)  
  56.                   theta(i,j)=90;
  57.           elseif (112.5<theta(i,j))&&(theta(i,j)<157.5)
  58.                   theta(i,j)=135;
  59.           end
  60.       end
  61.   end

  62. % non-maximum suppression非极大值抑制
  63. nmx = padarray(absgrad, [1 1]);
  64. [a,b]=size(theta);
  65. for i=2:a-2
  66.     for j=2:b-2
  67.            if (theta(i,j)==135)   % 角度135度
  68.                  if ((nmx(i-1,j+1)>nmx(i,j))||(nmx(i+1,j-1)>nmx(i,j)))
  69.                       nmx(i,j)=0;
  70.                   end
  71.            elseif (theta(i,j)==45)   
  72.                   if ((nmx(i+1,j+1)>nmx(i,j))||(nmx(i-1,j-1)>nmx(i,j)))
  73.                        nmx(i,j)=0;
  74.                   end
  75.            elseif (theta(i,j)==90)   
  76.                   if ((nmx(i,j+1)>nmx(i,j))||(nmx(i,j-1)>nmx(i,j)))
  77.                       nmx(i,j)=0;
  78.                   end
  79.            elseif (theta(i,j)==0)   
  80.                   if ((nmx(i+1,j)>nmx(i,j))||(nmx(i-1,j)>nmx(i,j)))
  81.                       nmx(i,j)=0;
  82.                   end
  83.            end
  84.     end
  85. end

  86. nmx1=im2uint8(nmx);                         % 图像数据类型转换
  87. tl=85;                                                  % 阈值下限lower threshold
  88. th=100;                                                 % 阈值上限upper threshold

  89. % 基于阈值的边界提取
  90. [a,b]=size(nmx1);
  91. gedge=zeros([a,b]);
  92. for i=1:a
  93.     for j=1:b
  94.         if(nmx1(i,j)>th)
  95.              gedge(i,j)=nmx1(i,j);
  96.         elseif (tl<nmx1(i,j))&&(nmx1(i,j)<th)
  97.              gedge(i,j)=nmx1(i,j);
  98.         end
  99.     end
  100. end

  101. [a,b]= size(gedge);
  102. finaledge=zeros([a b]);
  103. for i=1:a
  104.     for j=1:b
  105.         if (gedge(i,j)>th)
  106.             finaledge(i,j)=gedge(i,j);
  107.              for i2=(i-1):(i+1)
  108.                  for j2= (j-1):(j+1)
  109.                      if (gedge(i2,j2)>tl)&&(gedge(i2,j2)<th)
  110.                          finaledge(i2,j2)=gedge(i,j);
  111.                      end
  112.                  end
  113.               end
  114.         end
  115.    end
  116. end

  117. % 去除边界border
  118. finaledge= im2uint8(finaledge(10:end-10,10:end-10));
  119.   
  120. subplot(131);imshow(absgrad);title('image gradients');        % 梯度
  121. subplot(132);imshow(nmx);title('NonMaximum Suppression');  % 非极大值抑制
  122. subplot(133);imshow(finaledge(:,1:452-10));title('canny edge detection');  % Canny边缘检测
复制代码



算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-27 03:14 , Processed in 0.205440 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表