Reputation: 8272
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);
Upvotes: 12
Views: 12390
Reputation: 125854
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.
Upvotes: 15
Reputation: 11267
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.
Upvotes: 3