如果你对傅里叶变换到底是干嘛的不太熟悉,可参考:0704:傅里叶变换
这里主要说一下傅里叶变换应用于图像处理,显示原图像的频谱图像.
在Python中,实现傅里叶的变换主要有两种方法,一种是使用numpy,一种是OpenCV.
1.numpy
① 傅里叶变换
函数1:numpy.fft.fft2()
功能:实现傅里叶变换;
返回:一个复数数组.
图1 fft2函数
复数包括实数与虚数,复数可以写成: z=a+bi .
其中a为实部,b为虚部,i为虚数单位,当a、b都不为0时,
z为虚数.当b=0时,z为实数. 当a=0时,z为纯虚数.
函数2:numpy.fft.fftshift()
功能:将零频率分量移到频谱中心.
图2 fftshif函数
函数3:20*np.log(np.abs(fshift))
功能:傅里叶变换得到的结果是一个复数数组,不能直接用于显示图像,要想得到频谱灰度图像,我们需要一个映射,把复数映射[0, 255]之间.
图3 映射函数
实验1:
import
图4 原图像与频谱图像
Q1:现在我们得到频谱图,现在我们应该想一个问题,我们对图像作傅里叶变换是为了啥?
A1:
★ 傅里叶变换变换可以得到高频与低频,针对高频与低频处理,可以实现不同的目的;
★ 傅里叶变换是可逆的,通过逆傅里叶变换,可以恢复原图像;
★ 如果对高频与低频进行处理,然后进行逆傅里叶变换,所做的处理会反映到逆变换图像上.
附加:在数据可视化方面,推荐看这篇文章:0704:matplotlib: 数据可视化
前面提到了逆傅里叶变换,那怎么做呢?
② 逆傅里叶变换
函数:np.abs(i_img)
功能:设置值范围
图5 设置值范围
实验2:
import
图6 原图像与逆变换图像
2. 高通滤波
① 低频、高频
低频对应图像内变化较为缓慢的灰度分量. 例如:在一幅广袤的绿色大草原上,一大片绿色就代表着低频(没什么变化).
高频对应图像内变化较快的灰度分量,是由灰度的尖锐过度造成的,例如:如果这个大草原上,有一只雄狮,狮子的边缘就代表着高频.
② 滤波
接受(通过)或拒绝一定频率的分量,就称为为滤波.
通过低频的滤波器,称为低通滤波器.
通过高频的滤波器,称为高能滤波器.
③ 频域滤波
Q2:前面,我们已经说过傅里叶变换,逆傅里叶变换,现在我们该怎么在频域的基础上,对图像进行处理呢?
A2:对图像进行傅里叶变换,修改频谱图像,然后IDFT返回到图像域.
特殊目的:图像增强、图像去噪、边缘检测、特征提取、压缩、加密等等.
衰减高频而通过低频,低通滤波器,将模糊一幅图像.
衰减低频而通过高频,高通滤波器,将增强尖锐的边缘,但是会导致图像的对比度下降(丢失了低频细节信息).
★ 高通滤波
频谱图像中,中间较亮的部分是低频信息(像素值比较大),我们可以通过设置低频部分的像素值来减弱低频,如图7所示:
图7 高通滤波
图8 频谱腌膜图像
实验3:
import
图9 高通滤波效果
3.OpenCV
① 傅里叶变换
函数2:cv2.dft()
图10 dft函数
函数2:
图11 fftshift函数
函数3:
cv2.magnitude(参数1,参数2)
一维的复数数组),而cv2.dft()返回的是一个 二维数组(一维是复数的实部,一个是复数的虚部).
图12 magnitude函数
实验4:
import
图13 效果图
② 逆傅里叶变换
函数1:cv2.idft()
图14 idft函数
函数2:numpy.fft.ifftshift()
图15 ifftshift函数
实验5:
import
图16 逆傅里叶变换
4.低通滤波
低通滤波器:去掉高频,保留低频
图17 低通滤波器
实验6:
import
图18 低通滤波