Matlab中边缘检测器的非阈值
not-threshold-ed value of edge detectors in Matlab
可以使用 edge
函数在 Matlab 中执行各种边缘检测滤波器。但是这个函数对输出应用了一个阈值。是否可以禁用这种阈值?如果不是,是否有任何其他方法可以在没有阈值的情况下计算过滤器(canny 和 sobel)的原始值?
对于您非常明确的问题,答案是肯定的。因为所有边缘函数都对某些强度梯度应用阈值,所以您不应该查看边缘函数本身,而应该查看底层梯度。为此,您可以应用 imfilter() 函数。所以,例如对于 Sobel 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 和 SobelY 的大小。
后者给人一种幽灵般的效果:
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(如上)开始,但随后应用非最大抑制和滞后。后面的这些步骤涉及 selecting/deselecting 单个像素作为边缘 (n.m.s.) 的局部操作,分别递归地遵循阈值边缘(滞后)。因此,这些后处理步骤不再与全局灰度值矩阵一致。
可以使用 edge
函数在 Matlab 中执行各种边缘检测滤波器。但是这个函数对输出应用了一个阈值。是否可以禁用这种阈值?如果不是,是否有任何其他方法可以在没有阈值的情况下计算过滤器(canny 和 sobel)的原始值?
对于您非常明确的问题,答案是肯定的。因为所有边缘函数都对某些强度梯度应用阈值,所以您不应该查看边缘函数本身,而应该查看底层梯度。为此,您可以应用 imfilter() 函数。所以,例如对于 Sobel 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 和 SobelY 的大小。
后者给人一种幽灵般的效果:
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(如上)开始,但随后应用非最大抑制和滞后。后面的这些步骤涉及 selecting/deselecting 单个像素作为边缘 (n.m.s.) 的局部操作,分别递归地遵循阈值边缘(滞后)。因此,这些后处理步骤不再与全局灰度值矩阵一致。