我正在尝试在Matlab中实现高斯滤波器,我已经阅读了一些材料并且存在一些差异: 一个像这样实现:
f = fspecial ('gaussian', 3);
result = filter2(f,image);
其他实现如下:
f = fspecial('gaussian',3);
result = conv2(double(image),f);
这让我感到困惑。任何人都可以帮助我确定哪个是正确的?谢谢
答案 0 :(得分:2)
他们俩都是。在Algorithms:
下的filter2
文档页面中
给定矩阵X和二维FIR滤波器h,filter2将滤波器矩阵旋转180度以创建卷积核。然后调用二维卷积函数conv2来实现滤波操作。
所以filter2
将内核旋转180度。这不会产生不同的结果吗?让我们查看fspecial
的文档,看看它是如何生成高斯内核的(强调我的):
h = fspecial('gaussian',hsize,sigma)返回大小为hsize的旋转对称高斯低通滤波器,其标准偏差为sigma(正)。 hsize可以是指定h中行数和列数的向量,也可以是标量,在这种情况下h是方阵。 hsize的默认值是[3 3]; sigma的默认值是0.5。不建议。请改用imgaussfilt或imgaussfilt3。
因此fspecial
生成的内核是旋转对称的,将对称内核旋转180度没有影响,因此两者是相同的。
如果您创建自己的不对称的内核,那么这两个操作将产生不同的结果。