2010-09-16 9 views

risposta

14

Dal FFT2 e IFFT2 entrambi ingressi solo di supporto di tipo double e single, il vostro image data (che rischia di tipo uint8) viene convertito in digitare double prima prima di essere elaborati da FFT2. Sarà quindi necessario convertire l'immagine in uscita inv di nuovo ad un unsigned 8-bit integer utilizzando la funzione di UINT8 per recuperare l'immagine 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! 

NOTA: Come ulteriore suggerimento, vorrei evitare di nominare le variabili fft e inv poiché le funzioni con questi nomi esistono già in MATLAB.

2

Anche se si sta tentando di eseguire un'immagine FFT a colori (24 bit), tenere presente che imread() restituirà un array M x N x 3. Quindi dovresti eseguire FFT su ciascun canale R/G/B separatamente.

See this per dettagli.

+3

In realtà, sembra che FFT2 gestisca quello per voi. Se digiti 'type fft2' nella Command Window, puoi vedere che un input 3-D' x' risulta nell'operazione 'fft (fft (x, [], 2), [], 1)', che esegue una FFT attraverso la seconda e poi la prima dimensione, mentre l'input bidimensionale 'x' (se passassi separatamente ogni piano di colore) comporta una chiamata a [FFTN] (http://www.mathworks.com/help/techdoc /ref/fftn.html). Confrontando ciascun metodo, la differenza massima di pixel in termini assoluti tra i risultati è di circa 5,6e-10, probabilmente a causa delle differenze nell'ordine delle operazioni. In breve, i due sono quasi equivalenti. – gnovice

+0

+1 per condividere questa funzione ... –

Problemi correlati