canny边缘检测 matlab_canny边缘检测matlab_边缘检测matlab源代码(4)

电脑杂谈  发布时间:2017-02-23 02:27:53  来源:网络整理

& abs( b(rr-1,cc)-b(rr,cc) ) >thresh); % [+ -]'

e((rx+1) + cx*m) = 1;

[rz,cz] = find( b(rr,cc)==0 );

if ~isempty(rz)

% Look for the zero crossings:+0-, -0+ and their transposes

% The edge lies on the Zeropoint

%设定边缘在灰度为0的像素点上

zero = (rz+1) + cz*m; % Linear index for zero points

zz = (b(zero-1) < 0 & b(zero+1) >0 ...

& abs( b(zero-1)-b(zero+1) ) >2*thresh); % [- 0 +]'

e(zero(zz)) = 1;

zz = (b(zero-1) > 0 & b(zero+1) <0 ...

& abs( b(zero-1)-b(zero+1) ) >2*thresh); % [+ 0 -]'

e(zero(zz)) = 1;

zz = (b(zero-m) < 0 & b(zero+m) >0 ...

& abs( b(zero-m)-b(zero+m) ) >2*thresh); % [- 0 +]

e(zero(zz)) = 1;

zz = (b(zero-m) > 0 & b(zero+m) <0 ...

& abs( b(zero-m)-b(zero+m) ) >2*thresh); % [+ 0 -]

e(zero(zz)) = 1;

end

figure('name','LOG'),imshow(e);

%figure('name','DOG'),imshow(e);

​从处理结果来看,DoG不但在计算效率上要由于LOG,而且在处理细节上似乎也要优于LOG。

5.Canny 算子

Canny算子是目前最有效的边缘检测算子。Matlab中的canny边缘检测算法主要实现步骤如下:

1)首先对输入的灰度图像进行高斯平滑滤波;值得注意的是,Matlab的高斯平滑滤波是分x、y两个方向分别进行的,分方向滤波后,再把平滑后的原图像与梯度运算(差分求导)之后的高斯模板进行卷积;根据卷积公式,该操作过程相当于对x、y分别求偏导,能得到x、y两个方向的偏导数。之所以要分两个方向进行,而不是由一个模板一次性完成,是为了得到被处理图像的偏导数dx、dy矩阵,以计算梯度的方向,且模板拆分为小模板还能加快运算速度。

2)计算出梯度和梯度方向(梯度方向在canny边缘检测中大致被分为4种:水平、竖直、45°方向、135°方向,其中梯度方向被量化为一个0-180°之间的角度值,且当被遍历点的梯度角度值在0-22.5°及157.5-180°之间时,则被划分为水平方向,若在22.5-67.5之间则为45°方向,67.5-112.5则被划分为竖直方向,112.5-157.5°则被划分为135°方向),

需要提及的是,在梯度方向的划分上,只是简单的采用了四个方向的梯度分类,但还可以通过双线性插值方法求取当前点在梯度方向上两边点的梯度值,然后再进行梯度值的比较。

3)得到的梯度矩阵中梯度值大的点可能是边缘点,也可能为噪声,在此,遍历梯度矩阵中的每个点,根据该点的梯度方向,找到以该点为中心点的8邻域上与之梯度方向相同的两个点,例如,若中心点梯度方向值为20°,则被划分为水平方向,与z5梯度方向相同的点为z4、z6


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-33967-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 李丹凤
      李丹凤

      和体现人道主义精神

    • 封建化的改革
      封建化的改革

      简直各种感动各种正力量好不好

    • 田振军
      田振军

      四倍音速的鹰击导弹也部署南海

    热点图片
    拼命载入中...