非阈值边缘检测器的Matlab实现



可以在Matlab中使用edge函数执行各种边缘检测器滤波器。但是这个函数对输出应用了一个阈值。有可能禁用这种阈值吗?如果没有,有没有其他方法可以在没有阈值的情况下计算过滤器(canny和sobel)的原始值?

对你这个非常明确的问题的答案是肯定的。因为所有的边缘函数对一些强度梯度都有一个阈值,所以你不应该看边缘函数本身,而应该看底层的梯度。为此,您可以应用imfilter()函数。例如,对于索贝尔x方向,您将执行以下操作:

I=imread('Img.jpg');
I=rgb2gray(I);
sobX=[1 0 -1, 2 0 -2, 1 0 -1];
GradientX = imfilter(I,sobX);
imshow(GradientX);

SobelY也可以这样做,只需使用

sobY=[1 2 1, 0 0 0, -1 -2 -1];

当然,你可以把SobelX和sobelly的大小结合起来,通过取斜边。

后者给了一个幽灵般的效果:

I=imread('Img.jpg');
I=rgb2gray(I);
sobX=[1 0 -1, 2 0 -2, 1 0 -1];
GradX = imfilter(I,sobX);
sobY=[1 2 1, 0 0 0, -1 -2 -1];
GradY = imfilter(I,sobY);
Magn=(double(GradX.^2 + GradY.^2)).^0.5;
Magn=Magn*255/max(Magn(:))

UDDATE: Canny从Sobel开始(如上所述),但随后应用非最大抑制和滞后。后面的步骤包括选择/取消选择单个像素的局部操作,作为边缘(n.m.s)分别递归地跟随阈值边缘(滞后)。因此,这些后处理步骤不再与灰度值的全局矩阵一致。

最新更新