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实现html转ubb代码(html2ubb)
Jul 03 Python
Web服务器框架 Tornado简介
Jul 16 Python
Python 字典dict使用介绍
Nov 30 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
Python中pygame安装方法图文详解
Nov 11 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 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
在线短消息收发的程序,不用数据库
2006/10/09 PHP
PHP 代码规范小结
2012/03/08 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
JS在TextArea光标位置插入文字并实现移动光标到文字末尾
2013/06/21 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
python字符串,数值计算
2016/10/05 Python
Python序列操作之进阶篇
2016/12/08 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
django 环境变量配置过程详解
2019/08/06 Python
为什么称python为胶水语言
2020/06/16 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
施工员岗位职责范本
2015/04/11 职场文书
2015年幼师工作总结
2015/04/28 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
Python爬虫之爬取某文库文档数据
2021/04/21 Python