Почему это обратное преобразование Фурье дает правильные результаты?

Я хочу инвертировать преобразование Фурье изображения в MATLAB, но результат не является исходным изображением (как и должно быть). Очевидно, есть некоторые детали реализации, о которых я не знаю, что вызывает проблему. Здесь код:

img = imread('img.jpg');
fft = fft2(img);
inv = ifft2(fft);
imshow(inv);

Ответ 1

Так как FFT2 и IFFT2 оба поддерживает только входные данные типа double и single, ваш данные изображения (который, скорее всего, относится к типу uint8) сначала преобразуется в тип double перед обработкой FFT2. Поэтому вам нужно будет преобразовать ваше выходное изображение inv обратно в 8-битное целое без знака, используя функцию UINT8 для восстановления исходного изображения

>> 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!

ПРИМЕЧАНИЕ: В качестве дополнительного совета я бы не стал называть ваши переменные fft и inv, поскольку функции с этими именами уже существуют в MATLAB.

Ответ 2

Также, если вы пытаетесь сделать FFT на цветном (24-битном) изображении - обратите внимание, что imread() вернет массив M x N x 3. Таким образом, вы должны выполнять БПФ на каждом канале R/G/B отдельно.

Подробнее см. здесь.