Как я могу восстановить свое изображение обратно из спектра Фурье - PullRequest
0 голосов
/ 06 ноября 2018

Я сделал следующее изображение: PandaNoise.bmp и попытался удалить периодический шум, сосредоточившись на его спектре Фурье. Я не уверен в комментариях. Я не могу вернуть его на плоскость изображения. Что я тут не так делаю?

panda = imread('PandaNoise.bmp');
fpanda = fft2(panda); % 2d fast fourier transform
fpanda = fftshift(fpanda); % center FFT
fpanda = abs(fpanda); % get magnitude
fpanda = log(1 + fpanda); % use log to expand range of dark pixels into bright region
fpanda = mat2gray(fpanda); % scale image from 0 to 1
figure; imshow(fpanda,[]); % show the picture
zpanda = fpanda;
zpanda(fpanda<0.5)=0;
zpanda(fpanda>0.5)=1;
%img = ifft2(zpanda);
%img = ifftshift(img);
%img = exp(1-img);
%img = abs(img);

1 Ответ

0 голосов
/ 06 ноября 2018

Вот пример того, как работать со сложным преобразованием Фурье. Мы можем взять логарифмический модуль для отображения, но не изменять исходную матрицу преобразования Фурье, так как информация о фазе, которую мы отбрасываем с помощью abs, очень важна.

% Load data
panda = imread('https://i.stack.imgur.com/9SlW5.png');
panda = im2double(panda);

% Forward transform
fpanda = fft2(panda);

% Prepare FT for display -- don't change fpanda!
fd = fftshift(fpanda);
fd = log(1 + abs(fd));
figure; imshow(fd,[]); % show the picture
% From here we learn that we should keep the central 1/5th along both axes

% Low-pass filter
sz = size(fpanda);
center = floor(sz/2)+1;
half_width = ceil(sz/10)-1;
filter = zeros(sz);
filter(center(1)+(-half_width(1):half_width(1)),...
       center(2)+(-half_width(2):half_width(2))) = 1;
filter = ifftshift(filter); % The origin should be on the top-left, like that of fpanda.
fpanda = fpanda .* filter;

% Inverse transform
newpanda = ifft2(fpanda);
figure; imshow(newpanda);

После вычисления ifft2, newpanda должно быть чисто вещественным, если мы правильно спроектировали фильтр (то есть абсолютно симметричны относительно начала координат). Любой мнимый компонент, все еще присутствующий, должен быть чисто числовой неточностью. MATLAB обнаружит, что входные данные для ifft2 сопряженно симметричны, и выдаст чисто реальный результат. Октава не будет, и вам придется сделать newpanda=real(newpanda), чтобы избежать предупреждений от imshow.

...