数字图像的傅里叶变换(Fourier Transform)及其展示: 频率中心化
本文通过理论和MATLAB实际例子验证如下结论:1. 大部分图片的有效信息集中在低频部分;2. 图像傅里叶变换后低频在四周、高频在中心;3. 图像经过傅里叶变换、频率中心化后能够容易地复原;从而进一步说明图像通常需要进行频率中心化操作以方便处理;1.大部分图片的有效信息集中在低频部分图片的高频部分主要是边缘等细节,主要内容大部分是低频部分。因此,大部分图片的有效信息...
本文通过理论和MATLAB实际例子验证如下结论:
1. 大部分图片的有效信息集中在低频部分;
2. 图像傅里叶变换后低频在四周、高频在中心;
3. 图像经过傅里叶变换、频率中心化后能够容易地复原;
从而进一步说明图像通常需要进行频率中心化操作以方便处理;
1. 大部分图片的有效信息集中在低频部分
图片的高频部分主要是边缘等细节,主要内容大部分是低频部分。因此,大部分图片的有效信息集中在低频部分。从图3中我们可以看出,在去除图片中频率最低的一小部分后,图像出现了明显的锐化;而反过来,当只保留图像中频率最低的一小部分后,明显有更多的信息得到了保留。
2. 图像傅里叶变换后低频在四周、高频在中心
理论解释下面这个链接很到位:
图像经过傅里叶变换以后,得到的频谱图为啥是对称的?又为啥在未频谱居中时,四周代表是低频,中间是高频? - DBinary的回答 - 知乎
总结起来就是:
二维傅里叶变换是对图像每行做一次一维傅里叶变换,再对其每列做一次一维傅里叶变换,依据从左到右频率增高的原则,最后不就变成了中间是高频,四个角是低频了么.当然为了观察方便常常用fftshift方法将低频移到中心。
Note:一维傅里叶变换本身也是高频在中间,低频在两端,经过fftshift才是低频在中间的样子,可以通过如下MATLAB代码验证:
x=1:0.1:100;
z=0.1*sin(2*pi*x)+1*sin(4*pi*x);
Z = fft(z);
plot(abs(Z));
图形如下:
3. 图像经过傅里叶变换、频率中心化后能够容易地复原
傅里叶变换具有可逆性,这也是它能够得到广泛应用的原因之一。而MATLAB中的fft2与ifft2; fftshift与ifftshift则使我们可以很方便地完成这些操作。
下图表示出图形的傅里叶变换和频率中心化的结果:
下图是由中心化的频域图复原得到的空间域图,表现了傅里叶变换的可逆性
下图是将一小部分低频置零后的结果:
下图则是将除了一小部分低频,其他大部分频域分量均置零后的结果,很好地说明了这个图像的信息大量集中在低频部分。
MATLAB代码如下:
image = imread('camera.png');
image=rgb2gray(image);
image=im2double(image);
F_image = fft2(image);
figure(1)
subplot(221)
imshow(image);
title('original image')
subplot(222)
imshow(abs(F_image))
title('magnitude of Frequency image')
subplot(223)
imshow(angle(F_image))
title('phase of Frequency image')
subplot(224)
imshow(fftshift(abs(F_image)))
title('central')
F_imageAfterCentral = fftshift(F_image);
figure(2)
subplot(311)
originalRecoverImage = ifft2(ifftshift(F_imageAfterCentral));
imshow(originalRecoverImage)
title('IFT of the original spectrogram')
% 将四边取0(即将中心化后的中心点取0)
subplot(312)
F_imageAfterCentral_m = F_imageAfterCentral;
F_imageAfterCentral_m(280:300,280:300) = 0;
imshow(ifft2(ifftshift(F_imageAfterCentral_m)))
title('setting the small central area(low frequency) to 0')
subplot(313)
F_imageAfterCentral_m1 = F_imageAfterCentral;
F_imageAfterCentral_m2 = F_imageAfterCentral;
F_imageAfterCentral_m1(280:300,280:300) = 0;
F_difference = F_imageAfterCentral_m2 - F_imageAfterCentral_m1;
imshow(ifft2(ifftshift(F_difference)))
title('setting all area to 0 except the small central area(low frequency)')
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)