我正在通过频率空间中的逐点乘法在c ++上实现高斯平滑滤波器。为了检查我的结果是否正确,我在matlab中实现了相同的代码,并将其与matlab的内置过滤功能进行了比较。
这是支票:
% Gauss kernel, sigma = 1.
gaussfilter = fspecial('gaussian',[11 11], 1);
% Test matrix
testmatrix = ones(11);
testmatrix(6,6) = 5;
% FFT, pointwise multiplication in freq. space, and reverse FFT
testmatrix1 = fftshift(fftn(ifftshift(testmatrix),[]));
testmatrix1 = testmatrix1 .* gaussfilter;
testmatrix1 = fftshift(ifftn(ifftshift(testmatrix1),[],'nonsymmetric'));
abs(testmatrix1) % expect equal to c++
% Check that matlab is doing the same..
testmatrix2 = imfilter(testmatrix, gaussfilter);
abs(testmatrix2) % expect equal to testmatrix1
令我惊讶的是,我发现matlab的imfilter
正在返回不同的东西。 testmatrix2
与testmatrix1
不同。
为什么会出现这种情况?我对过滤器的理解是否有问题,或者我是否错误地调用了imfilter? (使用imfilter
举报'replicate'
,或'conv'
无法解决我的问题。
以下是两个矩阵:
testmatrix1 =
0.1592 0.1592 0.1593 0.1595 0.1597 0.1598 0.1597 0.1595 0.1593 0.1592 0.1592
0.1592 0.1593 0.1597 0.1604 0.1612 0.1616 0.1612 0.1604 0.1597 0.1593 0.1592
0.1593 0.1597 0.1609 0.1631 0.1656 0.1668 0.1656 0.1631 0.1609 0.1597 0.1593
0.1595 0.1604 0.1631 0.1681 0.1738 0.1764 0.1738 0.1681 0.1631 0.1604 0.1595
0.1597 0.1612 0.1656 0.1738 0.1830 0.1872 0.1830 0.1738 0.1656 0.1612 0.1597
0.1598 0.1616 0.1668 0.1764 0.1872 0.1922 0.1872 0.1764 0.1668 0.1616 0.1598
0.1597 0.1612 0.1656 0.1738 0.1830 0.1872 0.1830 0.1738 0.1656 0.1612 0.1597
0.1595 0.1604 0.1631 0.1681 0.1738 0.1764 0.1738 0.1681 0.1631 0.1604 0.1595
0.1593 0.1597 0.1609 0.1631 0.1656 0.1668 0.1656 0.1631 0.1609 0.1597 0.1593
0.1592 0.1593 0.1597 0.1604 0.1612 0.1616 0.1612 0.1604 0.1597 0.1593 0.1592
0.1592 0.1592 0.1593 0.1595 0.1597 0.1598 0.1597 0.1595 0.1593 0.1592 0.1592
testmatrix2 =
0.4893 0.6585 0.6963 0.6994 0.6995 0.6995 0.6995 0.6994 0.6963 0.6585 0.4893
0.6585 0.8863 0.9371 0.9413 0.9416 0.9417 0.9416 0.9413 0.9371 0.8863 0.6585
0.6963 0.9371 0.9910 0.9963 0.9997 1.0025 0.9997 0.9963 0.9910 0.9371 0.6963
0.6994 0.9413 0.9963 1.0114 1.0521 1.0860 1.0521 1.0114 0.9963 0.9413 0.6994
0.6995 0.9416 0.9997 1.0521 1.2342 1.3861 1.2342 1.0521 0.9997 0.9416 0.6995
0.6995 0.9417 1.0025 1.0860 1.3861 1.6366 1.3861 1.0860 1.0025 0.9417 0.6995
0.6995 0.9416 0.9997 1.0521 1.2342 1.3861 1.2342 1.0521 0.9997 0.9416 0.6995
0.6994 0.9413 0.9963 1.0114 1.0521 1.0860 1.0521 1.0114 0.9963 0.9413 0.6994
0.6963 0.9371 0.9910 0.9963 0.9997 1.0025 0.9997 0.9963 0.9910 0.9371 0.6963
0.6585 0.8863 0.9371 0.9413 0.9416 0.9417 0.9416 0.9413 0.9371 0.8863 0.6585
0.4893 0.6585 0.6963 0.6994 0.6995 0.6995 0.6995 0.6994 0.6963 0.6585 0.4893
答案 0 :(得分:0)
好的,我发现了这个问题。
我必须先将gaussfilter
的FFT与testmatrix1
相乘,然后将标记'replicate'
传递给imfilter
。
的变化:
testmatrix1 = testmatrix1 .* fftshift(fftn(ifftshift(gaussfilter),[]));
和
testmatrix2 = imfilter(testmatrix, gaussfilter,'replicate');