[英]FFT and IFFT - difference between results in Matlab and openCV
我正在尝试使用openCV将这个简单的Matlab代码转换为C ++:
localstd=sqrt(abs(ifft2(fft2(output).*gf)));
这意味着取矩阵“输出”的ftf,将其逐元素乘以矩阵“ gf”,然后取其ifft,然后取其大小。
我正在尝试以下简单代码:
Mat complexI;
dft(output, complexI,cv::DFT_SCALE||DFT_COMPLEX_OUTPUT);
Mat copmlexI2=Mat(n,n,CV_32F);
mulSpectrums(complexI,gf,copmlexI2,DFT_COMPLEX_OUTPUT);
dft(copmlexI2,copmlexI2,cv::DFT_INVERSE||DFT_COMPLEX_OUTPUT);
Mat planes[]= {Mat::zeros(output.size(), CV_32F), Mat::zeros(output.size(), CV_32F)};;
split(copmlexI2, 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));
}
}
for (int i=0;i<localstd.rows;i++){
for (int j=0;j<localstd.cols;j++){
localstd.at<float>(i,j)/= 255;
}
}
非常简单 我用的是“输出”的dft,将其频谱乘以“ df”,然后用它的ifft。 接下来,我将结果分为实平面和虚平面,并取其大小。 最后,我将其平方根除以255进行归一化。
我得到的结果与在Matlab中得到的结果有很大不同。 我在这里想念什么? 关于如何修复代码的任何想法?
提前致谢!
这是不对的
cv::DFT_INVERSE||DFT_COMPLEX_OUTPUT
,如果要合并二进制值,则应使用“ binary or”:
cv::DFT_INVERSE | DFT_COMPLEX_OUTPUT
或+操作
cv::DFT_INVERSE + DFT_COMPLEX_OUTPUT
A || B-是逻辑或。 A,B和结果只能是对或错。
A | B-按位或。
您也可以尝试DFT_SCALE标志。
DFT_SCALE缩放结果:将其除以数组元素的数量。 通常,它与DFT_INVERSE结合使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.