我想这个简单的Matlab代码转换为C++与OpenCV的:经与FFT和IFFT困难的OpenCV
localstd=sqrt(abs(ifft2(fft2(output).*gf)));
这意味着采取矩阵“输出”的FFT,逐个元素相乘与矩阵“gf”,然后采取的话,然后采取的幅度。
我想下面简单的代码:
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中得到。太大而不能用舍入误差来解释。
有人可以请我指出我可能做错了什么?
我使用Matlab2013a,OpenCV的2.4.5用VS 2012在Windows 7
在此先感谢,
吉尔。
编辑:我加了sqrt的结果,但仍然有很大的差异。
如何定义过滤器? –