Centrage de la fréquence zéro pour une transformée de Fourier discrète

11

Je travaille sur une application de traitement d'image qui utilise une transformée de Fourier discrète pour implémenter le flou / la netteté. L'application fonctionne plus ou moins, mais quelque chose sur la mécanique me dérange toujours.

En particulier, c'est ainsi que se déroule le processus de centrage des fréquences nulles.

L'exemple que j'ai vu pré-traite l'image d'entrée (d'intensités de niveaux de gris) en la multipliant avec une matrice de taille égale à l'image d'entrée, dont les valeurs sont , où est la ligne, est la colonne, donc un motif alternant et(-1)X+yXy1-1

Selon les notes, cela équivaut à permuter les quadrants de la matrice en inversant les axes et .Xy

Je comprends pourquoi cela est fait, et je tiens à souligner que je comprends que mon code / Fourier fonctionne, je ne comprends tout simplement pas pourquoi la multiplication de la matrice d'entrée par 1 / -1 finit par centrer la composante de fréquence zéro autour de 0.

Merci

étourdi
la source
Vous pouvez également trouver des références dans le chapitre 4, 4.6-Implémentation de Digital Image Processing par Gonzalez (j'ai la deuxième édition). J'espère que cela aide.
hakunami

Réponses:

18

Oh! Quel truc cool! Il fonctionne en raison du théorème de convolution (c.-à-d. Que la multiplication dans le domaine spatial / temporel équivaut à la convolution dans le domaine fréquentiel.)

Il ne bascule pas sur les axes et y , il fait tourner l'image de la transformée de Fourier (pensez à vous déplacer à mi-chemin autour d'un cylindre). L'astuce ici est que l'alternance de -1,1 dans le domaine spatial est un signal avec la fréquence la plus élevée. La transformée de Fourier de cette image est donc un point unique dans le domaine fréquentiel. La convolution par un seul point équivaut à décaler (tourner) l'image par le décalage du point par rapport à la fréquence zéro.Xy

Voici une image test: tester l'image. Sa transformée de Fourier ressemble à:transformée de Fourier de l'image de test

Si vous prenez la transformée de Fourier de l'image alternative ( image en damier), il en résulte un seul point à droite au centre de la transformée de Fourier: entrez la description de l'image ici. (Rappelons que nous n'avons pas encore fait notre rotation, donc le centre de la transformée de Fourier est toujours les hautes fréquences et les basses fréquences aux coins.) Mais c'est le "noyau de rotation!" La convolution avec ce noyau de rotation déplace tout vers le bas et vers la droite (mais les choses qui tombent en bas à droite tournent vers le haut à gauche.)

L'image originale convolution avec le noyau de rotation (dans le domaine de l' image) vous donne: image convoluealors que la convolution image avec transformée de Fourier du noyau de rotation (dans le domaine de fréquence) vous donne: transformée de Fourier tournée.

Et nous pouvons vérifier que multiplier le TestImage par le checkerboard dans le domaine de l' image donne image de multiplication, qui a une transformée de Fourier: transformée de Fourier à nouveau tournée.

Logique errante
la source
Je suis confus. Cela utilise la convolution pour implémenter une fftshiftfonction de type? N'est-il pas moins coûteux de réorganiser directement les 4 quadrants?
endolith
2
Il n'y a pas de convolution directe ici. Cela utilise la multiplication pixel par pixel dans le domaine de l'image pour obtenir l'équivalent d'une convolution dans le domaine de Fourier. Oui, ce fftshiftn'est pas très cher, mais cette astuce pourrait avoir un meilleur comportement de cache. La multiplication pixel par pixel inverse simplement le signe de chaque autre pixel. Si facile à vectoriser, l'écriture de la lecture-modification-écriture est un hit garanti du cache, et il est facile pour le processeur de pré-lire les lectures.
Wandering Logic
Ah oui, c'est un flip de signe, pas une vraie multiplication.
endolith
Pourquoi la transformée de Fourier de l'image de test (la deuxième image) ressemble à ça? En fait, je vois deux images, noires l'une sur l'autre.
hakunami
10

La réponse de Wandering Logic est correcte et détaillée. Je pensais juste que vous voudriez voir des mathématiques au lieu d'images:

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

L'effet est que la fréquence zéro - qui était à l'index 0 auparavant - est maintenant à la moitié de la largeur de l'image (ou de la hauteur, selon que vous multipliez les colonnes ou les lignes).

nimrodm
la source