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


Posted in Python onJune 09, 2021

前言

在前一篇的博文中,我们详细讲解了傅里叶变换的原理以及使用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实现傅里叶变换

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

到此这篇关于OpenCV-Python使用cv2实现傅里叶变换的文章就介绍到这了,更多相关OpenCV 傅里叶变换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python读大数据txt
Mar 28 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
Python从使用线程到使用async/await的深入讲解
Sep 16 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
python 中pyqt5 树节点点击实现多窗口切换问题
Jul 04 Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 Python
简单了解python列表和元组的区别
May 14 Python
python实现图像随机裁剪的示例代码
Dec 10 Python
Python编程源码报错解决方法总结经验分享
Oct 05 Python
Pygame Rect区域位置的使用(图文)
Nov 17 Python
python保存图片的四个常用方法
Feb 28 Python
Python合并多张图片成PDF
Jun 09 #Python
Python3 多线程(连接池)操作MySQL插入数据
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Django rest framework如何自定义用户表
Jun 09 #Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 #Python
python缺失值的解决方法总结
Jun 09 #Python
Python提取PDF指定内容并生成新文件
You might like
php 分库分表hash算法
2009/11/12 PHP
PHP函数常用用法小结
2010/02/08 PHP
php反射应用示例
2014/02/25 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
用YUI做了个标签浏览效果
2007/02/20 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
vue+webpack实现异步组件加载的方法
2018/02/03 Javascript
vue写一个组件
2018/04/09 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
JS中的模糊查询功能
2019/12/08 Javascript
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
简单学习Python多进程Multiprocessing
2017/08/29 Python
Python实现感知机(PLA)算法
2017/12/20 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
毕业生自荐信格式
2014/03/07 职场文书
护士自我鉴定总结
2014/03/24 职场文书
小学生手册家长评语
2014/04/16 职场文书
个人安全承诺书
2014/05/22 职场文书
稽核岗位职责范本
2015/04/13 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
redis数据一致性的实现示例
2022/03/18 Redis
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers