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