【发布时间】:2015-08-29 05:15:04
【问题描述】:
可以在 Matlab 中使用edge 函数执行各种边缘检测过滤器。但是这个函数在输出上应用了一个阈值。是否可以禁用此类阈值?如果没有,是否有其他方法可以在不进行阈值处理的情况下计算过滤器(canny 和 sobel)的原始值?
【问题讨论】:
标签: matlab edge-detection
可以在 Matlab 中使用edge 函数执行各种边缘检测过滤器。但是这个函数在输出上应用了一个阈值。是否可以禁用此类阈值?如果没有,是否有其他方法可以在不进行阈值处理的情况下计算过滤器(canny 和 sobel)的原始值?
【问题讨论】:
标签: matlab edge-detection
您非常明确的问题的答案是肯定的。因为所有边缘函数都在某些强度梯度上应用阈值,所以您不应查看边缘函数本身,而应查看底层梯度。为此,您可以应用 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 开始(如上),但随后应用非最大抑制和滞后。这些后面的步骤涉及选择/取消选择单个像素作为边缘(n.m.s.)的局部操作,分别递归地遵循阈值边缘(滞后)。因此,这些后处理步骤不再与灰度值的全局矩阵一致。
【讨论】: