在时域/频域滤波时,高斯平滑的结果不同

时间:2015-12-13 18:06:43

标签: matlab filter

我正在通过频率空间中的逐点乘法在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正在返回不同的东西。 testmatrix2testmatrix1不同。

为什么会出现这种情况?我对过滤器的理解是否有问题,或者我是否错误地调用了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

1 个答案:

答案 0 :(得分:0)

好的,我发现了这个问题。 我必须先将gaussfilter的FFT与testmatrix1相乘,然后将标记'replicate'传递给imfilter

的变化:

testmatrix1 = testmatrix1 .* fftshift(fftn(ifftshift(gaussfilter),[]));

testmatrix2 = imfilter(testmatrix, gaussfilter,'replicate');