我正在尝试使用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的结果,但仍有很大差异。答案 0 :(得分:1)
在MatLAB版本中,你从结果和OpenCV中取平方根 - 没有。你看过这个吗?
答案 1 :(得分:1)
好的,马上我看到了你的过滤问题。我不确定该循环会做什么,但要进行频率过滤,你应该使用函数mulSpectrums。
此外,如果您想获取幅度的sqrt,您可以使用OpenCV的sqrt函数,而无需通过at运算符。
答案 2 :(得分:1)
如果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);
}
}