Matlab FFT与OpenCv DFT

时间:2015-02-09 15:04:52

标签: matlab opencv fft

我正在尝试将一些Matlab代码转换为OpenCv,并且遇到FFT问题。我已经阅读了类似问题的主题,但我仍然没有得到我的代码(或我的FFT思考)的错误。 当我在MATLAB中这样做时:

A = [1 2 3; 4 5 6;7 8 9]; %the simplest matrix i can think of
dft(A,[],1) %this should be 1-dim forward fft

我明白了:

ans = 
12.0000 +  0.0000i   15.0000 +  0.0000i   18.0000 +  0.0000i
-4.5000 +  2.5981i   -4.5000 +  2.5981i   -4.5000 +  2.5981i
-4.5000 -  2.5981i   -4.5000 -  2.5981i   -4.5000 -  2.5981i

但是当我尝试在OpenCV中尽可能简单时:

Mat A = (Mat_<float>(3,3) <<  1,2,3,
                                4,5,6,
                                7,8,9);
Mat planes[] = {Mat_<float>(A), Mat::zeros(A.size(), CV_32F)};
Mat complexI;    //Complex plane to contain the DFT coefficients
merge(planes, 2, complexI);
dft(complexI, complexI,DFT_ROWS);  // Applying DFT without padding
cout << complexI;

我明白了:

[6,0,-1.5,0.866,-1.5,-0.866;
15,0,-1.5,0.866,-1.5,-0.866;
24,0,-1.5,0.866,-1.5,-0.866]

完全不同。我正在使用DFT_ROWS来获得1D转换,而不是使用填充,因为Matlab中的dft声明并没有对它进行评估。 任何人都可以指出我的FFT思维有什么问题吗?如何获得类似于Matlab的结果?

好的,所有这些都是令人困惑的行和列。

但现在我无法弄清楚逆变换的缩放。在MATLAB中:

A = [ 1 2 3; 4 5 6;  7 8 9; 10 11 12];
mask = [0 1 0 0; 0 1 0 0; 0 1 0 0]';
F = fft(A,[],1);
F(~mask) = 0;
real(ifft(F,[],1))
ans =
-1.5000  -1.5000  -1.5000
-1.5000  -1.5000  -1.5000
1.5000   1.5000   1.5000
1.5000   1.5000   1.5000

的OpenCV:

Mat A = (Mat_<float>(4,3) <<  1,2,3,
                                4,5,6,
                                7,8,9,
                                10,11,12);

transpose(A,A);
Mat transformed;
dft(A,transformed,DFT_ROWS|DFT_COMPLEX_OUTPUT);  // Applying DFT
Mat mask = (Mat_<float>(4,3) << 0,0,0,
                                1,1,1,
                                0,0,0,
                                0,0,0);
transpose(transformed,transformed);
vector<Mat> transformed_splitted;
split(transformed, transformed_splitted);
transformed_splitted[0] = transformed_splitted[0].mul(mask);
transformed_splitted[1] = transformed_splitted[1].mul(mask);
merge(transformed_splitted,transformed);
transpose(transformed,transformed);
idft(transformed,transformed,DFT_ROWS|DFT_REAL_OUTPUT|DFT_SCALE);
transpose(transformed,transformed);
cout << transformed;

output:
[-3 -3 -3 -3;
-3 -3 -3 -3;
3 3 3 3;
3 3 3 3]

在我看来,缩放有问题。有趣的是,对于矩阵5x3,两个代码的结果是相同的。对于8x3,另外一些结果不同。如何从IFFT中获得相同的结果?

0 个答案:

没有答案