【问题标题】:Shouldn't imfilter and conv2 output the same image here?imfilter 和 conv2 不应该在这里输出相同的图像吗?
【发布时间】:2014-03-01 12:49:05
【问题描述】:

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

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

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

然后,改为使用

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

我得到以下图像

这样使用这两个函数不应该产生相同的输出吗?

【问题讨论】:

  • 检查你的数据类型和返回的数据类型。我猜你的图像是uint8 类型,imfilter 的输出也是uint8,而conv2 的输出是double,具有相同的值(大致)。尝试显示两个结果之间的差异...
  • 添加到 Shai 所说的内容,尝试类似 imshow(convImage./255)
  • 或尝试imshow(convImage,[]),它将自动显示图像强度的最小值和最大值之间的强度。我认为您总是应该在 imshow 中添加括号。

标签: matlab image-processing convolution


【解决方案1】:

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 应该是一样的了。

【讨论】:

    【解决方案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))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2018-05-02
      • 2014-04-05
      相关资源
      最近更新 更多