OpenCV-Python使用cv2实现傅里叶变换

作者:一天一篇Python库 时间:2023-07-08 05:11:06 

前言

在前一篇的博文中,我们详细讲解了傅里叶变换的原理以及使用Numpy库实现傅里叶变换。但是其实OpenCV有直接实现傅里叶变换的函数。

在OpenCV中,我们通过cv2.dft()来实现傅里叶变换,使用cv2.idft()来实现逆傅里叶变换。两个函数的定义如下:


cv2.dft(原始图像,转换标识)

这里的原始图像必须是np.float32格式。所以,我们首先需要使用cv2.float32()函数将图像转换。而转换标识的值通常为cv2.DFT_COMPLEX_OUTPUT,用来输出一个复数阵列。

经过cv2.dft()函数的变换后,我们会得到原始图像的频谱信息。此时零分量与Numpy库实现一样都不在中心位置。这里我们还是需要使用numpy.fft.fftshift()函数将其移动到中间位置。

需要特别注意的是,函数cv2.dft()返回值是双通道的,第1个通道是结果的实数部分,第2个通道是结果的虚数部分。使用numpy.fft.fftshift()函数处理后,频谱图像还只是一个由实部和虚部构成的值,要显示出来,要使用到另一个函数cv2.magnitude()。

该函数的定义如下:


cv2.magnitude(参数1,参数2)

参数1:浮点型x坐标值,也就是实部

参数2:浮点型y坐标值,也就是虚部,它必须和参数1具有相同的大小(size)

得到频谱图像的幅度之后,还需要将幅度映射到灰度空间[0,255]内,使其以灰度图像显示出来。与前篇博文一样,使用20*np.log(cv2.magnitude())。

实现傅里叶变换

下面,我们来通过上述OpenCV函数来实现傅里叶变换,并显示其频谱信息。


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

img = cv2.imread("4.jpg", 0)

dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))

plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(result, cmap="gray")
plt.axis('off')
plt.show()

运行之后,显示效果与前篇博文一样。

OpenCV-Python使用cv2实现傅里叶变换

实现逆傅里叶变换

还是与上篇博文一样,这里我们过滤图像的频谱信息,这里我们过滤低频信息。


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

img = cv2.imread("4.jpg", 0)

dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))

rows,cols=img.shape
rows_half,cols_half=int(rows/2),int(cols/2)
mask=np.zeros((rows,cols,2),dtype=np.uint8)
mask[rows_half-30:rows_half+30,cols_half-30:cols_half+30]=1

#逆傅里叶变换
fShift=dftShift*mask
ishift=np.fft.ifftshift(fShift)
iimg=cv2.idft(ishift)
iimg=cv2.magnitude(iimg[:,:,0],iimg[:,:,1])

plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(iimg, cmap="gray")
plt.axis('off')
plt.show()

运行之后,效果如下:

OpenCV-Python使用cv2实现傅里叶变换

可以看到过滤低频信息后,图像的边缘信息被消弱了。

来源:https://liyuanjinglyj.blog.csdn.net/article/details/114016408

标签:OpenCV,傅里叶变换
0
投稿

猜你喜欢

  • Python实现字符串逆序输出功能示例

    2023-10-14 04:59:17
  • MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)

    2024-01-14 14:15:33
  • python函数缺省值与引用学习笔记分享

    2023-10-22 19:43:20
  • 2009淘宝网动画节日LOGO第一季

    2009-05-18 19:11:00
  • python实现Dijkstra算法的最短路径问题

    2023-05-18 23:22:15
  • python-docx修改已存在的Word文档的表格的字体格式方法

    2021-07-20 05:03:07
  • 深入分析JavaScript 事件循环(Event Loop)

    2024-04-18 10:51:52
  • go语言中值类型和指针类型的深入理解

    2024-04-28 09:18:29
  • javascript结合canvas实现图片旋转效果

    2023-08-07 23:47:59
  • sql中case语句的用法浅谈

    2024-01-28 07:52:37
  • Python自动化测试PO模型封装过程详解

    2023-08-23 18:59:49
  • Golang 字符串转time类型实现

    2024-04-28 09:16:54
  • go语言区块链学习调用智能合约

    2024-04-30 10:01:34
  • 查询SQLServer启动时间的三种方法

    2024-01-15 18:15:42
  • 在Mac OS上安装Go语言编译器的方法

    2024-05-22 17:48:40
  • sqlserver/mysql按天、按小时、按分钟统计连续时间段数据【推荐】

    2024-01-27 14:23:20
  • pandas 时间偏移的实现

    2021-09-24 03:54:01
  • jquery动态遍历Json对象的属性和值的方法

    2024-06-09 00:53:36
  • 利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例

    2022-11-30 20:40:01
  • Django 后台获取文件列表 InMemoryUploadedFile的例子

    2021-09-25 11:19:38
  • asp之家 网络编程 m.aspxhome.com