Вот пример того, как работать со сложным преобразованием Фурье. Мы можем взять логарифмический модуль для отображения, но не изменять исходную матрицу преобразования Фурье, так как информация о фазе, которую мы отбрасываем с помощью 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
.