缩放滤镜输出

时间:2014-12-10 00:12:35

标签: matlab image-processing filtering signal-processing

我有一个使用Sobel算子的子功能。在这个问题中,我必须将过滤器输出缩放到区间[0,1],以便与阈值[0,1]进行比较。我该如何改进这个功能?

function [ image_out ] = Sobel(image, threshold)
image=imread(image);
image_out=edge(image,'sobel');

maskx=[-1 0 1; -2 0 2;-1 0 1];
masky=[1 2 1; 0 0 0 ;-1 -2 -1];

resx=conv2(Image, maskx);
resy=conv2(Image, masky);

1 个答案:

答案 0 :(得分:0)

我对你的代码感到有点困惑。你的前两行代码:

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');

祝你好运!