Centrare la frequenza zero per la trasformata discreta di Fourier


11

Sto lavorando a un'applicazione di elaborazione delle immagini che utilizza una trasformata discreta di Fourier per implementare la sfocatura / nitidezza. L'applicazione funziona più o meno, ma qualcosa sulla meccanica mi confonde ancora.

In particolare, è così che viene fatto il processo di centratura delle frequenze zero.

L'esempio che ho visto preelabora l'immagine di input (di intensità in scala di grigi) moltiplicandola con una matrice di dimensioni pari all'immagine di input, i cui valori sono , dove x è la riga, y è la colonna, quindi uno schema alternando 1 e - 1(-1)X+yXy11

Secondo le note, questo è equivalente di scambiare i quadranti della matrice lanciando tutti i ed y asse.Xy

Capisco perché questo è fatto, e vorrei sottolineare che capisco che il mio codice / roba di Fourier funziona, semplicemente non capisco perché moltiplicare la matrice di input per 1 / -1 finisce per centrare la componente di frequenza zero attorno a 0.

Grazie


È inoltre possibile trovare alcuni riferimenti nel capitolo 4, 4.6-Implementazione da Digital Image Processing di Gonzalez (ho la seconda edizione). Spero che sia d'aiuto.
Hakunami,

Risposte:


18

Oh! Che bel trucco! Funziona a causa del teorema di convoluzione (ovvero, la moltiplicazione nel dominio spaziale / temporale equivale alla convoluzione nel dominio della frequenza).

Non è lanciando tutti i e y asse, si ruota l'immagine della trasformata di Fourier (pensare di spostare dall'altra parte un cilindro). Il trucco qui è che alternare -1,1 nel dominio spaziale è un segnale con la frequenza più alta. Quindi la trasformata di Fourier di quell'immagine è un singolo punto nel dominio della frequenza. Il convolgere di un singolo punto equivale a spostare (ruotare) l'immagine dell'offset del punto dalla frequenza zero.Xy

Ecco un'immagine di prova: immagine di prova. La sua trasformata di Fourier assomiglia a:trasformata di Fourier dell'immagine di prova

Se si prende la trasformata di Fourier dell'immagine alternata ( immagine a scacchiera), si traduce in un unico punto proprio al centro della trasformata di Fourier: inserisci qui la descrizione dell'immagine. (Ricordiamo che non abbiamo ancora fatto la nostra rotazione, quindi il centro della trasformata di Fourier è le alte frequenze e le basse frequenze sono ancora agli angoli.) Ma questo è il "kernel di rotazione!" Convolgere con questo kernel di rotazione sposta tutto verso il basso e verso destra (ma le cose che cadono in basso a destra ruotano in alto a sinistra).

Convoluzione l'immagine originale con il kernel di rotazione (nel dominio dell'immagine) ti dà: immagine contorta, mentre convolvendo la trasformata di Fourier dell'immagine con il kernel di rotazione (nel dominio della frequenza) si dà: trasformata di Fourier ruotata.

E possiamo verificare che moltiplicando il TestImage dalla scacchiera nel dominio dell'immagine dà immagine di moltiplicazione, che ha una trasformata di Fourier di: nuovamente trasformata trasformata di Fourier.


Non ho capito bene. Questo sta usando la convoluzione per implementare una fftshiftfunzione simile? Non è più economico dal punto di vista computazionale riorganizzare direttamente i 4 quadranti?
endolito

2
Non vi è alcuna convoluzione diretta qui. Questo sta usando la moltiplicazione pixel nel dominio dell'immagine per ottenere l'equivalente di una convoluzione nel dominio fourier. Sì, fftshiftnon è molto costoso, ma questo trucco potrebbe avere un comportamento cache migliore. La moltiplicazione pixelwise in realtà sta semplicemente capovolgendo il segno di ogni altro pixel. Così facile da vettorializzare, la scrittura della lettura-modifica-scrittura è un hit della cache garantito ed è facile per il processore precaricare le letture.
Wandering Logic

Oh giusto, è una svolta, non una vera moltiplicazione.
endolito

Perché la trasformata di Fourier dell'immagine di prova (la seconda immagine) appare così? In realtà vedo due immagini, una nera sopra l'altra.
Hakunami,

10

La risposta di Wandering Logic è corretta e dettagliata. Ho pensato di voler vedere un po 'di matematica invece delle immagini:

(-1)K=ejωω2π(K/2)

L'effetto è che la frequenza zero - che era prima all'indice 0 - ora è a metà della larghezza dell'immagine (o altezza, a seconda che si moltiplichino le colonne o le righe).

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.