2016-12-04 63 views
1

我正在嘗試實現離散傅立葉逆變換我預先應用離散傅立葉變換的圖像。輸出是兩種圖像。一張圖像位於正確位置,另一張圖像位於反向位置。你能幫我解決這個問題嗎?逆離散傅立葉變換輸出圖像

這是我寫的代碼。

double inverseFourierReal = 0.0; 
    double inverseFourierImg = 0.0; 
    double degreeValue,cosValue,sinValue; 
    // double inverse = inverseFourier; 
    for(int rowm = 0; rowm < rows; rowm++) 
    for(int coln = 0; coln < cols; coln++) { 


     inverseFourierImg = 0.0; 
     inverseFourierReal = 0.0; 
     for(int rowk = 0; rowk < rows; rowk++) { 
      for(int coll = 0; coll < cols; coll++) { 



      degreeValue = 2. * PI * (float(rowk*rowm)/rows + float(coll*coln)/cols); 
      cosValue = cos(degreeValue); 
      sinValue = sin(degreeValue); 

      inverseFourierReal += cosValue * fourierImageReal[rowk][coll] - sinValue * fourierImageImg[rowk][coll]; 
      //inverseFourierImg += (cosValue * fourierImageImg[rowk][coll] + sinValue * fourierImageReal[rowk][coll]); 
      //cout<<inverseFourierReal; 

      } 

     } 

     invr_FourierReal.at<double>(rowm,coln) = abs((inverseFourierReal)/(sqrt(rows*cols))); 
     // invr_FourierReal.at<double>(rowm,coln) = double(inverseFourierReal)/(sqrt(rows*cols)); 
     //invr_FourierImg.at<double>(int(rowm),int(coln)) = double(inverseFourierImg)/(sqrt(rows*cols)); 


    } 

您可以在這裏看到的輸出圖像:

img

編輯: 我已經改變了代碼,你可以看到新的輸出。它是顛倒的。 imgg 我使用了Lena圖像作爲輸入
P.S抱歉我的英語水平很差。

+0

當我們沒有看到你正在做的這部分代碼時,我們該如何幫助?最可能類似的問題:[使用1D變換實現二維逆傅里葉變換](http://stackoverflow.com/a/40816757/2521214) – Spektre

+0

@Spektre感謝您的回覆。我已經添加了我用於逆向變換的那段代碼 – Hikmat

+0

添加了答案,至少我是這麼看的。 – Spektre

回答

0

奇怪鏡像混合

什麼是fourierFilterImg?你在做某種卷積而不是IDFT?也希望invr_FourierRealfourierImageReal不一樣。我敢打賭,它只是一個複製/粘貼錯字,所以我會改變這一行:

inverseFourierReal += (cosValue * fourierImageReal[rowk][coll] - sinValue * fourierFilterImg[rowk][coll]); 

要:

inverseFourierReal += cosValue * fourierImageReal[rowk][coll] - sinValue * fourierImageImg[rowk][coll]; 

此外,我希望你的輸入圖像是正確DFT轉化和複雜域。 X的

[EDIT1]反轉,Y

這可以是隻是沒有row,col方向爲DFTIDFT某處相同計數。圖像通常有Y軸向下,X軸向右。如果它是顛倒的,那麼只需要把那個錯誤的東西倒過來。

如果問題是IDFT然後只是改變:

invr_FourierReal.at<double>(rowm,coln) 

到:

invr_FourierReal.at<double>(rows-rowm-1,cols-coln-1) 

但我敢打賭,它加載或渲染和DFT/IDFT期間剛剛倒與此無關。

+0

謝謝。這只是錯字。我試圖做逆傅里葉變換比我會做「頻域濾波」。 – Hikmat

+0

@Hikmat新增** edit1 ** – Spektre

+0

非常感謝您。它是知道的。我會嘗試過濾。 – Hikmat