2014-09-13 10 views
7

Ich möchte ein Bild (dargestellt durch eine 2D-Matrix) mit der Multiplikation von fft mit exp (-j * 2 * pi * x * F) verschieben, wobei x die Verschiebung ist. Ich habe:MatLab - Verschieben eines Bildes mit FFT

input=peaks(200); 
H=fftshift(fft2(fftshift(input))); 
x=19; 
H=H*exp(-1i*x*2*pi*F); 
IF_image=fftshift(ifft2(fftshift(H))); 
imshow(IF_image) 

aber ich habe Probleme zu identifizieren/F, die das in H [F], da meine Eingabe ist ein 2-dimensionales Array. Wie könnte ich das tun? Die gewünschte Ausgabe ist mein Originalbild, das in der horizontalen Achse (x-Einheiten) im selben Bild verschoben ist, so dass es bei x + 1 beginnt. Als Beispiel:

Wenn input=

1 2 3 4 5 
6 7 8 9 0 

und x = 2, ich will:

4 5 1 2 3 
9 0 6 7 8 
+0

nur gesagt, ist es nicht einfacher, 'circshift' zu verwenden? – bla

+0

Ja, ist es. Aber prinzipiell kann dies mit der beschriebenen Methode geschehen, an der ich interessiert bin. (: – Pythonice

+0

@CeciliaGuerra - Ich stimme mit "circshift" überein, aber ich nehme an, dass Sie dies als Demonstration der Fourier-Transformations-Eigenschaft tun. Wie auch immer, ich habe eine Antwort geschrieben. – rayryeng

Antwort

11

Sie identifiziert die Eigenschaft für die Übersetzung/in 1D zu verschieben. Für 2D ist es etwas anders, basiert aber auf dem gleichen Prinzip. Um die Übersetzung in 2D zu erreichen, das ist die Übersetzung/Shift-Eigenschaft, die definiert ist als:

enter image description here

x0,y0 wäre die Verschiebung Sie wollen einzuführen. Daher würde der positive Wert von x0 Ihr 2D-Signal nach rechts verschieben, während sich ein negativer Wert nach links verschieben würde. Ähnlich würde ein positiver Wert von y0 Ihr 2D-Bild nach unten verschieben, während sich ein negativer Wert nach oben verschieben würde.

Wenn Sie also Ihre Fourier-Transformation in 2D durchführen, müssen Sie dem Exponenten einen zusätzlichen Ausdruck hinzufügen. Außerdem müssen Sie durch N oder die Größe Ihres 2D-Signals normalisieren. Dies setzt voraus, dass Ihr 2D-Signal die gleiche Anzahl von Zeilen und Spalten aufweist. Wenn dies nicht der Fall ist, müssten Sie u*x0 nehmen und Sie würden durch die Anzahl der Spalten teilen und v*y0 würde durch die Anzahl der Zeilen geteilt werden.
Nun, der Grund, warum Sie über F in Ihrem obigen Code verwirrt sind, ist, weil Sie nicht sicher sind, wie Sie dies in 2D definieren. Sie müssen einen Häufigkeitswert für jeden Punkt im 2D-Raster definieren. Aufgrund Ihres Aufrufs fftshift würden wir die Werte x und y zwischen -100 und 99 definieren, da Ihr 2D-Signal eine Größe von 200 x 200 hat und damit unser 2D-Signal in der Mitte zentrieren würde. Dies ist tatsächlich, was fftshift tut. In ähnlicher Weise macht ifftshift die durch fftshift vorgenommene Zentrierung rückgängig. Um diese Punkte in 2D zu definieren, verwende ich meshgrid. Sobald Sie diese Punkte definiert haben, würden Sie jedes Paar (x,y) Koordinaten nehmen und dann das komplexe Exponential wie in der obigen Eigenschaft sehen.

Als solche müsste Ihr Code auf diese Weise geändert werden. Bedenken Sie, dass ich redundante fftshift und ifftshift Aufrufe in Ihrem ursprünglichen Code losgeworden bin. Sie würden die fft anrufen, dann tun Sie fftshift, um das Spektrum zu zentrieren. Ich änderte auch Ihre Variable input zu in, wie ist eine Funktion in MATLAB, und wir wollen nicht versehentlich die Funktion mit einer Variablen Schatten.

Ich habe auch die x Schicht auf -35, und die y Schicht auf -50. Dies bedeutet, dass das resultierende Signal um 35 nach links und um 50 nach oben verschoben wird.

Deshalb:

in=peaks(200); %// Define input signal 
H=fftshift(fft2(in)); %// Compute 2D Fourier Transform 
x0=-35; %// Define shifts 
y0=-50; 

%// Define shift in frequency domain 
[xF,yF] = meshgrid(-100:99,-100:99); 

%// Perform the shift 
H=H.*exp(-1i*2*pi.*(xF*x0+yF*y0)/200); 

%// Find the inverse Fourier Transform 
IF_image=ifft2(ifftshift(H)); 

%// Show the images 
figure; 
subplot(1,2,1); 
imshow(in); 
subplot(1,2,2); 
imshow(real(IF_image)); 

Beachten Sie, dass ich die echte Komponente des resultierenden Bildes angezeigt. Dies ist aufgrund der Tatsache, dass, wenn Sie die inverse Fourier-Transformation nehmen, kann einige numerische Ungenauigkeit und der komplexe Teil des Signals ist eigentlich ziemlich klein. Wir können dies ignorieren, indem wir nur die reale Komponente des Signals verwenden.

Dies ist das Bild, das ich bekommen:

enter image description here

Wie Sie sehen können, hat das Bild richtig verschieben, wie oben zu sehen, von der Unterkunft überprüft. Wenn Sie verschiedene Schichten angeben möchten, müssen Sie nur x0 und y0 nach Ihrem Geschmack ändern. In Ihrem Fall würden Sie y0 = 0 angeben, dann kann x0 beliebig sein, wie Sie eine horizontale Übersetzung wünschen.

+0

@Sandino - Can ' Ich glaube, ich habe diesen Tippfehler nicht bemerkt, ich habe diese Frage vor so langer Zeit beantwortet. Danke für die Korrektur. – rayryeng