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
Selon les notes, cela équivaut à permuter les quadrants de la matrice en inversant les axes et .
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
Réponses:
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.X y
Voici une image test: . Sa transformée de Fourier ressemble à:
Si vous prenez la transformée de Fourier de l'image alternative ( ), il en résulte un seul point à droite au centre de la transformée de Fourier: . (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: alors que la convolution image avec transformée de Fourier du noyau de rotation (dans le domaine de fréquence) vous donne: .
Et nous pouvons vérifier que multiplier le TestImage par le checkerboard dans le domaine de l' image donne , qui a une transformée de Fourier: .
la source
fftshift
fonction de type? N'est-il pas moins coûteux de réorganiser directement les 4 quadrants?fftshift
n'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.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:
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).
la source