我已经编写了一段代码here来将图像与给定的内核进行卷积。根据我在页面底部收到的建议,与使用conv2函数时相比,我设法获得了[几乎]完全相同的图片。几乎我的意思是imshow
显示的图像看起来相同,但输出图片中的值略有差异。然而,当我将高斯核与图像卷积时,情况变得更糟。那么我自己和conv2函数的输出差别很大!这是为什么?你能告诉我我的代码有什么问题吗?
原来我犯了一个错误。我对imageFilter()进行了一些修改,但直到现在才注意它们存在了两天!
您可以看到imageFilter()代码here。
gaussKernel = fspecial('gaussian', 3, 2);
testImage1 = imageFilter(image, gaussKernel);
testImage2 = conv2(image, gaussKernel);
谢谢
答案 0 :(得分:1)
有两个原因:
<强>精密:强>
在imageFilter
方法的最后一行,您要转换为uint8
数据类型(这是一个8位整数),因此您基本上可以对结果进行舍入:
finalImg = uint8(finalImg);
然而,本机方法conv2
以数据类型gaussKernel
的矩阵double
呈现,这在双精度中进行卷积,因此更精确。
边界条件:conv2
有第三个参数(请参阅docs),该参数与结果的形状有关。在您的方法中,您使用相同大小的零填充来计算卷积的结果,而默认情况下conv2
计算完整卷积。
因此,简单的修改将产生相同的结果:
gaussKernel = fspecial('gaussian', 3, 2);
testImage1 = imageFilter(im, gaussKernel);
testImage2 = uint8(conv2(im, gaussKernel, 'same'));