关于二维DFT的原理的话,可以参考清华出版的《图像工程 上册》,所以此处赘述二维DFT的原理,如果不懂的话,那效果图像也不会理解为什么。
所以我在代码中直接调用库fft2(X);
% by keyhero
% img_fft.m
clear;
lena=imread('lena.bmp');
freq=fft2(lena);
freq = fftshift(freq);
ampt=abs(freq);
temp=max(ampt);
max_val=max(temp);
temp=min(ampt);
min_val=min(temp);
slope=255/(max_val - min_val);
for i=1:256
for j=1:256
temp(i,j)=uint8(slope*(ampt(i,j) - min_val));
if temp(i,j)~=0
temp(i,j)=256;
end
end
end
imgfft=uint8(temp);
subplot(121);imshow(lena);
subplot(122);imshow(imgfft);
你会发现,这是不是很乱的图像,看起来是杂乱无章的,正常情况应该是高频率居于中间部位,低频位于四周,事实上图像数组是这样分布的,只是在计算机上只能显示到255的灰度值。
所以,应该进行灰度映射,把从max映射到255
matlab显示的数值分布如下:
所以就有了以上代码中的for循环,并且,为了突出显示效果,把像素值进行了二值化
之后的结果如下:
可以发现,当进行图像显示像素值归一化之后,居于图像中间部分(也就是傅里叶变换的低频部分)比较明显,并且在纵向和横向上具有实序列傅里叶变换的对称性。之所以低频部分比较多,这图像的像素分布决定的。
Thank you!

本文通过Matlab代码演示了如何使用二维离散傅里叶变换(2D DFT)处理图像,包括频率域的可视化及灰度映射,揭示了图像的频率特性。
7025





