快速傅里叶变换python_【原创】OpenCV-Python系列之傅里叶变换(三十八)

OpenCV-Python系列之傅里叶变换

傅里叶变换

我们生活在时间的世界中,早上7:00起来吃早饭,8:00去挤地铁,9:00开始上班。。。以时间为参照就是时域分析。

但是在频域中一切都是静止的!可能有些人无法理解,我建议大家看看这个文章,写的真是相当好,推荐!

傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性。实现 DFT 的一个快速算法被称为快速傅里叶变换(FFT)。

对于一个正弦信号,如果它的幅度变化非常快,即f数值比较大,我们可以说他是高频信号,如果变化非常慢,即f数值比较小,我们称之为低频信号。你可以把这种想法应用到图像中,那么我们如何看待图像的变化幅度大小呢?那就是看边界点和噪声,一般边界和噪声是图像中的高频分量(注意这里的高频是指变化非常快,而非出现的次数多)。如果没有如此大的幅度变化我们称之为低频分量。

那么用傅里叶变换进行滤波的优点在哪儿呢,它可以把图像由时域转换成频域,由于频域中的信息更为简单,所以滤波起来更为方便,滤波之后再转换到时域,那么就相当于一个滤波了。

傅里叶变换的作用

·高频:变化剧烈的灰度分量,例如边界

·低频:变化缓慢的灰度分量,例如一片大海

所以一般情况下,由于图像中的高频分量与低频分量都存在,我们可以用傅里叶变换进行滤波。

滤波

·低通滤波器:只保留低频,会使得图像模糊

·高通滤波器:只保留高频,会使得图像细节增强

我们来看傅里叶变换的函数原型:

dst=cv2.dft(src, dst=None, flags=None, nonzeroRows=None)

第一个参数src为输入图像

dst是输出图像,包括输出图像的大小和尺寸

flags有五种,为转换标志:

1、DFT _INVERSE:执行的是反向的一维或者二维的转换。

2、DFT _SCALE:矩阵的元素数量除以它,产生缩放效果。

3、DFT _COMPLEX_OUTPUT:执行正向转换。

4、DFT _REAL_OUTPUT:执行一维或二维复数阵列的逆变换,结果通常是相同大小的复数数组,但如果输入数组具有共轭复数对称性,则输出为真实数组。

5、DFT _ROWS:执行正向或者反向变换输入矩阵的每个单独的行,该标志可以同时转换多个矢量,并可用于减少开销以执行3D和更高维度的转换等。

nonzeroRows:表示当参数不为零时,函数假定只有nonzeroRows输入数组的第一行(未设置)或者只有输出数组的第一个(设置)包含非零,因此函数可以处理其余的行更有效率,并节省一些时间;这种技术对计算阵列互相关或使用DFT卷积非常有用。

继续来分析傅里叶逆变换函数:

dst = cv2.idft(src[, dst[, flags[, nonzeroRows]]])

src: 表示输入图像,包括实数或复数。

dst: 表示输出图像。

flags: 表示转换标记。

nonzeroRows: 表示要处理的dst行数,其余行的内容未定义。

得到的结果中频率为零的部分会在左上角,通常要转换到中心位置,可以通过np.fft.fftshift()和np.fft.ifftshift()变换来实现,前者是傅里叶变换,后者是傅里叶逆变换。

cv2.dft()返回的结果是双通道(实部、虚部),通常需要转换成图像格式才能展示(0,255),让我们看一下代码:def dft():

img = cv2.imread('min.jpg', 0) # 将图像转换成灰度图

dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) # 进行傅里叶变换

dft_shift = np.fft.fftshift(dft) # 将频率为零的部分转移到中心位置

magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) # 公式

plt.subplot(121), plt.imshow(img, cmap='gray')

plt.title('Input Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')

plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])

plt.show()

1595160336757073.png

可以看到,中心部分比较亮,越靠近中间位置低频信息越多,而高频信息则都在边界部分。

接下来要想对其进行滤波,应该怎么办呢?

显而易见,既然我们要去除低频分量,那就定一个范围,比如30*30的正方形范围,以图像中心为正方形中心点,将这个范围以内的高亮度的像素点去掉,就完成了滤波,然后我们再使用傅里叶逆变换将图像还原就可以看到。

代码:def filter():

img = cv2.imread('min.jpg', 0)

img_float32 = np.float32(img)

dft = cv2.dft(img_float32, flags=cv2.DFT_COMPLEX_OUTPUT)

dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape

crow, ccol = int(rows / 2), int(cols / 2) # 中心位置

# 低通滤波

mask = np.zeros((rows, cols, 2), np.uint8)

mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1

# 高通滤波器

# mask = np.ones((rows, cols, 2), np.uint8)

# mask[crow-30:crow+30, ccol-30:ccol+30] = 0

# IDFT

fshift = dft_shift * mask

f_ishift = np.fft.ifftshift(fshift)

img_back = cv2.idft(f_ishift)

img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])

plt.subplot(121), plt.imshow(img, cmap='gray')

plt.title('Input Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(img_back, cmap='gray')

plt.title('Result'), plt.xticks([]), plt.yticks([])

plt.show()

低通结果:

1595160351575052.png

也可以设计高通滤波器将低频部分去除,代码在上面也有,只需修改掩模即可,构建一个掩模,与低频区域对应的地方设置为 0, 与高频区域对应的地方设置为 1。下图为效果图,高通结果:

1595160356279659.png

可以看到,高通滤波相当于保留了图像的边缘部分,因为边缘部分属于高频信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 服务器性能监控,C#服务器性能监控之WMI的代码示例详解

1.WMI简介WMI是英文Windows Management Instrumentation的简写,通过使用WMI,我们可以获取本地或远程服务器的性能参数和进程运行情况,以及大部分硬件信息,但前提是运行的用户要有足够的权限,如administrator组用户等。…

中运算符百分号作用_SQL基础知识——LIKE运算符

LIKE 作用在WHERE子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与LIKE运算符一起使用:% - 百分号表示零个,一个或多个字符_ - 下划线表示单个字符注意: MS Access使用问号(?)而不是下划线(_)。 百分号和下划线也可以…

服务器点播直播系统,服务器点播直播系统

服务器点播直播系统 内容精选换一换在SAP系统中,除了SAP HANA节点使用裸金属服务器外,其他节点都使用弹性云服务器。Jump Host弹性云服务器,用户可通过访问该服务器后,再通过SSH协议跳转到SAP HANA及SAP应用节点。同时用于部署SAP…

eureka多了一个莫名其妙的服务_SpringCloud 服务注册与发现组件 Eureka

一、SpringCloud介绍微服务,为了更好的创建项目组织结构、更高效的项目的迭代效果、更优良的架构设计,就需要使用微服务的架构思想,来对项目进行搭建或者重构。企业碰到的第一个问题是服务如何进行拆分。根据业务边界来划分,拆分开…

怎么用贝塞尔工具画圆_Win10恶意软件删除工具怎么用?这个方法都舍不得分享...

Win10恶意软件删除工具怎么用?恶意软件删除工具相信很多朋友都会在windows更新中看到过,但是很多朋友确从来没有用过,微软每个月都会把恶意软件删除工具给更新一下,主要作用是用来分析用户电脑上是否存在风险程序的工具。其实大家…

springboot 获取bean_SpringBoot高级(自动配置 事件监听 监控)

SpringBoot自动配置condition-1Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载相应的BeanConditional要配和Condition的实现类(ClassCondition)进行使用ClassConditionpublic class ClassCondition implements Condition {…

golang延时_golang 实现延迟消息原理与方法

实现延迟消息具体思路我是看的下面这篇文章https://mp.weixin.qq.com/s/eDMV25YqCPYjxQG-dvqSqQ实现延迟消息最主要的两个结构:环形队列:通过golang中的数组实现,分成3600个slot。任务集合:通过map[key]*Task,每个slot…

python特征工程插件_手把手教你用Python实现自动特征工程

任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置。 特征工程具有强大的潜力,但是手动操作是个缓慢且艰巨的过程。Prateek Joshi,是一名数据科学家,花了…

2020笔记本性价比之王_笔记本电脑性价比排行2020前十名?

展开全部1、 联想(Lenovo)拯救者R7000产品材质:32313133353236313431303231363533e58685e5aeb931333433656631ABCD面塑料产品尺寸:15.6寸CPU型号: AMD Ryzen5 4600H显卡型号:NVIDIA GeForce GTX 1650屏幕参数: 1080P I…

ios不行安卓可以 微信签名_王者荣耀安卓、iOS互通来了!现在可以互看好友资料...

3月10日消息,王者荣耀在更新正式服后,安卓版和iOS版开通了资料互看。此前安卓和iOS上的游戏一直因为使用的服务器不同,不能实现两个平台的游戏互动,当然也不能实现同账号的资料同步。这对很多玩家来说造成一定的困扰,如…

存储型xss漏洞怎么解决_FinDOMXSS:一款针对DOM型XSS漏洞的快速扫描工具

FinDOM-XSSFinDOM-XSS是一款针对DOM型XSS漏洞的快速扫描工具,广大安全研究人员可以利用FinDOM-XSS快速地发现/扫描出目标应用中潜在的DOM型XSS漏洞。工具安装广大研究人员可以使用下列命令将该项目源码克隆至本地:$ git clone https://github.com/dwisis…

c语言如何判断数据是否符合正态分布_统计学里的数据正态性检验

在前面的文章中讲过,很多模型的假设条件都是数据是服从正态分布的。这篇文章主要讲讲如何判断数据是否符合正态分布。主要分为两种方法:描述统计方法和统计检验方法。01.描述统计方法描述统计就是用描述的数字或图表来判断数据是否符合正态分布。常用的方…

python matplotlib_Python の Matplotlib

matplotlib是python优秀的数据可视化第三方库。matplotlib.pyplot子库可以调用全部功能,便于用户使用。绘图-plt.plot(x,y,format,**kwargs)x:x轴数据y:y轴数据format_string:控制曲线的格式字符串,颜色线条点**kwargs…

mysql 数据库还原 不齐_请教mysql数据库还原问题。

你的位置:问答吧-> 数据库-> 问题详情请教mysql数据库还原问题。50多m,能不能拆分?上传到服务器上总是超时。怎么办?[ 本帖最后由 geniux 于 2007-9-24 15:23 编辑 ]作者: geniux发布时间: 2007-09-20继续请教,现在数据库传…

python self理解_Python面向对象总结,让你快速掌握面向对象常用的用法

python等面向对象的提出是为了更好的处理和管理同属一个类别的事情,这样就可以省去多余重复的基础代码,让程序变得更加简洁和强大。对于学习编程的朋友来说,熟悉掌握面向对象是非常重要的。下面开始讲讲关于python面向对象的知识,…

mysql 查询 汇总_Mysql-Sql查询汇总

软件测试Mysql-Sql查询汇总简单查询创建students表create table students(id int not null unique primary key auto_increment,name varchar(10) not null,class varchar(10) not null,grade int)添加数据insert into students values(0,老1,1班,80);insert into students val…

pat和ccf哪个含金量高_函授和网络教育哪个好 哪个含金量高

函授和网络教育都是成人教育学习的方式,但是考生报考的时候选择哪个比较好,下面小编整理了相关信息,以供参考。一、函授好还是网络教育好其实这两种教育方式都各有各的优点,两者都是不可替代的,这两种方式对于不同阶段…

mysql各种联结的区别_mysql几种连接方式区别

mysql的几种join2017年03月19日 14:49:07 carl-zhao 阅读数:7845 标签: mysqlsqljoin 更多个人分类: MySQL版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012410733/article/details/63…

python和office_Python在office开发中的应用

Python with Excel 有几个很好的Python模块能够方便地操作Excel的数据,包括读与写,不要求本地安装Excel。例如pandas, openpyxl, xlrd, xlutils 和 pyexcel. 详情可以参考下面的介绍: https://www.datacamp.com/community/tutorials/python-e…

android通过用户名密码访问服务器获取信息_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...

数据库服务器通常包含着关键的数据,所以为了确保这些数据的安全和完整需要要利用访问控制。MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少(即用户不能对过多的数据具有访问权)访…