利用edge
函数,可以在Matlab中实现多种边缘检测滤波器。但是这个函数对输出应用了一个阈值。有可能禁用这样的阈值吗?如果没有,是否有其他方法来计算滤波器的原始值(canny和sobel)而不进行阈值处理?
发布于 2015-08-27 10:06:50
你非常清楚的问题的答案是肯定的。因为所有的边缘函数都在某些强度梯度上应用了一个阈值,所以不应该查看边缘函数本身,而应该查看底层梯度。为此,可以应用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:精明开始于索贝尔(如上),但随后应用非最大抑制和迟滞。后一步涉及选择/取消选择单个像素作为边缘的局部操作(n.m.s.)递归地跟随阈值边缘(滞后)。因此,这些后处理步骤不再与灰度值的全局矩阵一致。
https://stackoverflow.com/questions/32245523
复制相似问题