不应该imfilter和conv2在这里输出相同的图像?

时间:2014-02-05 07:40:07

标签: matlab image-processing convolution

所以我将高斯核应用于超声图像,由0到255范围内的整数值组成,如下所示

filteredImage = imfilter(image,kernel,'conv','same')

使用imshow(filteredImage)我得到了一个非常模糊的图像:

enter image description here

然后,改为使用

convImage = conv2(image,kernel,'same')

我得到以下图片

enter image description here

使用这种方式的这两个函数不应该产生相同类型的输出吗?

2 个答案:

答案 0 :(得分:2)

imfilterconv2不完全相同(imfilter就像conv2,过滤器被翻转)。如果你使用'conv',那么它们是相同的。

首先,您可以使用imfilter以另一种方式检查您是否正在使用正确的图像类型。检查一下:

out1=conv2(double(image),kernel,'same');  
out_conv=uint8(out1); 
old_imfilter=imfilter(image,kernel,'same');
new_imfilter=imfilter(image,kernel(end:-1:1,end:-1:1),'same');

new_imfilterout_conv应该相同。如果是这样,您可以使用您的方法:

convImage = uint8(conv2(double(image),kernel,'same'));
filteredImage = imfilter(image,kernel,'conv','same');

现在filteredImageconvImage应该相同。

答案 1 :(得分:2)

以这种方式使用imfilterconv2之间的差异是conv2执行转换为double ...

varargin{k} = double(varargin{k});

...虽然imfilter没有。

uint8类型的图像的范围为[0,255],而类型double的图像的范围通常为[0,1]。 imshow在这些假设下工作,因此,如果通过double图片,则会将大于1的任何值显示为白色。

由于原始图片为uint8,调用conv2后的结果仍会包含[0,255]范围内的值(尽管已转换为double),因此不会显示正确地imshow。许多修复(一些已经建议):

  • 允许imshow检测范围:imshow(convImage,[])
  • 标准化您的结果:imshow(convImage/255)
  • 在显示之前将结果转换为uint8imshow(uint8(convImage))