2010-09-16 10 views

Respuesta

14

Desde FFT2 y IFFT2 dos únicas entradas de apoyo de tipo double y single, su image data (que es probable de tipo uint8) se convierte al tipo double primero antes de ser procesada por FFT2. Por lo tanto, tendrá que convertir la imagen de salida inv de nuevo a un entero sin signo de 8 bits utilizando la función UINT8 para recuperar la imagen original:

>> 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: Como una propina adicional, me gustaría evitar nombrar las variables fft y inv ya que las funciones con esos nombres ya existen en MATLAB.

2

Además, si está tratando de hacer FFT en una imagen de color (24 bits), tenga en cuenta que imread() devolverá la matriz M x N x 3. Por lo tanto, debe realizar FFT en cada canal R/G/B por separado.

See this para más detalles.

+3

En realidad, parece que FFT2 maneja eso para usted. Si escribe 'type fft2' en la Ventana de Comando, puede ver que una entrada 3-D' x' da como resultado la operación 'fft (fft (x, [], 2), [], 1)', que realiza una FFT a través de la segunda y luego primera dimensión, mientras que una entrada 2-D 'x' (si pasaba cada plano de color por separado) da como resultado una llamada a [FFTN] (http://www.mathworks.com/help/techdoc /ref/fftn.html). Comparando cada método, la diferencia máxima de píxeles absolutos entre los resultados es alrededor de 5.6e-10, probablemente debido a diferencias en el orden de las operaciones. En resumen, los dos son casi equivalentes. – gnovice

+0

+1 para compartir esta característica ... –

Cuestiones relacionadas