【问题标题】:Convolution after applying a gaussian filter kernel应用高斯滤波器内核后的卷积
【发布时间】:2014-05-27 10:15:33
【问题描述】:

我编写了一段代码here 来将图像与给定内核进行卷积。根据我在页面底部收到的建议,与使用 conv2 函数时相比,我设法获得了 [几乎] 完全相同的图片。几乎我的意思是imshow 显示的图像看起来相同,但输出图片中的值略有不同。但是,当我将高斯核与图像进行卷积时,情况会变得更糟。然后我自己和 conv2 函数的输出相差很大!这是为什么?你能告诉我我的代码有什么问题吗?

原来我做错了。我对 imageFilter() 做了一些修改,但直到现在才注意到它们存在两天!

可以看到imageFilter()代码here

gaussKernel = fspecial('gaussian', 3, 2);
testImage1 = imageFilter(image, gaussKernel);
testImage2 = conv2(image, gaussKernel);

谢谢

【问题讨论】:

  • 什么是imageFilter
  • 另外,“差异很大”不是一个有用的描述。请提供一个具体的例子。
  • 你说的外图,是指朝向外边缘的像素,比如函数的支持与边缘重叠的像素吗?另外,与您的问题无关,但是对于 2 的 sigma,您的支持似乎很小。
  • 裁剪上下三行和左右三列,图片还会有差异吗?
  • 原来我做错了。我对 imageFilter() 做了一些修改,但直到现在才注意到它们存在两天!

标签: matlab image-processing computer-vision mask convolution


【解决方案1】:

有两个原因:

  1. 精度:imageFilter 方法的最后一行中,您将转换为 uint8 数据类型(这是一个 8 位整数),因此您基本上是在对结果进行四舍五入:

    finalImg = uint8(finalImg);

    但是,本机方法conv2 提供了一个数据类型为double 的矩阵gaussKernel,它以双精度进行卷积,因此精度更高。

  2. 边界条件conv2 有第三个参数(参见docs),它与结果的形状有关。在您的方法中,您使用与原始图像相同大小的零填充计算卷积结果,而conv2 默认情况下计算完整卷积。

所以一个简单的修改将产生相同的结果:

gaussKernel = fspecial('gaussian', 3, 2);
testImage1 = imageFilter(im, gaussKernel);
testImage2 = uint8(conv2(im, gaussKernel, 'same'));

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 2021-01-03
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2012-12-13
    相关资源
    最近更新 更多