我正在尝试学习如何在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,令我惊讶的是,我得到了不同的结果。因此,我想知道我是否错过了什么?