2013-11-14 156 views
0

我想這個簡單的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的結果,但仍然有很大的差異。

+0

如何定義過濾器? –

回答

1

在MatLAB版本中,您從結果和OpenCV中取平方根 - 不是。你檢查過了嗎?

+0

在openCV中,我取平方根(幅度取平方根)。 請看這裏: http://docs.opencv.org/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html – GilLevi

+0

我的意思是在MatLAB中,你需要_additional_平方根。 MatLAB中的函數abs與複雜數據的作用與OpenCV中的幅度相同http://www.mathworks.com/help/matlab/ref/abs.html –

+0

謝謝,我添加了sqrt,但結果仍然非常不同。 – GilLevi

1

好吧,馬上關閉我看到您的過濾問題。我不確定那個迴路會做什麼,但要進行頻率過濾,您應該使用功能mulSpectrums

此外,如果你想採取幅度的sqrt,你可以使用OpenCV的sqrt函數,而不必通過在運營商。

+0

謝謝,我會嘗試根據您的意見修改我的代碼。 – GilLevi

+0

沒問題,希望對您有所幫助 –

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); 
     } 
    } 
+0

感謝您的幫助! – GilLevi