我对你的代码有点困惑。您的前两行代码:
image=imread(image);
image_out=edge(image,'sobel'); %// typo - should have been image, not Image - I fixed this.
已经用 Sobel 算子找到了边。我也对你的第一行感到困惑。 image 是图像文件名的字符串吗?你没有说清楚......所以我假设它是。在任何情况下,您都可以另外指定位于[0-1] 之间的第三个参数,该参数指定您希望找到边缘的阈值。但是,我的猜测是您不想这样做并且您想自己执行过滤操作。一旦你用水平和垂直梯度对图像进行卷积,然后找到这些分量的幅度,将此输出缩放到[0-1],然后应用你的阈值。我会使用im2double 将您的图像转换为双倍以允许浮点精度......尤其是如果我们要计算幅度。
因此,您的函数实际上是:
function [ image_out ] = Sobel(image, threshold)
image = imread(image);
image = im2double(image); %// Change to double
maskx = [-1 0 1; -2 0 2;-1 0 1];
masky = [1 2 1; 0 0 0 ;-1 -2 -1];
resx = conv2(image, maskx, 'same'); %// Filter the image - Make sure you use the 'same' flag
resy = conv2(image, masky, 'same');
mag = sqrt(resx.^2 + resy.^2); %// Compute magnitude
mag = (mag - min(mag(:))) / (max(mag(:)) - min(mag(:))); %// Scale to [0-1]
image_out = mag >= thresh; %// Now apply threshold
我对您的代码进行了一些更改。具体来说,在使用conv2 时,您需要确保使用'same' 标志,以便输出与输入图像大小相同。我们计算水平和垂直梯度,然后计算幅度。我们重新调整幅度,使其位于[0,1] 之间,然后用thresh 对图像进行阈值处理,这也在[0,1] 的范围内。任何强度大于或等于此值的位置都将设置为逻辑true,而所有其他值都设置为逻辑false。
如果我可以提出一些建议,我会使用 imfilter 而不是 conv2 来过滤您的图像。 conv2 用于一般 2D 信号,而 imfilter 专门用于过滤图像。因此,也许将您的 conv2 调用替换为:
resx = imfilter(image, maskx, 'replicate', 'conv');
resy = imfilter(image, masky, 'replicate', 'conv');
祝你好运!