当前位置: 首页 > news >正文

002 OpenCV dft 傅里叶变换

目录

一、傅里叶变换

1.1 傅里叶变换概念

1.2 opencv中傅里叶变换

二、实验代码

一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、傅里叶变换

2.1 傅里叶变换概念

傅里叶变换(Fourier Transform)是一种在数学、物理和工程领域广泛应用的算法,用于分析信号或数据的频率成分。它是由法国数学家约瑟夫·傅里叶(Joseph Fourier)于19世纪初提出的,因此得名。傅里叶变换的基本思想是将一个时域信号转换为频域信号,或者将一个频域信号转换回时域信号。这种转换可以帮助我们更好地理解和分析信号的特性,例如幅度、频率和相位等。

傅里叶变换可以分为连续傅里叶变换(Continuous Fourier Transform,CFT)和离散傅里叶变换(Discrete Fourier Transform,DFT)。连续傅里叶变换用于处理连续时间信号,而离散傅里叶变换用于处理离散时间信号。在实际应用中,由于计算机处理的是离散数据,因此离散傅里叶变换更为常用。

离散傅里叶变换(DFT)的基本步骤如下:

  1. 对输入信号进行采样,得到离散时间信号。采样频率通常为原始信号频率的整数倍,以满足奈奎斯特采样定理。

  2. 对离散时间信号进行窗函数处理。窗函数的作用是减小信号截断引起的频谱泄漏,同时减小频谱旁瓣的影响。常用的窗函数有矩形窗、汉宁窗和海宁窗等。

  3. 计算离散时间信号的离散傅里叶变换。这可以通过快速傅里叶变换(Fast Fourier Transform,FFT)算法来实现,以提高计算效率。快速傅里叶变换是一种基于蝶形运算的高效算法,其计算复杂度为O(nlogn),其中n为信号长度。

  4. 对离散傅里叶变换的结果进行分析。通过观察频谱图,可以了解信号的频率分布、幅值和相位等信息。此外,还可以利用傅里叶变换的性质进行信号处理,例如滤波、降噪和压缩等。

傅里叶变换具有以下重要性质:

  1. 线性性质:傅里叶变换满足线性叠加原理,即两个信号的傅里叶变换之和等于这两个信号分别进行傅里叶变换后再相加的结果。

  2. 共轭对称性:对于实数信号,其傅里叶变换的共轭复数表示了信号的频谱。这意味着实数信号的频谱是以原点为中心的对称分布。

  3. 时移性质:对于任意实数τ,信号x(t)与其自身延时τ的信号x(t-τ)的傅里叶变换之比等于e^(j2πτ),其中j为虚数单位。这表明时移操作可以通过乘以复指数因子来实现。

  4. 频移性质:对于任意实数ω,信号x(t)与其频率为ω的信号cos(2πωt)的乘积的傅里叶变换等于X(f)与δ(f-ω)的卷积,其中δ(f)表示狄拉克δ函数。这表明频率调制可以通过乘以复指数因子和滤波操作来实现。

  5. 能量守恒:离散傅里叶变换的能量守恒性质表明,信号的总能量在时域和频域之间是平衡的。这意味着在频域中去除某些频率分量后,信号的总能量会相应地转移到其他频率分量上。

总之,傅里叶变换是一种强大的数学工具,广泛应用于通信、图像处理、音频处理、生物信息学等领域。通过傅里叶变换,我们可以更好地理解和分析信号的特性,从而实现信号的滤波、降噪、压缩等功能。

2.2 opencv中傅里叶变换

在数字图像处理中,空间域滤波和频域滤波都是常见的方法,但它们之间存在一些关键的区别。

  1. 空间域滤波:这种方法直接对图像进行操作,通常使用各种模板与图像进行卷积运算来实现图像的处理。由于其直接在图像空间上操作,这种方法的实现相对简单和直观。

  2. 频域滤波:频域滤波首先将图像从空间域转换到频域,然后对频率域中的图像数据进行处理,最后再将其转换回空间域。这种处理方法的优点在于,某些图像处理任务在频域中比在空间域中更为简单。例如,根据卷积定理,可以通过傅立叶变换将空域卷积滤波变换为频域滤波。此外,频域滤波允许设计者使用复杂的滤波器设计,这可能在空间域中难以实现。然而,需要注意的是,如果选用的频域滤波器具有陡峭的变化,可能会导致输出图像产生“振铃”现象,这是由于灰度剧烈变化处产生的。

在OpenCV库中,傅里叶变换和逆傅里叶变换的实现主要依赖于**cv2.dft()cv2.idft()**两个函数。在进行傅里叶变换时,你需要将原始图像转换为np.float32格式。

具体来说,cv2.dft()函数的定义是:cv2.dft(原始图像,转换标识)。其中,原始图像必须是np.float32格式,转换标识用于说明是傅里叶变换还是傅里叶逆变换。此函数返回与前一个相同的结果,但是有两个通道。第一个通道是结果的实部,第二个通道是结果的虚部。

另一方面,cv2.idft()函数被用来执行逆傅里叶变换。例如,如果你有一个通过傅里叶变换得到的复数矩阵,你可以使用这个函数来恢复原始图像。

需要注意的是,OpenCV提供的这两个函数的效率较高(比OpenCV自带的函数快3倍)。这是因为它们实现了一种称为快速傅立叶变换(FFT)的快速算法。

三、实验代码

from __future__ import print_function
import sysimport cv2 as cv
import numpy as npdef print_help():print('''代码演示离散傅里叶变换,同时也显示幅度谱''')def main(argv):print_help()I = cv.imread("d:/Data/1.jpg", cv.IMREAD_GRAYSCALE)if I is None:print('Error opening image')return -1## [expand]rows, cols = I.shapem = cv.getOptimalDFTSize( rows )n = cv.getOptimalDFTSize( cols )# 把图像边界拓展下padded = cv.copyMakeBorder(I, 0, m - rows, 0, n - cols, cv.BORDER_CONSTANT, value=[0, 0, 0])## [complex_and_real]planes = [np.float32(padded), np.zeros(padded.shape, np.float32)]complexI = cv.merge(planes)         # Add to the expanded another plane with zeros## [complex_and_real]## [dft]cv.dft(complexI, complexI)         # this way the result may fit in the source matrix## [dft]# compute the magnitude and switch to logarithmic scale# = > log(1 + sqrt(Re(DFT(I)) ^ 2 + Im(DFT(I)) ^ 2))## [magnitude]cv.split(complexI, planes)                   # planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))cv.magnitude(planes[0], planes[1], planes[0])# planes[0] = magnitudemagI = planes[0]## [magnitude]## [log]matOfOnes = np.ones(magI.shape, dtype=magI.dtype)cv.add(matOfOnes, magI, magI) #  switch to logarithmic scale# 取log是为了拉伸值cv.log(magI, magI)## [log]## [crop_rearrange]magI_rows, magI_cols = magI.shape# crop the spectrum, if it has an odd number of rows or columnsmagI = magI[0:(magI_rows & -2), 0:(magI_cols & -2)]cx = int(magI_rows/2)cy = int(magI_cols/2)q0 = magI[0:cx, 0:cy]         # Top-Left - Create a ROI per quadrantq1 = magI[cx:cx+cx, 0:cy]     # Top-Rightq2 = magI[0:cx, cy:cy+cy]     # Bottom-Leftq3 = magI[cx:cx+cx, cy:cy+cy] # Bottom-Righttmp = np.copy(q0)               # 交换象限(左上和右下交换)magI[0:cx, 0:cy] = q3magI[cx:cx + cx, cy:cy + cy] = tmptmp = np.copy(q1)               # 交换象限(右上和左下交换)magI[cx:cx + cx, 0:cy] = q2magI[0:cx, cy:cy + cy] = tmp# 归一化到 [0, 1]范围内cv.normalize(magI, magI, 0, 1, cv.NORM_MINMAX)# 原图得灰度图cv.imshow("Input Image"       , I   )# 幅度谱,也叫频谱cv.imshow("spectrum magnitude", magI)cv.waitKey()if __name__ == "__main__":main(sys.argv[1:])

原图:

灰度图:

幅度谱如下:中间是高频区域、边界是低频区域、幅度谱是关于图像中心对称的。

相关文章:

002 OpenCV dft 傅里叶变换

目录 一、傅里叶变换 1.1 傅里叶变换概念 1.2 opencv中傅里叶变换 二、实验代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、傅里叶变换 2.1 傅里叶变换概念 傅里叶变换(Fourier Transform)是一种…...

力扣:171. Excel 表列序号(Python3)

题目: 给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 来源:力扣(LeetCode) …...

C++中结构体的初始化

C中结构体的初始化 结构体是一个由程序员定义的数据类型,可以容纳许多不同的数据值。在过去,面向对象编程的应用尚未普及之前,程序员通常使用这些从逻辑上连接在一起的数据组合到一个单元中。一旦结构体类型被声明并且其数据成员被标识&…...

vue3+vite+ts 发布自定义组件到npm

vue3vite 发布自定义组件到npm 初始化项目编写组件配置打包组件上传到npm测试组件库 初始化项目 // 创建项目 pnpm create vite vue-test-app --template vue-ts// 运行项目 cd vite vue-test-app pnpm install pnpm run dev编写组件 1、根目录下创建packages目录作为组件的开…...

mybatis使用xml形式配置

以这个注解形式的查询代码为例 Select("select * from emp where name like concat(%,#{name},%) and gender #{gender} and entrydate between #{begin} and #{end} order by update_time desc ")public List<Emp> list(String name, Short gender, LocalDat…...

开源简历生成器OpenResume

什么是 OpenResume &#xff1f; OpenResume 是一个功能强大的开源简历生成器和简历解析器。OpenResume 的目标是为每个人提供免费的现代专业简历设计&#xff0c;让任何人都能充满信心地申请工作。 OpenResume 有 5 个核心特点&#xff1a; 特征描述1. 实时UI更新当您输入简历…...

AI变现之Gpts搞流量+赚钱

文章目录 Gpts | 搞流量 + 赚钱1.项目介绍2.项目分析3.项目实操4.变现路径Gpts | 搞流量 + 赚钱 1.项目介绍 这两天 AI 圈最火的莫过于 OpenAI 开发者大会公布的一个爆炸产品 Gpts 了,大家都知道这个肯定是一个划时代的产品,也绝对是一个风口,虽然官方还没有公布到底怎么通…...

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十六)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...

Elasticsearch文档操作

一、Elasticsearch的CURD 1、CURD之Create PUT lqz/doc/1 {"name":"顾老二","age":30,"from": "gu","desc": "皮肤黑、武器长、性格直","tags": ["黑", "长", "直…...

聊一聊go的单元测试(goconvey、gomonkey、gomock)

文章目录 概要一、测试框架1.1、testing1.2、stretchr/testify1.3、smartystreets/goconvey1.4、cweill/gotests 二、打桩和mock2.1、打桩2.2、mock2.2.1、mockgen2.2.1、示例 三、基准测试和模糊测试3.1、基准测试3.2、模糊测试 四、总结4.1、小结4.2、其他4.3、参考资料 概要…...

Positive Technologies 利用 PT Cloud Application Firewall 保护中小型企业的网络资源

云产品按月订购&#xff0c;无需购买硬件资源 PT Cloud Application Firewall 是 Positive Technologies 推出的首个用于保护网络应用程序的商用云产品。Web 应用层防火墙 (web application firewall, WAF) 现在可以通过 技术合作伙伴——授权服务商和云提供商以订购方式提供1…...

深入解析序列模型:全面阐释 RNN、LSTM 与 Seq2Seq 的秘密

探索序列建模的基础知识和应用。 简介 序列建模是许多领域的一个重要问题&#xff0c;包括自然语言处理 (NLP)、语音识别和语音合成、时间序列预测、音乐生成和「生物信息学」。所有这些任务的共同点是它们需要坚持。接下来的事情的预测是基于历史的。例如&#xff0c;在“哈桑…...

vue项目本地开发构建速度优化 hard-source-webpack-plugin

1、为啥要优化本地构建速度 有些项目因为项目需求点多、功能复杂、管理混乱、引入第三方插件/样式库过多、本身项目页面较多、文件较多等等原因&#xff0c;会导致项目体积变大、本地构建速度明显变慢&#xff0c;这时就需要对项目webpack进行一些设置来提高打包效率、加快打包…...

燕之屋通过港交所聆讯:苦战IPO十余年,黄健等人提前精准套现

撰稿|行星 来源|贝多财经 11月19日&#xff0c;厦门燕之屋生物工程股份有限公司&#xff08;下称“燕之屋”&#xff09;通过港交所聆讯&#xff0c;并披露了聆讯后资料集&#xff08;即招股书&#xff09;&#xff0c;中金公司和广发证券为其联席保荐人。 据贝多财经了解&a…...

【51单片机系列】C51基础

本文内容是关于C51语言的基础内容的&#xff0c;包括C51的数据类型、变量、运算符、函数以及reg52.h文件中的内容&#xff0c;有些与C中相同的内容没有记录在此&#xff0c;比如常量、某些变量、表达式、程序结构、数组等没有涉及。 文章目录 C51的数据类型1. C51中的基本数据类…...

openssl1.0.2版本Windows安装问题

之前安装过1.1版本&#xff0c;Windows环境下C 安装OpenSSL库 源码编译及使用&#xff08;VS2019&#xff09;_vs2019安装openssl_肥宝Fable的博客-CSDN博客 后来发现linux编译不过&#xff0c;以为是版本问题&#xff0c;相差太大&#xff0c;所以降一下版本&#xff0c;以免…...

【Java 进阶篇】Ajax 实现——原生JS方式

大家好&#xff0c;欢迎来到这篇关于原生 JavaScript 中使用 Ajax 实现的博客&#xff01;在前端开发中&#xff0c;我们经常需要与服务器进行数据交互&#xff0c;而 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建异步请求的技术&#xff0c;它…...

Spring Cloud Stream实践

概述 不同中间件&#xff0c;有各自的使用方法&#xff0c;代码也不一样。 可以使用Spring Cloud Stream解耦&#xff0c;切换中间件时&#xff0c;不需要修改代码。实现方式为使用绑定层&#xff0c;绑定层对生产者和消费者提供统一的编码方式&#xff0c;需要连接不同的中间…...

高精度算法【Java】(待更新中~)

高进度加法 在Java中可以使用BigInteger进行高精度计算&#xff0c;除此也可以仿照竖式相加的计算原理进行计算。 BigInteger 提供所有 Java 的基本整数操作符的对应物&#xff0c;并提供 java.lang.Math 的所有相关方法。另外&#xff0c;BigInteger 还提供以下运算&#xff1…...

说一说HTTP1.0、1.1、2.0版本区别和优化

说一说HTTP1.0、1.1、2.0版本区别和优化 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于传输超文本的应用层协议。 在不同的版本中&#xff0c;HTTP经历了一系列的演进和改进&#xff0c;主要包括HTTP 1.0、HTTP 1.1和HTTP 2.0。 下面详细解释它们之间…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

UE5 音效系统

一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类&#xff0c;将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix&#xff0c;将上述三个类翻入其中&#xff0c;通过它管理每个音乐…...