[直接在matlab中致电canny]

电脑杂谈  发布时间:2020-03-27 13:18:10  来源:网络整理

matlab canny算子边缘检测函数代码_canny边缘检测+matlab_canny算子边缘检测 matlab

Canny边缘检测算子是边缘函数中的边缘检测算法. 具体的调用格式如下:

(1)edge(I,'canny',Thresh,sigma);

I: 输入图像;

‘edge’: 指定所使用的边缘检测运算符为“ canny”运算符;

Thresh: 这是一个具有两个或一个元素或为空的矩阵. 当包含两个元素时,它们分别指示canny运算符的上限和下限(均大于0且小于1);仅当设置一个值时,该值是上限阈值,下限阈值指定为上限阈值的0.4倍. 当Thresh矩阵为空时,该算法通过假设无边界像素的数量不超过像素总数的70%来发现. 设置了上限,将下限指定为下限的0.4倍.

Sigma: sigma指定算法使用的高斯模板滤波的标准偏差. 如果未指定sigma,则默认值为1;

(2)edge(I,'canny',Thresh,);

这时,每个参数的含义与上面相同,给出sigma,算法给出默认值1.

canny算子边缘检测 matlab_matlab canny算子边缘检测函数代码_canny边缘检测+matlab

(3)edge(I,'canny');

这时,没有给出Thresh和sigma. 阈值由算法生成. sigma的默认值为1.

Canny算法的实现:

(1)图像平滑(去噪)

算法指定GaussianDieOff = .0001;构造一个高斯函数exp(-(pw. * pw)/(2 * ssq)),其中pw = 1: 30和ssq = sigma ^2. 在函数中找到最后一个pw,该值大于GaussianDieOff的值函数,然后将一维高斯滤波器模板的宽度设置为2pw +1,但是如果ssq的值太小,则pw的值可能不存在. = 3;

在获得高斯模板宽度的情况下,请使用高斯函数exp(-(t. * t)/(2 * ssq))/(2 * pi * ssq)生成一维高斯滤波模板

获取一维高斯滤波模板后,使用一维模板对原始图像执行行(x方向)滤波,然后执行列(y方向)滤波以获得平滑图像aSmooth.

(2)求出平滑图像中每个点的梯度大小

matlab canny算子边缘检测函数代码_canny算子边缘检测 matlab_canny边缘检测+matlab

获得平滑图像后,使用高斯函数dgau2D = -x的一阶差分模板dgau2D. * exp(-(x. * x + y. * y)/(2 * ssq))/(pi * ssq)分别计算x和y方向的偏导数:

ax =过滤器(aSmooth,dgau2D,“ conv”,“复制”);

ay =过滤器(aSmooth,dgau2D','conv','复制');

然后计算并归一化每个像素的梯度大小:

mag = sqrt((ax. * ax)+(ay. * ay));

magmax = max(mag(: ));

mag = mag / magmax;

在Thresh = []的情况下,算法提供Thresh时将使用此处的mag.

matlab canny算子边缘检测函数代码_canny算子边缘检测 matlab_canny边缘检测+matlab

(3)梯度幅度的非最大抑制

将梯度方向划分为8个小区域,并将这8个小区域中关于中心像素点对称的区域合并为4 1(1),2(2),3(3)的大区域),4(4),属于区域1(1)的像素在x方向上的部分ix和在y方向上的部分导数iy应该满足(iy <= 0&ix> -iy)| (iy> = 0&ix <-iy)[y正面方向(向下),x正面方向(左)]

相同:

区域2(2): (ix> 0&-iy> = ix)| (ix <0&-iy <= ix)

区域3(3): (ix <= 0&ix> iy)| (ix> = 0&ix

区域4(4): (iy <0&ix <= iy)| (iy> 0&ix> = iy)

对于划分区域后的像素,请使用函数语句:

v = mod(idx,m);

matlab canny算子边缘检测函数代码_canny边缘检测+matlab_canny算子边缘检测 matlab

extIdx =(v == 1 | v == 0 | idx <= m |(idx>(n-1)* m));

idx(extIdx)= [];

删除图像周围的边界点.

对于属于区域1(1)的像素: 插值右侧像素的梯度幅度和右上角的梯度,以获得梯度幅度g1和左像素的梯度梯度幅度对左下角点的θ进行插值以获得梯度幅度g2(插值参数是与梯度方向相对应的切线值的绝对值). 当将g1与g2和原始像素的振幅g进行比较时,如果g不小于g1和g2,则像素点梯度是局部最大值点并且被保留. 否则,像素将被丢弃(抑制). 也就是说,仅保留局部最大值.

对区域2(2),3(3),4(4)中的像素执行类似的操作.

(4)双阈值

在非最大抑制之后,将每个像素的梯度大小与下限阈值进行比较. 保留大于下限的阈值,其余的丢弃以获取弱边界. 与上限阈值相比,该值将保留在上限阈值之上,其余的将被丢弃以获得强边界. 然后使用函数bwselect(e,cstrong,rstrongcanny算子边缘检测 matlab,8)和bwmorph(e,“ thin”,1)链接强边界和弱边界的边缘. 具体方法是:

扫描强边界. 当遇到一个非零的灰色像素p(x,y)时,将跟踪以p(x,y)为起点的轮廓线canny算子边缘检测 matlab,直到轮廓线q(x,y)的终点为止.

检查点s(x,y)的8个相邻区域,该区域与q(x,y)在弱边界中的强边界中的位置相对应. 如果在s(x,y)点的8个相邻区域中存在非零像素s(x,y),则将其作为r(x,y)点包含在强边界中. 从r(x,y)开始,重复第一步,直到我们不能同时在强边界和弱边界上进行.

完成连接包含p(x,y)的轮廓时,将此轮廓标记为已访问. 返回第一步,寻找下一条轮廓线. 重复上述操作,直到在强边界中找不到新的轮廓线为止.

这完成了canny运算符的边缘检测.


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

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

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