我有一个使用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);
答案 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');