FFT des données d'image: «mise en miroir» pour éviter les effets de frontière

8

Je charge et affiche une image de riz dans Matlab:

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

riz

Je prends la FFT de cette image et la décale:

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

FFT (riz)

Si je place l'axe et l'axe y à travers le centre de l'image; Je trouve que l'image est symétrique g (-x, -y) = g (x, y). Pour un signal 1D, nous avons que la FFT d'un signal réel a une partie réelle symétrique et une partie imaginaire asymétrique. Je suppose que c'est ce que nous voyons ici en 2 dimensions?

Étant donné que l'image d'origine est plus sombre en bas qu'en haut, il y a une forte discontinuité horizontale à la frontière périodique provoquant la ligne verticale dans la FFT.

Je veux me débarrasser de cet effet de frontière. Une approche commune à cela semble être le fenêtrage .

Cependant, je veux résoudre ce problème par une technique que j'ai trouvée dans un article intitulé "mirroring". Le document n'était pas très précis, j'ai donc besoin de votre aide pour comprendre cette approche :-).

Je crée d'abord une "tuile" symétrique à partir de l'image d'origine:

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

entrez la description de l'image ici

Maintenant je prends la FFT de cette "tuile":

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

entrez la description de l'image ici

La ligne verticale semble avoir (presque) disparu: bonne. Cependant, la mise en miroir semble avoir introduit plus de symétrie.

Quel est le résultat correct: la FFT de l'image originale ou la FFT de l'image "miroir"?

Existe-t-il un moyen de «refléter» afin de me débarrasser à la fois des effets de frontière et d'obtenir une FFT purement réelle?

Merci d'avance pour n'importe quelle réponse!

Andy
la source

Réponses:

13

La FFT de l'image d'origine est correcte. Les artefacts que vous voyez sont typiques de la DFT, car les fonctions de base de la DFT ont du mal à représenter des signaux non périodiques. Même si la DFT est de longueur finie, elle représente en fait un signal périodique qui s'étend à l'infini négatif et positif. Les fonctions de base de la DFT sont toutes des sinusoïdes avec des périodes qui sont des diviseurs entiers de la taille DFT, donc elles commencent et se terminent toutes à la même valeur, et il est difficile pour elle d'ajuster des signaux qui ne sont pas périodiques de cette manière. Alors imaginez le carrelage de votre image: il y a en effet une discontinuité brutale sur les bords. Les bords ne correspondent pas bien, et c'est la raison des effets de frontière.

Dans le traitement du signal audio, où la FFT est souvent utilisée, une approche très courante consiste à utiliser une fonction de fenêtre , comme vous l'avez noté. Cela diminue les bords vers 0 et réduit cet effet.

En traitement d'image, le DCT est généralement utilisé plutôt que le DFT, car il impose différentes contraintes de symétrie qui donnent de meilleurs résultats. En d'autres termes, il est utilisé pour éviter exactement le problème que vous voyez. Contrairement aux fonctions de base de la DFT (rappelez-vous comment elles commencent et se terminent toutes à la même valeur), les fonctions de base de la DCT sont des diviseurs entiers ou la moitié des diviseurs entiers, donc beaucoup d'entre eux commencent et se terminent à des valeurs différentes. En conséquence, les conditions aux limites implicites sont différentes: le signal est supposé être symétrique par rapport à ses bords, ce qui est en fait quelque peu similaire au "miroir" que vous expérimentiez. Voici un autre article de moi avec un peu plus d'informations sur le DCT: https://dsp.stackexchange.com/a/362/392

Donc, pour résumer, si vous êtes absolument déterminé à utiliser la FFT, vous voudrez peut-être essayer le fenêtrage. Cependant, le meilleur choix est probablement d'utiliser le DCT, ce qui implique des conditions aux limites similaires à votre idée de "mise en miroir" et, par conséquent, gère mieux les images.

schnarf
la source
D'après ce que j'ai pu comprendre, la DFT implique une extension périodique tandis que la DCT implique une extension même. Lors de la compression d'image, on travaille sur de petits blocs de l'image. Étant donné que l'extension périodique impliquée par DFT provoque des sauts à la frontière qui à son tour diminue le taux de convergence; il est préférable d'utiliser DCT pour la compression d'image (convergence plus rapide -> fichiers plus petits avec la même quantité d'informations visibles). Cependant, le DCT semble être mentionné principalement dans ce contexte. Le contexte dans lequel je travaille est que je souhaite filtrer une image par un filtre Gabor. Cela peut-il être fait en utilisant DCT?
Andy
Si vous souhaitez simplement filtrer l'image avec un filtre Gabor, vous devez simplement utiliser la FFT. Les conditions aux limites ne seront pas un problème. Pourquoi vous inquiétez-vous des conditions aux limites, ou d'un spectre purement réel, pour le filtrage avec un filtre de Gabor?
schnarf
Pour avoir un spectre purement réel: j'ai besoin d'estimer les fréquences dominantes: fu = Sum (u * G) / Sum (G) et fv, où G (u, v) est la FFT de mon image g (x, y) . Je ne comprends pas comment cela fonctionne si G est complexe. J'obtiendrais un fu complexe?
Andy
Plutôt que de considérer les valeurs complexes, vous devriez considérer leurs ampleurs. C'est-à-dire que pour chaque fréquence complexe bin z = a + bi, sa magnitude est sqrt (a ^ 2 + b ^ 2).
schnarf
Autre chose à penser: il peut sembler déroutant que vous preniez de vraies données et obteniez un spectre complexe. Le spectre complexe n'est qu'un moyen de donner à chaque sinusoïde une phase particulière.
schnarf