web-dev-qa-db-fra.com

Comment tracer une FFT 2D dans Matlab?

J'utilise fft2 pour calculer la transformée de Fourier d'une image en niveaux de gris dans MATLAB.

Quelle est la manière habituelle de tracer la magnitude du résultat?

38
Ben-Uri

En supposant que I soit votre image d'entrée et que F soit sa transformée de Fourier (c'est-à-dire F = fft2(I))

Vous pouvez utiliser ce code:

F = fftshift(F); % Center FFT

F = abs(F); % Get the magnitude
F = log(F+1); % Use log, for perceptual scaling, and +1 since log(0) is undefined
F = mat2gray(F); % Use mat2gray to scale the image between 0 and 1

imshow(F,[]); % Display the result
53
Ben-Uri

Voici un exemple de ma page HOW TO Matlab:

close all; clear all;

img   = imread('lena.tif','tif');
imagesc(img)
img   = fftshift(img(:,:,2));
F     = fft2(img);

figure;

imagesc(100*log(1+abs(fftshift(F)))); colormap(gray); 
title('magnitude spectrum');

figure;
imagesc(angle(F));  colormap(gray);
title('phase spectrum');

Cela donne le spectre de magnitude et le spectre de phase de l'image. J'ai utilisé une image couleur, mais vous pouvez facilement l'ajuster pour utiliser une image grise.

ps. Je viens de remarquer que sur Matlab 2012a, l'image ci-dessus n'est plus incluse. Donc, il suffit de remplacer la première ligne ci-dessus avec par exemple

img = imread('ngc6543a.jpg');

et ça va marcher. J'ai utilisé une version antérieure de Matlab pour créer l'exemple ci-dessus et je l'ai simplement copié ici.

sur le facteur d'échelle

Lorsque nous traçons la magnitude de la transformée de Fourier 2D, nous devons redimensionner les valeurs des pixels à l'aide de la transformation logarinaire pour étendre la plage des pixels sombres dans la région claire afin de mieux voir la transformation. Nous utilisons une valeur c dans l'équation

s = c log(1+r) 

Il n’existe pas de moyen connu pour déterminer cette échelle que je connaisse. Juste besoin d'essayer différentes valeurs pour vous faire aimer. J'ai utilisé 100 dans l'exemple ci-dessus.

enter image description here

23
Nasser