[英]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.