002 OpenCV dft 傅里叶变换

news2024/11/27 8:32:58

目录

一、傅里叶变换

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 sys

import cv2 as cv
import numpy as np


def 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.shape
    m = 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] = magnitude
    magI = 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 columns
    magI = 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 quadrant
    q1 = magI[cx:cx+cx, 0:cy]     # Top-Right
    q2 = magI[0:cx, cy:cy+cy]     # Bottom-Left
    q3 = magI[cx:cx+cx, cy:cy+cy] # Bottom-Right

    tmp = np.copy(q0)               # 交换象限(左上和右下交换)
    magI[0:cx, 0:cy] = q3
    magI[cx:cx + cx, cy:cy + cy] = tmp

    tmp = np.copy(q1)               # 交换象限(右上和左下交换)
    magI[cx:cx + cx, 0:cy] = q2
    magI[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:])

原图:

灰度图:

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

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

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

相关文章

手把手教你搭建属于自己的快递小程序

在数字化时代,小程序已经成为各行各业连接用户、提供服务、创造价值的重要工具。其中,快递寄件小程序因其实用性和广泛的需求,成为很多企业和开发者关注的焦点。本文将详细介绍如何快速创建快递寄件小程序,以及如何利用它实现盈利…

Zabbix钉钉机器人告警

目录 一.在钉钉群里添加机器人 二.配置钉钉告警脚本 1.安装python依赖模块python-requests 2.配置钉钉告警配置脚本zabbix_ding.conf 3.创建告警日志并且授权。 4.配置钉钉告警执行脚本dingding.py 5.测试 三.配置zabbix告警 1.创建媒介 2.给用户添加报警媒介 3.配置…

day28_JQuery

今日内容 零、 复习昨日 一、正则表达式 二、JQuery 零、 复习昨日 js已经学完,js是让页面动态变化 1) 基本语法(变量,运算,逻辑,函数) 2) 事件(给标签绑定不同的事件) 3) dom(改变标签内容,属性,样式)一、引言 1.1 jQuery概述 原生js获得dom对象: var obj document.getElem…

2018年五一杯数学建模A题徐州潘安湖风景区游览路线设计解题全过程文档及程序

2019年五一杯数学建模 A题 徐州潘安湖风景区游览路线设计 原题再现 徐州是一个老工业基地和资源型城市,煤炭开采历史长达130年。长期煤炭开采在徐州累计形成采煤塌陷区达数十万亩。位于徐州市贾汪区西南部、紧邻马庄的潘安湖湿地公园原来就是徐州最大的、塌陷最严…

你知道如何科学的学习吗?-关于个人成长的思考

背景 最近在翻看自己工作后的笔记,从有道云笔记到印象笔记,到本地笔记,到自己使用github搭建的博客,到语雀笔记,使用了不同的平台工具;零零总总记录了许多学习笔记、个人成长笔记、职业规划等内容。现在看…

十、http客户端Feign

目录 一、使用Feign客户端 1、修改pom文件 2、在启动类OrderApplication中加入注释 3、创建客户端接口 4、装配UserClient,并且进行远程调用 5、发送请求,查看服务调用情况 二、定义Feigin的配置 方式一:配置文件方式 (1&…

项目Git分支管理规范

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 一、分支管理 项目中,一般会创建三个常用分支: develop:开发环境的稳定分支,公共开发环境基于该分支构建。pre-release:测试…

单脉冲测角-和差比幅法

和差比幅法单脉冲测角 单脉冲测角的类型阵列接收模型和差波束构造方法和差比幅测角仿真 单脉冲测角的类型 传统的单脉冲测向方法主要有3种,分别是半阵法、加权法和和差比幅法。其实这3种方法都需要形成和波束和差波束,只是波束形成的方法不同&#xff0…

批量处理文件夹及子文件夹下文件名

从此烟雨落京城,一人撑伞两人行。 问题描述 下载的资源被打过标记,不能直接使用,甚是痛苦 问题: 所有文件的文件名都加入了【更多it教程 微信号:…】字段,包括当前文件夹和子文件夹的全部文件&#xff0c…

【Spring】bean的基础配置

bean的别名 当在Spring config文件中定义name作为别名后&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

4. 【自动驾驶与机器人中的SLAM技术】点云中的拟合问题和K近邻

目录 1.在三维体素中定义 NEARBY14&#xff0c;实现 14 格最近邻的查找。2.推导arg max||Ad||22的解为ATA的最大特征向量或者奇异向量。3. 将本节的最近邻算法与一些常见的近似最近邻算法进行对比&#xff0c;比如nanoflann&#xff0c;给出精度指标和时间效率指标。4. 也欢迎大…

创建一个用户test且使用testtab表空间及testtemp临时表空间并授予其权限,密码随意

文章目录 1、连接到数据库2、创建表空间3、创建用户4、授予权限5、测试 1、连接到数据库 sqlplus / as sysdba2、创建表空间 创建testtab表空间 CREATE TABLESPACE testtab DATAFILE /u01/app/oracle/oradata/orcl/testtab.dbf SIZE 50M AUTOEXTEND ON NEXT 5M MAXSIZE …

【以图会意】文件系统从外存到内存到用户空间

首先&#xff0c;在文件目录中&#xff0c;装有很多块FCB&#xff0c;由文件名和i指针两部分构成&#xff0c;指针指向文件所在的索引结点&#xff0c;包含了例如&#xff1a;文件存储权限&#xff0c;文件长度等一系列文件的信息&#xff0c;最重要的当然是物理地址&#xff0…

《变形监测与数据处理》笔记/期末复习资料(择期补充更新)

变形&#xff1a; 变形是物体在外来因素作用下产生的形状、大小及位置的变化&#xff08;随时间域和空间域的变化&#xff09;&#xff0c;它是自然界普遍存在的现象。 变形体&#xff1a; 一般包括工程建筑物、构筑物、大型机械设备以及其他自然和人工对象等。 变形体和变形…

AW2013芯片讲解

文章目录 前言一、AW2013芯片介绍二、AW2013从机地址三、AW2013读写时序AW2013写时序AW2013读时序 四、AW2013的INT引脚五、LED作用和配置描述LED控制PWM控制模式简短编程模式 六、AW2013寄存器讲解总结 前言 本篇文章将带大家学习AW2013芯片的使用。 一、AW2013芯片介绍 AW…

Mistral 7B 比Llama 2更好的开源大模型 (三)

Mistral 7B 比Llama 2更好的开源大模型 Mistral 7B是一个70亿参数的语言模型,旨在获得卓越的性能和效率。Mistral 7B在所有评估的基准测试中都优于最好的开放13B模型(Llama 2),在推理、数学和代码生成方面也优于最好的发布34B模型(Llama 1)。Mistral 7B模型利用分组查询注…

Linux(1):开始

计算机组成概述 计算机&#xff1a;接受用户输入指令与数据&#xff0c;经由中央处理器的数学与逻辑单元处理后&#xff0c;以产生或存储有用的信息。 主要可以分为3个部分&#xff1a;输入单元、主机单元、输出单元。 中央处理器&#xff08;Central Processing Unit, CPU&a…

unity shaderGraph实例-扫描效果

文章目录 效果展示整体结构各区域内容区域1区域2区域3区域4区域5区域6GraphSetttings注意事项使用方法 效果展示 整体结构 各区域内容 区域1 用场景深度减去顶点的View空间的视野深度&#xff08;Z值&#xff09;&#xff0c;这里Z值需要乘-1是因为从相机看到的物体顶点的视野…

UI设计是什么意思?一文给你讲清楚

随着互联网的快速发展&#xff0c;用户界面UI设计在中国也逐渐发展&#xff0c;用户界面UI设计的目的不仅是让用户&#xff0c;有视觉享受&#xff0c;而且解决用户如何与互联网设备交互&#xff0c;因此&#xff0c;用户界面UI设计是通过用户使用习惯、操作逻辑、界面交互和视…

【数据结构高阶】二叉搜索树

接下来我们来开始使用C来详细讲解数据结构的一些高阶的知识点 本期讲解的是二叉搜索树&#xff0c;对于初阶二叉树有所遗忘的同学可以看到这里&#xff1a; 【精选】【数据结构初阶】链式二叉树的解析及一些基本操作 讲解二叉搜索树主要是为了后面的map和set做铺垫&#xff…