2016-12-04 2 views
1

Ich versuche, inverse diskrete Fouriertransfrom für das Bild zu implementieren, das ich zuvor diskrete Fourier-Transformation anwendete. Die Ausgabe ist eine Art von zwei Bildern. Ein Bild ist in der richtigen Position, das andere ist in umgekehrter Position. Könnten Sie mir helfen, dieses Problem zu lösen?Inverse diskrete Fourier-Transformation Ausgabebild

Hier ist der Code, den ich geschrieben habe.

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)); 


    } 

Sie können das Ausgabebild sehen hier:

img

Edit: ich den Code geändert haben und Sie können neue Ausgabe. es steht auf dem Kopf. imgg Ich verwendete Lena Bild für den Eingang
P. S Entschuldigung für mein schlechtes Englisch.

+0

Wie können wir helfen, wenn wir nicht den Teil des Codes sehen, mit dem Sie dies tun? wahrscheinlich ähnliches Problem: [Implementieren 2D inverse Fourier-Transformation mit 1D-Transformationen] (http://stackoverflow.com/a/40816757/2521214) – Spektre

+0

@Spectre Vielen Dank für Ihre Antwort. Ich habe das Stück Code hinzugefügt, die ich für die umgekehrte Transformation verwendet habe – Hikmat

+0

Hinzugefügt Antwort zumindest das ist, wie ich es sehe. – Spektre

Antwort

0

Sonderbare gespiegelte Mischung

Was ist fourierFilterImg? Machst du eine Art von Faltung statt IDFT? Auch hoffe, invr_FourierReal ist nicht der gleiche Speicherort wie fourierImageReal. Meine Wette ist, dass es nur ein copy/paste Tippfehler ist, damit ich diese Zeile ändern würde:

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

An:

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

Auch hoffe ich, Ihre Eingangsbild richtig DFT ist transformiert und in komplexen Domain.

[Edit1] Inversion von X, Y

, die einfach nicht die gleiche Zählung von row,col Richtung DFT und IDFT irgendwo sein kann. Bilder haben normalerweise Y Achse nach unten und X Achse nach rechts gehen. Wenn es nur auf dem Kopf steht, dann invertiere einfach den, der falsch ist.

Wenn das Problem in IDFT ist dann ändern Sie einfach:

invr_FourierReal.at<double>(rowm,coln) 

zu:

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

Aber meine Wette ist, dass es nur während des Ladens oder Rendering und DFT/IDFT invertiert wird hat damit nichts zu tun.

+0

Danke. Es war nur ein Tippfehler. Ich versuche, inverse Fourier-Transformation zu tun, als ich "Filterung im Frequenzbereich" tun werde. – Hikmat

+0

@Hikmat hinzugefügt ** edit1 ** – Spektre

+0

Vielen Dank an Sie. Es funktioniert, weiß es. Ich werde versuchen zu filtern. – Hikmat