我想這個簡單的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的結果,但仍然有很大的差異。
如何定義過濾器? –