2010-09-16 9 views

Répondre

14

Depuis FFT2 et IFFT2 les deux entrées de support uniquement de type double et single, votre image data (qui est probablement de type uint8) est converti au type double première avant d'être traité par FFT2. Vous devrez donc convertir votre image de sortie inv retour à un nombre entier 8 bits non signé en utilisant la fonction UINT8 pour récupérer l'image originale:

>> img = imread('peppers.png'); %# Load a sample image 
>> fft = fft2(img); %# Get the Fourier transform 
>> inv = ifft2(fft); %# Get the inverse Fourier transform 
>> inv = uint8(inv); %# Convert to uint8 
>> imshow(inv);  %# Show the image 
>> isequal(img,inv) %# Test if inv matches the original image img 

ans = 

    1    %# It does! 

REMARQUE: Comme un pourboire, j'éviter de nommer vos variables fft et inv puisque les fonctions avec ces noms existent déjà dans MATLAB.

2

Aussi si vous essayez de faire FFT sur l'image couleur (24 bits) - notez que imread() retournera M x N x 3 tableau. Donc, vous devriez effectuer FFT sur chaque canal R/G/B séparément.

See this pour les détails.

+3

En fait, il semble que FFT2 gère cela pour vous. Si vous tapez 'type fft2' dans la fenêtre de commande, vous pouvez voir qu'une entrée en trois dimensions' x' résulte de l'opération 'fft (fft (x, [], 2), [], 1)', qui effectue une FFT à travers la deuxième puis la première dimension, tandis qu'une entrée à deux dimensions «x» (si vous passiez chaque plan de couleur séparément) entraîne un appel à [FFTN] (http://www.mathworks.com/help/techdoc /ref/fftn.html). En comparant chaque méthode, la différence absolue maximale en pixels entre les résultats est d'environ 5.6e-10, probablement en raison de différences dans l'ordre des opérations. En bref, les deux sont presque équivalents. – gnovice

+0

+1 pour avoir partagé cette fonctionnalité ... –