快速傅里叶变换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组用户等。…

pythonrandrange_Python3 randrange() 函数

Python3 randrange() 函数 描述 randrange() 方法返回指定递增基数集合中的一个随机数,基数缺省值为1。 语法 以下是 randrange() 方法的语法:import random random.randrange ([start,] stop [,step]) 注意:randrange()是不能直接访问的,需要…

服务器信息化平台,管理系统的信息化平台.ppt

管理系统的信息化平台管理系统中计算机应用 第三章 管理系统的信息化平台 本章主要内容 任何管理信息系统的运行都需要依靠特定的环境支持,这种环境称为信息化处理的基础平台。 本章节介绍了信息化平台的基本组成:计算机平台、通信平台、网络平台和数据库…

中运算符百分号作用_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上的游戏一直因为使用的服务器不同,不能实现两个平台的游戏互动,当然也不能实现同账号的资料同步。这对很多玩家来说造成一定的困扰,如…

python中count的作用_python中内置的.count是什么?

我一直在checkio.com上解决问题,其中一个问题是:“编写一个函数来查找在给定字符串中出现最大次数的字母” 最重要的解决方案是: import string def checkio(text): """ We iterate through latin alphabet and count each letter in the…

mysql 5.0 修改字符集_修改及查看mysql数据库的字符集

Liunx下修改MySQL字符集:1.查找MySQL的cnf文件的位置find / -iname *.cnf -print/usr/share/mysql/my-innodb-heavy-4G.cnf/usr/share/mysql/my-large.cnf/usr/share/mysql/my-small.cnf/usr/share/mysql/my-medium.cnf/usr/share/mysql/my-huge.cnf/usr/share/texm…

python range函数怎么表示无限_Python for循环与range函数的使用详解

for 循环 for … in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(iterates),即它会遍历序列中的每一个项目 注意: 1、else 部分是可选的。当循环中包含它时,它循环中包含它时,它总会…

php输出查询mysql总数_PHP查询语句,如何返回总记录数??

展开全部PHP查询语句&#xff0c;e69da5e6ba903231313335323631343130323136353331333337626231有两种方法获得查询的总记录数。一是使用mysql_num_rows函数&#xff0c;例子代码&#xff1a;<?php $link mysql_connect("localhost", "mysql_user", &…

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

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

mysql left join 查询_MySQL联表查询基本操作之left-join常见的坑

概述对于中小体量的项目而言&#xff0c;联表查询是再常见不过的操作了&#xff0c;尤其是在做报表的时候。然而校对数据的时候&#xff0c;您发现坑了吗&#xff1f;本篇文章就 mysql 常用联表查询复现常见的坑。基础环境建表语句DROP TABLE IF EXISTS role;CREATE TABLE role…

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

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

php mysql html 转义字符_php, html, javascript, mysql 之间的特殊字符处理

特殊字符指在程序中有具有特殊的控制意义的字符&#xff0c;一般来讲各个程序语言所使用的特殊字符大部分都来源于传统的 C 语言&#xff0c;加上自身的扩展&#xff0c;便较为完整的满足了编程需求。 程序自身的转义处理能够解决自身的处理需求&#xff0c;问题基本上都集中…