FFT和IFFT - Matlab和openCV中结果之间的差异

Gil*_*evi -1 matlab opencv image-processing

我正在尝试使用openCV将这个简单的Matlab代码转换为C++:

localstd=sqrt(abs(ifft2(fft2(output).*gf)));
Run Code Online (Sandbox Code Playgroud)

它意味着取矩阵"输出"的fft,将其逐个元素与矩阵"gf"相乘,然后取出它的ifft然后取其大小.

我正在尝试以下简单的代码:

Mat complexI;
dft(output, complexI,cv::DFT_SCALE||DFT_COMPLEX_OUTPUT);
Mat copmlexI2=Mat(n,n,CV_32F);
mulSpectrums(complexI,gf,copmlexI2,DFT_COMPLEX_OUTPUT);
dft(copmlexI2,copmlexI2,cv::DFT_INVERSE||DFT_COMPLEX_OUTPUT);

Mat planes[]= {Mat::zeros(output.size(), CV_32F), Mat::zeros(output.size(), CV_32F)};;
split(copmlexI2, planes);                   // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude

Mat localstd = planes[0];

for (int i=0;i<localstd.rows;i++){
    for (int j=0;j<localstd.cols;j++){
        localstd.at<float>(i,j)= sqrt(localstd.at<float>(i,j));
    }
}

for (int i=0;i<localstd.rows;i++){
        for (int j=0;j<localstd.cols;j++){
            localstd.at<float>(i,j)/= 255;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这很简单.我正在拿"输出"的dft,将它的频谱乘以"df",然后取出它的ifft.接下来,我将结果分成实数和虚数平面并取大小.最后,我取其中的sqrt并用255除以标准化.

我得到的结果与我在Matlab中获得的结果非常不同.我在这里错过了什么?有关如何修复代码的任何想法?

提前致谢!

And*_*dov 6

这是不正确的

cv::DFT_INVERSE||DFT_COMPLEX_OUTPUT
Run Code Online (Sandbox Code Playgroud)

,如果你想要组合二进制值,你应该使用"二进制或":

cv::DFT_INVERSE | DFT_COMPLEX_OUTPUT
Run Code Online (Sandbox Code Playgroud)

或+操作

cv::DFT_INVERSE + DFT_COMPLEX_OUTPUT
Run Code Online (Sandbox Code Playgroud)

A || B - 符合逻辑或.A,B和结果可能只是真或假.

A | B - 是按位或.

您也可以尝试DFT_SCALE标志.

DFT_SCALE缩放结果:除以数组元素的数量.通常,它与DFT_INVERSE结合使用.