通过Numpy和OpenCV两种方法都可实现傅里叶变换。本节介绍Numpy方法。

Numpy模块中的fft2()函数可以实现图像的傅里叶变换。本节还介绍如何高通滤波。

实现傅里叶变换

Numpy提供的傅里叶变换函数为:

返回值 = numpy.fft.fft2( 原始图像 )
  • 原始图像的类型为灰度图形
  • 返回值是一个复数数组

通过该函数,能得到图像的频谱信息。但是得到的领频率分量位于频谱的左上侧。为了观察方便,通常还会使用numpy.fft.fftshift()函数将零频率成分移动到频域图像的中心位置,语法:

返回值 = numpy.fft.fftshift(原始图像)

对图像进行傅里叶变换后,得到的是一个复数数组。为了显示为图像,需要将其转换为[0, 255]的灰度空间内:

新像素值 = 20 * np.log(numpy.abs(频谱值)) 

例:用Numpy实现傅里叶变换,观察得到的频谱图像。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread(r'E:\Blog\OpenCV\Process\boy.png',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#magnitude_spectrum1 = 20*np.log(np.abs(fshift))
magnitude_spectrum1 = 20*np.log(np.abs(fshift))

plt.subplot(121)
plt.imshow(img,cmap = 'gray')
plt.title('ORIGINAL')
plt.axis('off')

plt.subplot(122)
plt.imshow(magnitude_spectrum1,cmap = 'gray')
plt.title('RESULT')
plt.axis('off')

plt.show()

得到原始图像及其频谱图像:

运行结果

实现逆傅里叶变换

需要注意的是,在上面傅里叶变换之后,为了观察方便,使用numpy.fft.fftshift()函数将零频率成分移动到频域图像的中心位置,因此,在使用逆傅里叶变换的时候需要先将其再移回左上角,语法:

移回去的频谱 = numpy.fft.ifftshift(原始频谱) #ifftshift是fftshift的逆函数

再进行逆傅里叶变换:

返回值 = numpy.fft.ifft2(频域数据)

得到的返回值仍然是复数数组。

逆傅里叶变换得到的空域是一个复数数组,需要将该信息调整至[0,255]灰度空间内:

iimg = np.abs(逆傅里叶变换结果)

高通滤波示例

在一副图像内,同时存在着高频信号和低频信号。

  • 低频信号对应图像内变化缓慢的灰度分量。例如,在一个草原图片中,低频信号对应着颜色趋于一致的广袤草原。
  • 高频信号对应着图像内变化越来越快的灰度分量,是由灰度的尖锐过渡造成的。草原中还有个狮子,那么高频信号就对应着狮子的边缘等信息。

滤波器能够允许一定频率的分量通过或者拒绝其通过,因此可以划分为低通滤波器以及高通滤波器。

  • 允许低频信号通过的滤波器称为低通滤波器。低通滤波器使高频信号衰减而对低频信号放行,会使图像变模糊
  • 允许高频信号通过的滤波器称为高通滤波器。高通滤波器使低频信号衰减而让高频信号通过,将增强图像中尖锐的细节,但是会导致图像的对比度降低。

傅里叶变换可以将图像的高频信号和低频信号分离。例如,傅里叶变换可以将低频信号放置到傅里叶变换图像的中心位置,如图所示,低频信号位于右图的中心位置。可以对傅里叶变换得到的高频信号和低频信号分别进行处理,例如高通滤波或者低通滤波。在对图像的高频或低频信号进行处理后,再进行逆傅里叶变换返回空域,就完成了对图像的频域处理。通过对图像的频域处理,可以实现图像增强、图像去噪、边缘检测、特征提取、压缩和加密等操作。

例如,如果需要构造一个中心位置60X60的高通滤波器:

rows, cols = img.shape
crow,ccol = int(rows/2),int(cols/2)  #获得中心位置
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

例:在Numpy内对图像进行傅里叶变换,得到其频域图像。然后,在频域内将低频分量的值处理为0,实现高通滤波。最后,对图像进行逆傅里叶变换,得到恢复的原始图像,观察傅里叶变换前后图像的差异。

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread(r'E:\Blog\OpenCV\Process\boy.png',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-10:crow+10, ccol-10:ccol+10] = 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('RESULT')
plt.axis('off')

plt.show()

运行结果


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV46.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏