2010-08-24 16 views
8

im cercando di implementare una sfocatura gaussiana con l'uso di FFT e potrebbe trovare qui la seguente ricetta.sfocatura gaussiana con FFT

Questo significa che si può prendere il trasformata di Fourier dell'immagine e il filtro , moltiplicare i (completo) risultati, e poi prendere la Fourier inversa trasformare.

Ho un K kernel, un 7x7 Matrix ed un'immagine io, un 512x512 Matrix.

Non capisco come moltiplicare K per I. È l'unico modo per farlo rendendo K grande quanto I (512x512)?

risposta

15

Sì, è necessario rendere K grande quanto I imbottendolo con zeri. Inoltre, dopo il padding, ma prima di prendere la FFT del kernel, è necessario tradurlo con wraparound, in modo tale che il centro del kernel (il picco del gaussiano) sia a (0,0). Altrimenti, l'immagine filtrata sarà tradotta. In alternativa, puoi tradurre l'immagine filtrata risultante una volta che hai finito.

Un altro punto: per i piccoli kernel che non utilizzano la FFT potrebbe essere effettivamente più veloce. Un kernel gaussiano 2D è separabile, il che significa che è possibile separarlo in due kernel 1D per x e y. Quindi, invece di una convoluzione 2D, è possibile eseguire due convoluzioni 1D in direzione xey nel dominio spaziale. Per i kernel più piccoli che potrebbero finire per essere più veloci di fare la convoluzione nel dominio della frequenza usando la FFT.

2

Se hai dimestichezza con pixel shader e se FFT non è il tuo obiettivo principale qui, ma convoluzione con kernel sfocatura gaussiana è, - allora posso consigliare il mio tutorial on what convolution is

saluti.