Почему это обратное преобразование Фурье не дает правильных результатов? - PullRequest
12 голосов
/ 16 сентября 2010

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

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

Ответы [ 2 ]

15 голосов
/ 16 сентября 2010

Поскольку 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.

3 голосов
/ 16 сентября 2010

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

Подробнее см. В этом .

...