《OpenCV轻松入门:面向Python》读书笔记
作者:李立宗
出版社:电子工业出版社
出版时间:2019-05
第14章 傅里叶变换
14.2 Numpy实现傅里叶变换
Numpy模块提供了傅里叶变换功能,Numpy模块中的fft2()函数可以实现图像的傅里叶变换。
本节介绍
- 如何用Numpy模块实现图像的傅里叶变换,
- 以及在频域内过滤图像的低频信息,保留高频信息,实现高通滤波。
14.2.1 实现傅里叶变换
Numpy提供的实现傅里叶变换的函数是numpy.fft.fft2(),它的语法格式是:
返回值 = numpy.fft.fft2(原始图像)
参数“原始图像”的类型是灰度图像,函数的返回值是一个复数数组(complex ndarray)。
对图像进行傅里叶变换后,得到的是一个复数数组。为了显示为图像,需要将它们的值调整到[0, 255]的灰度空间内,使用的公式为:
像素新值=20*np.log(np.abs(频谱值))
14.2.2 实现逆傅里叶变换
- 需要注意的是,如果在傅里叶变换过程中使用了numpy.fft.fftshift()函数移动零频率分量,那么在逆傅里叶变换过程中,需要先使用numpy.fft.ifftshift()函数将零频率分量移到原来的位置,再进行逆傅里叶变换
- 函数numpy.fft.ifftshift()是numpy.fft.fftshift()的逆函数;numpy.fft.ifft2()函数可以实现逆傅里叶变换,返回空域复数数组。它是numpy.fft.fft2()的逆函数。
- 逆傅里叶变换得到的空域信息是一个复数数组,需要将该信息调整至[0, 255]灰度空间内,使用的公式为:
iimag=np.abs(逆傅里叶变换结果)
14.2.3 高通滤波示例
-
在一幅图像内,同时存在着高频信号和低频信号。
● 低频信号对应图像内变化缓慢的灰度分量。例如,在一幅大草原的图像中,低频信号对应着颜色趋于一致的广袤草原。
● 高频信号对应图像内变化越来越快的灰度分量,是由灰度的尖锐过渡造成的。如果在上面的大草原图像中还有一头狮子,那么高频信号就对应着狮子的边缘等信息。 -
滤波器能够允许一定频率的分量通过或者拒绝其通过,按照其作用方式可以划分为低通滤波器和高通滤波器。
● 允许低频信号通过的滤波器称为低通滤波器。低通滤波器使高频信号衰减而对低频信号放行,会使图像变模糊。
● 允许高频信号通过的滤波器称为高通滤波器。高通滤波器使低频信号衰减而让高频信号通过,将增强图像中尖锐的细节,但是会导致图像的对比度降低。 -
傅里叶变换可以将图像的高频信号和低频信号分离。
例如,傅里叶变换可以将低频信号放置到傅里叶变换图像的中心位置,如图14-9所示,低频信号位于右图的中心位置。
可以对傅里叶变换得到的高频信号和低频信号分别进行处理,例如高通滤波或者低通滤波。在对图像的高频或低频信号进行处理后,再进行逆傅里叶变换返回空域,就完成了对图像的频域处理。
通过对图像的频域处理,可以实现图像增强、图像去噪、边缘检测、特征提取、压缩和加密等操作。
14.2.4 高通滤波程序
【例14.3】在Numpy内对图像进行傅里叶变换,得到其频域图像。
然后,在频域内将低频分量的值处理为0,实现高通滤波。
最后,对图像进行逆傅里叶变换,得到恢复的原始图像。
观察傅里叶变换前后图像的差异。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\lena.bmp',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
rows, cols = img.shape
crow,ccol = int(rows/2) , int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('original'),plt.axis('off')
plt.subplot(122),plt.imshow(iimg, cmap = 'gray')
plt.title('iimg'),plt.axis('off')
plt.show()

运行上述代码后,得到如图14-13所示的傅里叶变换对比图。从图中可以看到,经过高通滤波后,图像的边缘信息得以保留。
网友评论