我正在尝试使用 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,但仍然存在很大差异。