应用高斯滤波器内核后的卷积

时间:2014-04-13 13:34:10

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

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

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

您可以看到imageFilter()代码here

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

谢谢

1 个答案:

答案 0 :(得分:1)

有两个原因:

  1. <强>精密:imageFilter方法的最后一行,您要转换为uint8数据类型(这是一个8位整数),因此您基本上可以对结果进行舍入:

    finalImg = uint8(finalImg);

    然而,本机方法conv2以数据类型gaussKernel的矩阵double呈现,这在双精度中进行卷积,因此更精确。

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

  3. 因此,简单的修改将产生相同的结果:

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