FFT di dati immagine: "mirroring" per evitare effetti al contorno


8

Carico e visualizzo un'immagine di riso in Matlab:

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

riso

Prendo la FFT di questa immagine e la sposto:

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

FFT (riso)

Se posiziono l'asse e l'asse y attraverso il centro dell'immagine; Trovo che l'immagine sia simmetrica g (-x, -y) = g (x, y). Per un segnale 1D abbiamo che la FFT di un segnale reale ha una parte reale simmetrica e una parte immaginaria asimmetrica. Immagino che sia quello che vediamo qui in 2 dimensioni?

Poiché l'immagine originale è più scura nella parte inferiore che nella parte superiore, c'è una forte discontinuità orizzontale al confine periodico che causa la linea verticale nella FFT.

Voglio liberarmi di questo effetto limite. Un approccio comune a questo sembra essere il windowing .

Tuttavia, voglio risolvere questo problema con una tecnica che ho trovato in un documento chiamato "mirroring". Il documento non era molto specifico, quindi ho bisogno del tuo aiuto per capire questo approccio :-).

Per prima cosa creo una "piastrella" simmetrica dall'immagine originale:

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

inserisci qui la descrizione dell'immagine

Ora prendo la FFT di questa "tessera":

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

inserisci qui la descrizione dell'immagine

La linea verticale sembra essere (quasi) scomparsa: buona. Tuttavia, il mirroring sembra aver introdotto più simmetria.

Qual è il risultato corretto: la FFT dell'immagine originale o la FFT dell'immagine "specchiata"?

C'è un modo in cui posso "rispecchiarmi" in modo che entrambi mi liberi degli effetti limite e ottenga una FFT puramente reale?

Grazie in anticipo per le risposte!

Risposte:


13

La FFT dell'immagine originale è corretta. Gli artefatti che stai vedendo sono tipici del DFT, perché le funzioni di base DFT hanno difficoltà a rappresentare segnali non periodici. Anche se il DFT è di lunghezza finita, in realtà rappresenta un segnale periodico che si estende all'infinito negativo e positivo. Le funzioni di base del DFT sono tutte sinusoidi con punti che sono divisori interi delle dimensioni del DFT, quindi iniziano e finiscono tutti allo stesso valore, ed è difficile per esso adattarsi a segnali che non sono periodici in questo modo. Quindi, immagina di piastrellare la tua immagine: c'è davvero una brusca discontinuità ai bordi. I bordi non coincidono bene e questo è il motivo degli effetti al contorno.

Nell'elaborazione del segnale audio, dove FFT viene spesso utilizzato, un approccio molto comune è l'utilizzo di una funzione finestra , come notato. Questo assottiglia i bordi verso 0 e riduce questo effetto.

Nell'elaborazione delle immagini, il DCT viene solitamente utilizzato anziché il DFT, poiché impone diversi vincoli di simmetria che danno risultati migliori. In altre parole, è usato per prevenire esattamente il problema che stai vedendo. Contrariamente alle funzioni di base del DFT (ricordare come iniziano e finiscono tutte allo stesso valore), le funzioni di base del DCT sono divisori interi o metà dei divisori interi, quindi molti di essi iniziano e finiscono con valori diversi. Di conseguenza, le condizioni al contorno implicite sono diverse: si presume che il segnale sia simmetrico rispetto ai suoi bordi, che in realtà è in qualche modo simile al "mirroring" con cui si stava sperimentando. Ecco un altro mio post con qualche informazione in più sul DCT: https://dsp.stackexchange.com/a/362/392

Quindi, come breve riassunto, se sei assolutamente impostato sull'uso della FFT, potresti provare a usare le finestre. Tuttavia, la scelta migliore è probabilmente quella di utilizzare il DCT, che implica condizioni al contorno simili all'idea del "mirroring" e, di conseguenza, gestisce meglio le immagini.


Da quello che ho potuto capire DFT implica l'estensione periodica mentre DCT implica un'estensione uniforme. Quando si esegue la compressione dell'immagine, si lavora su piccoli blocchi dell'immagine. Poiché l'estensione periodica implicita da DFT provoca salti alla frontiera che a sua volta diminuisce il tasso di convergenza; è meglio usare DCT per la compressione delle immagini (convergenza più veloce-> file più piccoli con la stessa quantità di informazioni visibili). Tuttavia DCT sembra essere menzionato principalmente in questo contesto. Il contesto in cui sto lavorando è che voglio filtrare un'immagine con un filtro Gabor. Questo può essere fatto usando DCT?
Andy,

Se vuoi solo filtrare l'immagine con un filtro Gabor, dovresti semplicemente usare FFT. Le condizioni al contorno non saranno un problema. Perché sei preoccupato per le condizioni al contorno, o per avere uno spettro puramente reale, per filtrare con un filtro Gabor?
schnarf,

Per quanto riguarda lo spettro puramente reale: ho bisogno di stimare le frequenze dominanti: fu = Sum (u * G) / Sum (G) e fv, dove G (u, v) è la FFT della mia immagine g (x, y) . Non capisco come funzioni se G è complesso. Vorrei ottenere un fu complesso?
Andy,

Piuttosto che considerare i valori complessi, dovresti considerare le loro dimensioni. Vale a dire per ogni bin di frequenza complessa z = a + bi, la sua magnitudine è sqrt (a ^ 2 + b ^ 2).
schnarf,

Un'altra cosa a cui pensare: potrebbe sembrare confuso il fatto che stai prendendo dati reali e ottieni uno spettro complesso. Lo spettro complesso è solo un modo per dare ad ogni sinusoide una fase particolare.
schnarf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.