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缩进区别分析
Feb 15 Python
有关wxpython pyqt内存占用问题分析
Jun 09 Python
Python中__call__用法实例
Aug 29 Python
跟老齐学Python之??碌某?? target=
Sep 12 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
May 16 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Python实现将蓝底照片转化为白底照片功能完整实例
Dec 13 Python
python PIL模块的基本使用
Sep 29 Python
Python使用BeautifulSoup4修改网页内容
May 20 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
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
jquery $("#variable") 循环改变variable的值示例
2014/02/23 Javascript
JQuery基础语法小结
2015/02/27 Javascript
js比较日期大小的方法
2015/05/12 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
学习python类方法与对象方法
2016/03/15 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
python保存文件方法小结
2018/07/27 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
有模特经验的简历自我评价
2013/09/19 职场文书
工作时间上网检讨书
2014/02/03 职场文书
2016年十一促销广告语
2016/01/28 职场文书
浅析Django接口版本控制
2021/06/26 Python