繁体   English   中英

在opencv中难以使用FFT和IFFT

[英]Having difficulty with FFT and IFFT in opencv

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

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

这意味着取矩阵“输出”的ftf,将其逐元素乘以矩阵“ 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,带有VS 2012的openCV 2.4.5。

提前致谢,

吉尔

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

在MatLAB版本中,您要从结果中取平方根,而在OpenCV中则应-不。 你检查了吗?

好的,马上发现您的过滤问题。 我不确定该循环将执行什么操作,但是要进行频率滤波,应使用mulSpectrums函数。

同样,如果您想获取大小的平方根,则可以使用OpenCV的平方根函数,而无需通过at运算符。

如果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);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM