执行傅里叶变换的不同方法

时间:2015-10-27 09:08:27

标签: c++ opencv

我正在尝试学习如何在OpenCV中正确使用傅立叶变换。目前我正在尝试两种不同的方法,我认为应该产生相同的结果。

方法1:

Mat I_new, I_dft;
dft(I, I_dft, DFT_COMPLEX_OUTPUT);
idft(I_dft, I_new, DFT_SCALE | DFT_REAL_OUTPUT);

方法2(从http://docs.opencv.org/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html中提取):

Mat I_dft2, I_new2;
I_dft2 = my_dft(I);
I_new2 = my_idft(I_dft);

,其中

Mat my_dft(Mat I)
{

    Mat planes[] = { Mat_<double>(I), Mat::zeros(I.size(), CV_64F) };
    Mat I_dft;
    merge(planes, 2, I_dft);       
    dft(I_dft, I_dft);            
    return I_dft;
}

Mat my_idft(Mat I_dft)
{
    Mat I;
    dft(I_dft, I, DFT_INVERSE | DFT_SCALE);
    extractChannel(I, I, 0);
    return I;
}

为了比较结果,我使用了以下三种方法:

测试1

cv::Mat diff = I_new != I_new2;
bool eq = cv::countNonZero(diff) == 0;
cout << "equal = " << eq << endl;

测试2

eq = equal(I_new.begin<double>(), I_new.end<double>(), I_new2.begin<double>());
cout << "equal = " << eq << endl;

测试3

eq = 1;
for (int i = 0; i < I.rows; i++)
    for (int j = 0; j < I.cols; j++)
        if (abs(I_new.at<double>(i, j) - I_new2.at<double>(i, j)) > 1e-6)
            eq = 0;
cout << "equal = " << eq << endl;

此外,我还进行了视觉检查。

测试1和2给出了错误,测试3给出了真实,我认为这是因为第一次测试对于比较双打是不好的。目视检查出来了。所以,对结果感到满意,我尝试在我的应用程序中从方法2改为方法1,令我惊讶的是,我得到了不同的结果。因此,我想知道我是否错过了什么?

0 个答案:

没有答案