Why isn't this inverse Fourier transform giving the correct results?
Solution 1
Since fft2
and ifft2
both perform calculations in either double
or single
precision, your image data (which is likely of type uint8
) gets converted to type double
first before being processed by fft2
. You will therefore have to convert your output image inv
back to an unsigned 8-bit integer using the function uint8
to recover the original image:
>> 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!
NOTE: As an additional tip, I would avoid naming your variables fft
and inv
since functions with those names already exist in MATLAB.
Solution 2
Also if you are trying to do FFT on color (24-bit) image - note that imread() will return M x N x 3 array. So you should perform FFT on each R/G/B channel separately.
See this for detail.
Comments
-
Christopher Neylan almost 2 years
I want to invert the Fourier transform of an image in MATLAB, but the result is not the original image (as it should be). There is obviously some implementation detail that I don't know about that's causing the issue. Here's the code:
img = imread('img.jpg'); fft = fft2(img); inv = ifft2(fft); imshow(inv);
-
gnovice over 13 yearsActually, it appears that FFT2 handles that for you. If you type
type fft2
into the Command Window, you can see that a 3-D inputx
results in the operationfft(fft(x,[],2),[],1)
, which performs an FFT across the second then first dimension, while a 2-D inputx
(if you were passing each color plane separately) results in a call to FFTN. Comparing each method, the maximum absolute pixel-wise difference between the results is around 5.6e-10, likely due to differences in the order of operations. In short, the two are nearly equivalent.