在opencv中遇到FFT和IFFT的困难

时间:2013-11-14 14:45:28

标签: matlab opencv matrix

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

localstd=sqrt(abs(ifft2(fft2(output).*gf)));

这意味着取矩阵“输出”的fft,将元素与矩阵“gf”相乘,然后取出ifft,然后取其大小。

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

    Mat planes[] = {Mat_<float>(output), Mat::zeros(output.size(), CV_32F)};
    Mat complexI;
    merge(planes, 2, complexI);         // Add to the expanded another plane with zeros

    dft(complexI, complexI,cv::DFT_SCALE);   
    for (int i=0;i<complexI.rows;i++){
        for (int j=0;j<complexI.cols;j++){
            complexI.at<float>(i,j)*=gf.at<float>(i,j);
        }
    }

    //now the inverse transform
    dft(complexI,complexI,cv::DFT_INVERSE);
    split(complexI, 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));
    }
}

这很简单 - 我正在应用fft,得到一个复杂的结果。然后将元素与gf相乘,然后进行逆变换,将结果分成两个矩阵 - 实数和虚数 - 然后取其大小。

然而,尽管它非常简单并且我没有看到任何错误,但结果与我在Matlab中获得的结果非常不同。太大而无法通过舍入错误来解释。

有人可以指出我可能做错了吗?

我正在Windows 7上使用Matlab2013a,openCV 2.4.5和VS 2012。

提前致谢,

吉尔。

编辑:我添加了sqrt的结果,但仍有很大差异。

3 个答案:

答案 0 :(得分:1)

在MatLAB版本中,你从结果和OpenCV中取平方根 - 没有。你看过这个吗?

答案 1 :(得分:1)

好的,马上我看到了你的过滤问题。我不确定该循环会做什么,但要进行频率过滤,你应该使用函数mulSpectrums

此外,如果您想获取幅度的sqrt,您可以使用OpenCV的sqrt函数,而无需通过at运算符。

答案 2 :(得分:1)

如果gf也是复杂矩阵,即CV_64FC2 / CV_32FC2,则可能需要使用mulSpectrums。否则,如果您想自己将它们相乘,那么您应该使用std :: complex来访问这些复杂的值。 std :: complex将为您进行复杂的操作。

for (int i=0;i<complexI.rows;i++){
        for (int j=0;j<complexI.cols;j++){
            complexI.at<complex<double>>(i,j)*=gf.at<complex<double>>(i,j);
        }
    }