我正在尝试将一些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中获得相同的结果?