如何从傅立叶光谱恢复图像

时间:2018-11-06 17:45:00

标签: matlab image-processing filtering fft

我拍了以下图片: 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 :(得分:0)

这里是如何使用复杂傅立叶变换的示例。我们可以采用对数模数进行显示,但不要更改原始的傅立叶变换矩阵,因为我们用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的警告。