2010-09-16 13 views

Antwort

14

Seit FFT2 und IFFT2 beide nur Unterstützung Eingänge des Typs double und single, Ihre image data (die uint8 wahrscheinlich vom Typ ist) umgewandelt wird double bevor eingeben, indem FFT2 verarbeitet werden. Sie werden also Ihre Ausgangsbild inv zurück zu einem unsigned 8-Bit-Integer mit der Funktion konvertieren müssen UINT8 das Originalbild wiederherzustellen:

>> 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! 

HINWEIS: Als zusätzliche Spitze, würde ich vermeiden, dass Ihre Benennung von Variablen fft und inv, da Funktionen mit diesen Namen bereits in MATLAB vorhanden sind.

2

Auch wenn Sie versuchen, FFT auf Farbe (24-Bit) Bild - beachten Sie, dass imread() wird M x N x 3-Array zurückgeben. Sie sollten also FFT für jeden R/G/B-Kanal separat ausführen.

See this für Details.

+3

Eigentlich scheint es, dass FFT2 das für Sie behandelt. Wenn Sie 'type fft2' in das Befehlsfenster eingeben, können Sie sehen, dass ein 3-D-Eingang' x' in der Operation 'fft (fft (x, [], 2), [], 1)' resultiert eine FFT über die zweite, dann erste Dimension, während ein 2-D-Eingang 'x' (wenn Sie jede Farbebene separat passieren) einen Aufruf von [FFTN] (http://www.mathworks.com/help/techdoc) zur Folge hat /ref/fftn.html). Beim Vergleich der einzelnen Methoden beträgt der maximale absolute pixelweise Unterschied zwischen den Ergebnissen etwa 5.6e-10, was wahrscheinlich auf Unterschiede in der Reihenfolge der Operationen zurückzuführen ist. Kurz gesagt, die beiden sind fast gleichwertig. – gnovice

+0

+1 für die Freigabe dieser Funktion ... –

Verwandte Themen