Ich arbeite an einer Bildverarbeitungsanwendung, die eine diskrete Fourier-Transformation verwendet, um Unschärfe / Schärfen zu implementieren. Die Anwendung funktioniert mehr oder weniger, aber etwas an der Mechanik verwirrt mich immer noch.
Insbesondere wird auf diese Weise der Prozess des Zentrierens der Nullfrequenzen durchgeführt.
In dem Beispiel, das ich gesehen habe, wird das Eingabebild (mit Graustufenintensitäten) vorverarbeitet, indem es mit einer Matrix der Größe multipliziert wird, die dem Eingabebild entspricht, dessen Werte , wobei x die Zeile, y die Spalte ist. also ein Muster abwechselnd 1 und - 1
Gemäß den Anmerkungen entspricht dies dem Vertauschen der Quadranten der Matrix durch Umdrehen der und y- Achse.
Ich verstehe, warum dies getan wird, und ich möchte betonen, dass ich verstehe, dass mein Code / Fourier-Zeug funktioniert. Ich verstehe nur nicht, warum das Multiplizieren der Eingabematrix mit 1 / -1 dazu führt, dass die Nullfrequenzkomponente um 0 zentriert wird.
Vielen Dank
quelle
Antworten:
Oh! Was für ein cooler Trick! Es funktioniert aufgrund des Faltungssatzes (dh die Multiplikation im räumlichen / zeitlichen Bereich entspricht der Faltung im Frequenzbereich).
Es dreht sich nicht um die und y- Achse, sondern dreht das Bild der Fourier-Transformation (denken Sie daran, sich halb um einen Zylinder zu verschieben). Der Trick dabei ist, dass das Abwechseln von -1,1 im räumlichen Bereich ein Signal mit der höchsten Frequenz ist. Die Fourier-Transformation dieses Bildes ist also ein einzelner Punkt im Frequenzbereich. Das Falten um einen einzelnen Punkt entspricht dem Verschieben (Drehen) des Bildes um den Versatz des Punktes von der Nullfrequenz.x y
Hier ist ein Testbild : . Die Fourier-Transformation sieht so aus:
Wenn Sie die Fourier-Transformation des alternierenden Bildes ( ) durchführen, ergibt sich ein einzelner Punkt genau in der Mitte der Fourier-Transformation : . (Denken Sie daran, dass wir unsere Rotation noch nicht durchgeführt haben. Das Zentrum der Fourier-Transformation sind also die hohen Frequenzen und die niedrigen Frequenzen befinden sich immer noch an den Ecken.) Aber dies ist der "Rotationskern"! Wenn Sie sich mit diesem Rotationskern befassen, wird alles nach unten und rechts verschoben (aber Dinge, die von unten rechts abfallen, drehen sich nach oben links.)
Wenn Sie das Originalbild mit dem Rotationskern (in der Bilddomäne) falten, erhalten Sie: Während Sie das Fourier-Transformationsbild mit dem Rotationskern (im Frequenzbereich) falten, erhalten Sie : .
Und wir können überprüfen, ob das Multiplizieren des Zeugnisses mit dem Schachbrett in der Bilddomäne ergibt , was eine Fourier-Transformation von: hat .
quelle
fftshift
ähnliche Funktion zu implementieren ? Ist es nicht rechnerisch billiger, die 4 Quadranten direkt neu anzuordnen?fftshift
ist nicht sehr teuer, aber dieser Trick hat möglicherweise ein besseres Cache-Verhalten. Die pixelweise Multiplikation dreht tatsächlich nur das Vorzeichen jedes anderen Pixels. Das Schreiben des Lese-, Änderungs- und Schreibvorgangs ist so einfach zu vektorisieren, dass es ein garantierter Cache-Treffer ist und es für den Prozessor einfach ist, die Lesevorgänge vorab abzurufen.Die Antwort von Wandering Logic ist korrekt und detailliert. Ich dachte nur, Sie möchten etwas Mathematik anstelle von Bildern sehen:
Der Effekt ist, dass die Nullfrequenz - die zuvor bei Index 0 lag - jetzt die Hälfte der Bildbreite (oder -höhe) beträgt, je nachdem, ob Sie die Spalten oder die Zeilen multiplizieren.
quelle