1. 傅里叶变换的理论基础
离散的傅里叶变换建立的函数从空间域之间的转换关系,把空间域难以显示的特征在频率域中十分清楚的显示出来。在数字图像处理中,经常需要这种转换关系和转换规律。具体请看数字图像处理一书。
注意:
- 傅里叶得到高频和低频的信息,针对低频,高频处理能够实现不同的目的。
- 傅里叶过程是可逆的,图像经过傅里叶变换,逆傅里叶变换后,能够恢复到原始的图像。
- 在频率对图像进行处理,在频域的处理会反映在逆变换图像上。
2. numpy实现傅里叶变换
2.1. 相关的函数
函数:numpy.fft.fft2
- 实现傅里叶变换
- 返回的是一个复数数组
函数:numpy.fft.fftshift
将零频率分量移动到频谱中心,有下图所示。
函数:20*np.log(np.abs(fshift))
经傅里叶变换的计算结果映射到[0,255]
这个区间内。
2.1 代码实现
#%%傅里叶变换 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\lena.bmp',cv2.IMREAD_GRAYSCALE) #进行傅里叶变换 f = np.fft.fft2(img) mid_result = 20*np.log(np.abs(f)) fshift = np.fft.fftshift(f) result = 20*np.log(np.abs(fshift)) fig,ax = plt.subplots(1,3,figsize=(10,3)) ax1 = plt.subplot(131) ax1.imshow(img,cmap="gray") ax1.axis("off") ax2 = plt.subplot(132) ax2.axis("off") ax2.imshow(mid_result,cmap="gray") ax3 = plt.subplot(133) ax3.axis("off") ax3.imshow(result,cmap="gray") plt.show()
结果
3. numpy实现逆傅里叶变换
3.1 相关的函数
函数:numpy.fft.ifft2
- 实现一个逆变换
- 返回的是一个复数数组
函数:numpy.fft.ifftshift
fftshift函数的逆函数。如下图所示: - 函数:
iimg = np.abs
将逆傅里叶变换结果设置到[0,255]
3.2 代码实现
#%%傅里叶逆变换 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread(r'C:\\Users\\lihuanyu\\Desktop\\opencv\\image\\boat.bmp',cv2.IMREAD_GRAYSCALE) #进行傅里叶变换 f = np.fft.fft2(img) ishift = np.fft.ifftshift(f) #逆变换 iimg = np.fft.ifft2(ishift) #设置区间 iimg = np.abs(iimg) fig,ax = plt.subplots(1,2,figsize=(7,3)) ax1 = plt.subplot(121) ax1.imshow(img,cmap="gray") ax1.axis("off") ax2 = plt.subplot(122) ax2.axis("off") ax2.imshow(iimg,cmap="gray") plt.show()
结果:
4. 在频域进行高通滤波
4.1 对高频、低频和滤波的理解
低频对应图像内变化缓慢的灰度分量。例如,在一幅大草原的图像中,低频对应着广袤的颜色趋于一致的草原。
高频对应图像内变化越来越快的灰度分量,是由灰度的尖锐过渡造成的。例如,在一幅大草原的图像中,其中狮子的边缘等信息。
滤波就是接受(通过)或者拒绝一定频率的分量。通过低频的滤波器称为低通滤波器;通过高频的滤波器称为高通滤波器。