我试图将一些Matlab代码转换为OpenCv,并且遇到逆FFT问题。 MATLAB和OpenCV中的代码给出了不同的结果。
在MATLAB中:
A = [ 1 2 3; 4 5 6; 7 8 9; 10 11 12]; %simplest matrix I can think of
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); //transpositions to make DFT on columns like in MATLAB
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 ]
在我看来,缩放有问题。有趣的是,对于矩阵5x3,两个代码的结果是相同的。对于8x3,另外一些结果不同。如何从IFFT中获得相同的结果?
我在此编辑的帖子中也提到了这个问题:Matlab FFT vs OpenCv DFT