OpenCV-Python(23):傅里叶变换

原理

        傅里叶变换是一种数学变换,用于将一个函数(在图像处理中通常是图像)从时域(空域)转换到频域。它将函数表示为一系列正弦和余弦函数的和,用于分析信号的频率和相位信息。

        傅里叶变换的原理是将一个连续的信号或离散的序列分解为一系列简单的正弦和余弦函数,这些函数是基函数或正交函数。傅里叶变换可以将一个信号分解为不同频率的成分,这些成分包含了信号的频谱信息。傅里叶变换是线性的,可以将多个信号的变换结果相加,得到它们的叠加信号的变换结果。

        在图像处理中,傅里叶变换可以用于分析图像的频谱信息,包括低频和高频成分。低频成分代表图像中的较慢变化部分,高频成分代表图像中的较快变化部分。通过傅里叶变换,我们可以将图像从时域转换到频域,然后进行频域滤波、增强或压缩等操作,最后再将图像从频域转换回时域。

傅里叶变换的数学表达式为:F(u, v) = ∫∫ f(x, y) * e^(-i2π(ux + vy)) dx dy

        其中,F(u, v)是频域中的复数值,表示信号在频率为(u, v)的成分。f(x, y)是时域中的函数值,表示信号在位置(x, y)的强度。e^(-i2π(ux + vy))是复指数函数,用于将信号从时域转换到频域。

        傅里叶变换存在两种形式:连续傅里叶变换(Continuous Fourier Transform, CFT)和离散傅里叶变换(Discrete Fourier Transform, DFT)。连续傅里叶变换适用于连续信号,而离散傅里叶变换适用于离散信号,如数字图像。在实际应用中,离散傅里叶变换更常用,可以使用快速傅里叶变换(Fast Fourier Transform, FFT)算法高效地计算。

        傅里叶变换在图像处理中有广泛的应用,包括图像滤波、频域增强、图像压缩、图像复原等。通过傅里叶变换,我们可以对图像进行频域分析和处理,从而实现一些常见的图像处理操作。

Numpy中的傅里面叶变换

以下是使用Python中的NumPy库实现图像的傅里叶变换的示例代码:

import numpy as np
import cv2
from matplotlib import pyplot as plt

# 读取图像
image = cv2.imread('image.jpg', 0)

# 进行傅里叶变换
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))

# 显示原始图像和频谱图
plt.subplot(121), plt.imshow(image, 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()

运行以上代码,将会显示原始图像和其对应的傅里叶变换的幅度谱图。需要注意的是,显示的频谱图是对数变换后的结果,目的是为了更好地显示高频成分。在实际应用中,我们通常会对频谱进行滤波操作,然后再进行逆傅里叶变换,将频域信号转换回时域信号(图像)。

OpenCV中的傅里叶变换

        在OpenCV中,可以使用cv2.dft()函数来实现傅里叶变换。以下是使用OpenCV实现图像的傅里叶变换的示例代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
image = cv2.imread('image.jpg', 0)

# 快速傅里叶变换
dft = cv2.dft(np.float32(image), 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(image, 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()

运行以上代码,将会显示原始图像和其对应的傅里叶变换的幅度谱图。需要注意的是,与上面使用NumPy库的示例不同,这里使用的是OpenCV的函数进行傅里叶变换和频谱计算。在傅里叶变换后,需要调用cv2.magnitude()函数来计算频谱的幅度,并进行对数变换以便更好地显示。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【iOS安全】JS 调用Objective-C中WKWebview Handler的三种方式

有三种实现途径 1. WKScriptMessageHandler OC部分:注册并实现Handler 将OC中的方法"nativeMethod"注册为JavaScript Message Handler,从而WebView中的JavaScript代码可以调用该方法 // Register in Objective-C code - (void)setupWKWebVi…

No Magic—复杂机电产品系统架构开发套件

产品概述 CATIA Magic,原名MagicDraw,俗称No Magic,被达索收购后融入3DExperience产品协同研发管理平台中,形成更具协同体验的系统工程解决方案。该软件提供对SysML/UML/UAF语言的完整支持,提供独有的MagicGrid方法论&…

5分钟了解接口测试

接口测试是指对系统接口进行测试的一种质量保障手段,主要是验证接口的功能、性能、安全性等方面是否符合预期。 在接口测试中,可以测试以下内容: 功能测试:验证接口的输入和输出是否符合预期,包括参数的正确性、返回结…

【无标题】idea的lombok插件支持@SuperBuilder注解啦

在我的博客阅读本文 1. 前言 今早进公司打开idea,弹出更新提示,简单看了下,原来是idea的lombok插件更新了,惊喜的发现update log上写着Add support for SuperBuilder。 为什么说是惊喜呢?因为之前也有用到这个的场景…

Go后端开发 -- Go Modules

Go后端开发 – Go Modules 文章目录 Go后端开发 -- Go Modules一、什么是Go Modules?二、GOPATH的工作模式1.GOPATH模式2.GOPATH模式的弊端 三、Go Modules模式创建项目1.go mod命令2.go mod环境变量3.使用Go Modules初始化项目4.修改模块的版本依赖关系 四、Go Modules下impo…

数据库:基础SQL知识+SQL实验2

(1)基础知识: 1.JOIN(连接): 连接操作用于根据指定的条件将两个或多个表中的数据行合并在一起。JOIN 可以根据不同的条件和方式执行,包括等值连接、不等值连接等。 (1&#xff09…

SAP BAPI 客户主数据创建:cmd_ei_api=>maintain_bapi

BAPI函数:cmd_ei_api>maintain_bapi 事物代码:XD01/XD02 客户主数据创建、修改、拓展功能开发 数据结构定义: 基本视图信息 公司代码信息结构: 销售视图信息结构: 客户主数据税分类信息结构: 代码参考 详细代码…

C++面向对象编程与泛型编程(GP)

C既支持面向对象编程,又支持泛型编程 1.面向对象编程 将数据结构与处理方法(容器与算法)组成对象封装在一个类中,通过类的封装隐藏内部细节,可以使用继承,多态等方法。 注意:list容器本身带有…

计算机毕业设计——SpringBoot 招投标 任务发布网站(附源码)

1,绪论 在市场范围内,任务发布网站很受欢迎,有很多开发者以及其他领域的牛人,更倾向于选择工作时间、工作场景更自由的零工市场寻求零散单子来补贴家用。 如今市场上,任务发布网站鱼龙混杂,用户需要找一个…

CH341StreamI2C参数解释

总体思路: 第一步:使用EEPROM写入相应的数据 第二步:使用EEPROM读取相应的数据 第三步:使用CH341StreamI2C函数还原读取过程 每一步需要逻辑分析仪进行对比。 第一步:数据写入CH341WriteEEPROM 使用CH341WriteE…

性能测试之Mysql数据库调优

一、前言 性能调优前提:无监控不调优,对于mysql性能的监控前几天有文章提到过,有兴趣的朋友可以去看一下 二、Mysql性能指标及问题分析和定位 1、我们在监控图表中关注的性能指标大概有这么几个:CPU、内存、连接数、io读写时间…

【网络安全】【密码学】常见数据加(解)密算法及Python实现(一)

一、Base64编码 1、算法简介 Base64是一种常见的编(解)码方法,用于传输少量二进制数据。该编码方式较为简短,并不具有可读性,对敏感数据可以起到较好的保护作用。 2、Python实现(调库) &…

每日一道算法题day-one(备战蓝桥杯)

从今天开始博主会每天做一道算法题备战蓝桥杯,并分享博主做题的思路,有兴趣就加入我把! 算法题目: 有一个长度为 N 的字符串 S ,其中的每个字符要么是 B,要么是 E。 我们规定 S 的价值等于其中包含的子…

C++模板(泛型)

1. 模板 1.1 知识点 模板:template 泛型编程: 是指数据的类型是广泛,任意的数据类型 模板:可以将一个函数或类描述成一个模板,例如:画画,给一个人物模型上色彩,根据用户上的色彩是什…

Bean如何诞生与消亡:生命周期探秘【beans 二】

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Bean如何诞生与消亡:生命周期探秘【beans 二】 前言bean的创建过程bean的初始化阶段1. 实现InitializingBean接口:2. 使用PostConstruct注解: bean的属性注入1. Set…

视频倒放软件,看视频如何演绎“逆袭”之旅

你是否厌倦了日复一日的平淡生活,渴望时光倒流,重温那些逝去的精彩瞬间?在数字技术的世界里,这样的愿望或许不再遥不可及。视频倒放仿佛让时光倒流,给我们的视觉带来了全新的冲击,今天,让我们一…

新手第一次在linux上用git上传代码到仓库全过程

目录 背景: 过程: -1.去github.com自己的账号先建个仓库repository 0.命令行输入 git version 看下有无安装git 1.git init 初始化了一个Git仓库,你可以 ls -a 看见这个隐藏的目录 3.git add . 添加要上传的文件到Git的暂存区&#xff0…

windows对微信及小程序抓包:Burp+Fiddler+Proxifier

本文由掌控安全学院 - zbs 投稿 话不多说,直接先上个效果图: 新新的版本哈; 好好的抓包哈; 然后直接说我如何配置的: 准备好三个工具:bp、fiddler、proxifier【也可以用其他的进行代理】 bp、proxifie…

ELement UI时间控件el-date-picker误差8小时解决办法

一、问题描述&#xff1a; 在项目中引用了elementui中的date-picker组件&#xff0c;选中的时间跟实际相差八小时&#xff0c;且格式不是自己想要的格式 <el-date-pickertype"date"placeholder"选择日期"format"yyyy/M/d"v-model"form…

R304S 指纹识别模块的硬件接口说明

一.外部接口尺寸图 二.串行通讯 R304S 指纹模块通讯接口定义&#xff1a; 引脚号名称定义描述15V电源输入电源正输入端 DC 4.2--6V2GND电源和信号地电源和信号地3TXD数据发送串行数据输出&#xff0c;TTL 逻辑电平4RXD数据接收串行数据输入&#xff0c;TTL 逻辑电平 三.USB通…