簡體   English   中英

在opencv中難以使用FFT和IFFT

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM