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);
The inverse Fourier transform is defined by(12.4)ℱ−1[g](x)=1(2π)n· ∫ℝnf(ξ)eiξxdξ.
In mathematics, the Fourier inversion theorem says that for many types of functions it is possible to recover a function from its Fourier transform. Intuitively it may be viewed as the statement that if we know all frequency and phase information about a wave then we may reconstruct the original wave precisely.
It is unique. If the function f(t) is piecewise continious and square integrable the fourier coffiecients are unique.
Idea. In harmonic analysis, the Fourier inversion theorem states that the Fourier transform is an isomorphism on the Schwartz space of functions with rapidly decreasing partial derivatives. Moreover, it is its own inverse up to a prefactor and reflection at the origin.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With