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:
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:
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.
nur gesagt, ist es nicht einfacher, 'circshift' zu verwenden? – bla
Ja, ist es. Aber prinzipiell kann dies mit der beschriebenen Methode geschehen, an der ich interessiert bin. (: – Pythonice
@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