簡體   English   中英

FFT和IFFT-Matlab和openCV中結果之間的差異

[英]FFT and IFFT - difference between results in Matlab and openCV

我正在嘗試使用openCV將這個簡單的Matlab代碼轉換為C ++:

localstd=sqrt(abs(ifft2(fft2(output).*gf)));

這意味着取矩陣“輸出”的ftf,將其逐元素乘以矩陣“ gf”,然后取其ifft,然后取其大小。

我正在嘗試以下簡單代碼:

Mat complexI;
dft(output, complexI,cv::DFT_SCALE||DFT_COMPLEX_OUTPUT);
Mat copmlexI2=Mat(n,n,CV_32F);
mulSpectrums(complexI,gf,copmlexI2,DFT_COMPLEX_OUTPUT);
dft(copmlexI2,copmlexI2,cv::DFT_INVERSE||DFT_COMPLEX_OUTPUT);

Mat planes[]= {Mat::zeros(output.size(), CV_32F), Mat::zeros(output.size(), CV_32F)};;
split(copmlexI2, 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));
    }
}

for (int i=0;i<localstd.rows;i++){
        for (int j=0;j<localstd.cols;j++){
            localstd.at<float>(i,j)/= 255;
        }
    }

非常簡單 我用的是“輸出”的dft,將其頻譜乘以“ df”,然后用它的ifft。 接下來,我將結果分為實平面和虛平面,並取其大小。 最后,我將其平方根除以255進行歸一化。

我得到的結果與在Matlab中得到的結果有很大不同。 我在這里想念什么? 關於如何修復代碼的任何想法?

提前致謝!

這是不對的

cv::DFT_INVERSE||DFT_COMPLEX_OUTPUT

,如果要合並二進制值,則應使用“ binary or”:

cv::DFT_INVERSE | DFT_COMPLEX_OUTPUT

或+操作

cv::DFT_INVERSE + DFT_COMPLEX_OUTPUT

A || B-是邏輯或。 A,B和結果只能是對或錯。

A | B-按位或。

您也可以嘗試DFT_SCALE標志。

DFT_SCALE縮放結果:將其除以數組元素的數量。 通常,它與DFT_INVERSE結合使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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