FFT von Bilddaten: „Spiegeln“, um Randeffekte zu vermeiden

8

Ich lade und zeige ein Bild von etwas Reis in Matlab:

g = imread('rice.png');
imshow(g);

Reis

Ich nehme die FFT dieses Bildes und verschiebe es:

G = fft2(g);
imshow(log(abs(fftshift(G)) + 1), []);

FFT (Reis)

Wenn ich die Axt- und Y-Achse durch die Bildmitte lege; Ich finde, dass das Bild symmetrisch ist g (-x, -y) = g (x, y). Für ein 1D-Signal haben wir, dass die FFT eines realen Signals einen symmetrischen Realteil und einen asymmetrischen Imaginärteil hat. Ich denke, das sehen wir hier in zwei Dimensionen?

Da das Originalbild unten dunkler als oben ist, gibt es eine starke horizontale Diskontinuität an der periodischen Grenze, die die vertikale Linie in der FFT verursacht.

Ich möchte diesen Randeffekt loswerden. Ein üblicher Ansatz hierfür scheint die Fensterung zu sein .

Ich möchte dieses Problem jedoch mit einer Technik lösen, die ich in einem Artikel namens "Spiegeln" gefunden habe. Das Papier war nicht sehr spezifisch, deshalb brauche ich Ihre Hilfe, um diesen Ansatz herauszufinden :-).

Zuerst erstelle ich eine symmetrische "Kachel" aus dem Originalbild:

tile=[flipdim(g,2) g; flipdim(flipdim(g,1),2) flipdim(g,1)];
imshow(tile);

Geben Sie hier die Bildbeschreibung ein

Jetzt nehme ich die FFT dieser "Kachel":

Tile=fft2(tile);
imshow(log(abs(fftshift(Tile)) + 1), []) 

Geben Sie hier die Bildbeschreibung ein

Die vertikale Linie scheint (fast) verschwunden zu sein: gut. Die Spiegelung scheint jedoch mehr Symmetrie eingeführt zu haben.

Was ist das richtige Ergebnis: die FFT des Originalbildes oder die FFT des "gespiegelten" Bildes?

Gibt es eine Möglichkeit, wie ich "spiegeln" kann, damit ich sowohl Randeffekte als auch eine rein reale FFT entferne?

Vielen Dank im Voraus für alle Antworten!

Andy
quelle

Antworten:

13

Die FFT des Originalbildes ist korrekt. Die Artefakte, die Sie sehen, sind typisch für die DFT, da die DFT-Basisfunktionen Schwierigkeiten haben, nichtperiodische Signale darzustellen. Obwohl die DFT eine endliche Länge hat, stellt sie tatsächlich ein periodisches Signal dar, das sich bis zur negativen und positiven Unendlichkeit erstreckt. Die Basisfunktionen der DFT sind alle Sinuskurven mit Perioden, die ganzzahlige Teiler der DFT-Größe sind. Sie beginnen und enden also alle mit demselben Wert, und es ist schwierig, Signale anzupassen, die auf diese Weise nicht periodisch sind. Stellen Sie sich also vor, Sie kacheln Ihr Bild: Es gibt tatsächlich eine abrupte Diskontinuität an den Rändern. Die Kanten passen nicht gut zusammen, und das ist der Grund für die Randeffekte.

Bei der Audiosignalverarbeitung, bei der die FFT häufig verwendet wird, wird häufig ein Fenster verwendet , wie Sie bereits bemerkt haben. Dies verjüngt die Kanten in Richtung 0 und verringert diesen Effekt.

Bei der Bildverarbeitung wird normalerweise die DCT anstelle der DFT verwendet, da sie unterschiedliche Symmetrieeinschränkungen auferlegt, die bessere Ergebnisse liefern. Mit anderen Worten, es wird verwendet, um genau das Problem zu verhindern, das Sie sehen. Im Gegensatz zu den Basisfunktionen der DFT (denken Sie daran, wie sie alle mit demselben Wert beginnen und enden) sind die Basisfunktionen des DCT ganzzahlige Teiler oder die Hälfte der ganzzahligen Teiler, sodass viele von ihnen mit unterschiedlichen Werten beginnen und enden. Infolgedessen sind die implizierten Randbedingungen unterschiedlich: Es wird angenommen, dass das Signal symmetrisch zu seinen Kanten ist, was der "Spiegelung", mit der Sie experimentiert haben, tatsächlich etwas ähnlich ist. Hier ist ein weiterer Beitrag von mir mit ein wenig mehr Informationen zum DCT: https://dsp.stackexchange.com/a/362/392

Kurz gesagt, wenn Sie unbedingt die FFT verwenden möchten, sollten Sie die Fensterung ausprobieren. Die beste Wahl ist jedoch wahrscheinlich die Verwendung der DCT, die Randbedingungen impliziert, die Ihrer "Spiegelungs" -Idee ähneln, und daher Bilder besser verarbeitet.

Schnarf
quelle
Soweit ich verstehen konnte, impliziert DFT eine periodische Verlängerung, während DCT eine gleichmäßige Verlängerung impliziert. Bei der Bildkomprimierung wird an kleinen Bildblöcken gearbeitet. Da die durch DFT implizierte periodische Ausdehnung Sprünge an der Grenze verursacht, verringert dies wiederum die Konvergenzrate; Es ist besser, DCT für die Bildkomprimierung zu verwenden (schnellere Konvergenz-> kleinere Dateien mit der gleichen Menge sichtbarer Informationen). DCT scheint jedoch hauptsächlich in diesem Zusammenhang erwähnt zu werden. Der Kontext, in dem ich arbeite, ist, dass ich ein Bild nach einem Gabor-Filter filtern möchte. Kann dies mit DCT durchgeführt werden?
Andy
Wenn Sie das Bild nur mit einem Gabor-Filter filtern möchten, sollten Sie nur die FFT verwenden. Die Randbedingungen werden kein Problem sein. Warum machen Sie sich Sorgen über die Randbedingungen oder ein rein reales Spektrum für die Filterung mit einem Gabor-Filter?
Schnarf
In Bezug auf ein rein reales Spektrum: Ich muss die dominanten Frequenzen schätzen: fu = Summe (u * G) / Summe (G) und fv, wobei G (u, v) die FFT meines Bildes g (x, y) ist. . Ich verstehe nicht, wie das funktioniert, wenn G komplex ist. Ich würde ein komplexes fu bekommen?
Andy
Anstatt die komplexen Werte zu berücksichtigen, sollten Sie deren Größen berücksichtigen. Das heißt, für jedes komplexe Frequenzfach z = a + bi ist seine Größe sqrt (a ^ 2 + b ^ 2).
Schnarf
Eine andere Sache, über die Sie nachdenken sollten: Es mag verwirrend erscheinen, dass Sie echte Daten aufnehmen und ein komplexes Spektrum erhalten. Das komplexe Spektrum ist nur eine Möglichkeit, jeder Sinuskurve eine bestimmte Phase zu geben.
Schnarf