【Python】二维离散小波变换(2D-DWT)实现

news2024/11/16 19:45:55

文章目录

  • 小波变换
  • 程序实现
  • 子带
  • 数学公式

小波变换

小波变换(Wavelet Transform)是一种数学信号处理技术,用于将信号或图像分解为不同频率的小波成分,从而可以在不同时间尺度上分析信号的特征。小波变换具有许多重要的特性,使其在许多领域中有广泛的应用。

小波变换的意义包括以下几个方面:

  1. 多尺度分析:小波变换可以在不同的时间尺度上分析信号,这意味着它可以同时提供关于信号的短时和长时特征信息。这使得小波变换在时频域分析中具有优势,特别是对于非平稳信号的处理。

  2. 局部特征提取:小波变换是一种局部分析方法,它可以有效地捕获信号的局部特征,如突变、边缘等。相比之下,傅里叶变换是一种全局分析方法,往往无法提供局部特征信息。

  3. 压缩和去噪:小波变换可以将信号分解为多个小波系数,其中包含不同频率的信息。通过适当选择小波系数,可以实现信号的压缩和去噪,去除噪声和冗余信息,从而提高信号处理的效果。

  4. 图像处理:小波变换在图像处理中也有重要的应用。它可以用于图像压缩、边缘检测、纹理分析等任务,同时保持图像的局部特征和结构信息。

  5. 特征提取:小波变换可以用于特征提取,从信号或图像中提取有用的特征信息,用于分类、识别和模式匹配等任务。

  6. 数据分析:小波变换在数据分析中有广泛的应用,包括金融市场分析、生物医学信号处理、地震信号处理等领域。

小波变换是一种强大的数学工具,可以用于多尺度分析、特征提取、信号压缩和去噪等多个领域。它的应用涵盖了信号处理、图像处理、数据分析和模式识别等广泛领域,为我们理解信号的时频特性、提取重要特征和优化数据处理提供了重要手段。

小波变换(Wavelet Transform)可以用数学公式表示为以下形式:

给定一个连续函数或离散信号 f ( t ) f(t) f(t),小波变换是通过将原始信号与一组小波基函数进行内积运算得到的。这些小波基函数是原始信号在不同频率和时间尺度上的缩放和平移版本。

连续小波变换(Continuous Wavelet Transform,CWT)的数学公式为:

C W T ( a , b ) = ∫ − ∞ ∞ f ( t ) ψ ∗ ( t − b a ) d t CWT(a, b) = \int_{-\infty}^{\infty} f(t) \psi^* \left( \frac{t-b}{a} \right) dt CWT(a,b)=f(t)ψ(atb)dt

其中, C W T ( a , b ) CWT(a, b) CWT(a,b) 是连续小波变换的结果, a a a b b b 是小波基函数的缩放因子和平移因子, ψ ∗ ( t ) \psi^*(t) ψ(t) 是复共轭小波基函数。

复共轭小波基函数是小波变换中的一个重要概念。在小波变换中,我们通常使用两类小波基函数:一个是正向小波基函数(Mother Wavelet),另一个是复共轭小波基函数(Complex Conjugate Wavelet)。

设正向小波基函数为 ψ ( t ) \psi(t) ψ(t),复共轭小波基函数为 ψ ∗ ( t ) \psi^*(t) ψ(t)。复共轭小波基函数是与正向小波基函数相对应的共轭复数函数。

数学上,复共轭小波基函数可以表示为:

ψ ∗ ( t ) = ψ ∗ ( − t ) \psi^*(t) = \psi^*(-t) ψ(t)=ψ(t)

其中, ψ ∗ ( − t ) \psi^*(-t) ψ(t) 表示对 ψ ( t ) \psi(t) ψ(t) 中的每个点取共轭复数。换句话说,复共轭小波基函数是通过将正向小波基函数 ψ ( t ) \psi(t) ψ(t) 中的每个点取共轭而得到的。这意味着复共轭小波基函数在时间域上是对称的,其实部和虚部都是奇函数。

在小波变换的计算过程中,复共轭小波基函数与信号进行内积运算,用于计算小波变换的实部和虚部部分,从而获得更完整的频率信息。

复共轭小波基函数在小波变换的正交性和完备性等性质中起到重要作用,确保小波变换的精确性和有效性。同时,复共轭小波基函数也在许多小波变换的应用中发挥着重要的作用,如信号压缩、图像处理和特征提取等领域。

离散小波变换(Discrete Wavelet Transform,DWT)则是通过对信号进行多级的低通滤波和高通滤波得到的。对于长度为 N N N 的离散信号 x [ n ] x[n] x[n],DWT 的数学公式为:

c A j [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ 1 2 ⋅ ψ ( n − 2 k 2 j ) c D j [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ 1 2 ⋅ ϕ ( n − 2 k 2 j ) \begin{align*} cA_{j}[k] &= \sum_{n=0}^{N-1} x[n] \cdot \frac{1}{\sqrt{2}} \cdot \psi \left( \frac{n-2k}{2^{j}} \right) \\ cD_{j}[k] &= \sum_{n=0}^{N-1} x[n] \cdot \frac{1}{\sqrt{2}} \cdot \phi \left( \frac{n-2k}{2^{j}} \right) \end{align*} cAj[k]cDj[k]=n=0N1x[n]2 1ψ(2jn2k)=n=0N1x[n]2 1ϕ(2jn2k)

其中, c A j [ k ] cA_{j}[k] cAj[k] c D j [ k ] cD_{j}[k] cDj[k] 分别是第 j j j 级近似子带(Approximation Coefficients)和细节子带(Detail Coefficients), k k k 表示子带的索引, j j j 表示变换的级数。 ψ \psi ψ ϕ \phi ϕ 是小波基函数和尺度函数, ⋅ \cdot 表示卷积运算。

通过多级的低通和高通滤波,DWT 可以将信号分解为不同频率的子带,从而实现多尺度分析。同时,通过对子带系数进行阈值处理和逆变换,可以实现信号的压缩和去噪等应用。

综上所述,小波变换是一种灵活且强大的信号处理技术,可以用于时频分析、信号压缩、去噪和特征提取等多个领域。它的数学公式描述了小波基函数与信号之间的变换关系,通过这种变换可以获得信号的不同频率和时间尺度上的特征信息。

程序实现

实现二维离散小波变换(2D-DWT),我们可以使用Python的pywt库,它提供了对小波变换的支持。首先,确保已经安装了pywt库,可以使用以下命令安装:

pip install PyWavelets

接下来,我们将给出一个示例代码,用于对一个二维图像进行小波变换。

import pywt
import numpy as np
import matplotlib.pyplot as plt

# blur.png
image = cv2.imread('blur.png', 0)

# 进行二维离散小波变换(2D-DWT)
coeffs = pywt.dwt2(image, 'haar')

# 从结果中获取近似子带和细节子带
cA, (cH, cV, cD) = coeffs

# 打印结果
print("近似子带:")
print(cA)
print("\n水平细节子带:")
print(cH)
print("\n垂直细节子带:")
print(cV)
print("\n对角细节子带:")
print(cD)

# 可视化结果
plt.figure(figsize=(8, 8))
plt.subplot(2, 2, 1)
plt.imshow(cA, cmap='gray')
plt.title('Approximation')
plt.subplot(2, 2, 2)
plt.imshow(cH, cmap='gray')
plt.title('Horizontal Detail')
plt.subplot(2, 2, 3)
plt.imshow(cV, cmap='gray')
plt.title('Vertical Detail')
plt.subplot(2, 2, 4)
plt.imshow(cD, cmap='gray')
plt.title('Diagonal Detail')
plt.show()

在这里插入图片描述

子带

pywt.dwt2pywt库中实现的二维离散小波变换(2D-DWT)函数。让我们通过数学公式来解释这个函数的作用:

给定一个2D数组data,我们可以将其表示为一个二维网格,其中每个元素表示一个像素的灰度值。2D-DWT的目标是将这个二维数组分解为多个子带,每个子带代表原始图像的不同部分或特征。具体地说,2D-DWT将输入的二维数组data分解为以下四个子带:

  1. 近似子带(Approximation,记为cA):表示原始图像的低频部分,包含图像中的整体结构和大致形状信息。

  2. 水平细节子带(Horizontal Detail,记为cH):表示图像中水平方向的高频信息,包括边缘和细节的水平变化。

  3. 垂直细节子带(Vertical Detail,记为cV):表示图像中垂直方向的高频信息,包括边缘和细节的垂直变化。

  4. 对角细节子带(Diagonal Detail,记为cD):表示图像中对角方向的高频信息,包括边缘和细节的对角变化。

这些子带可以用数学公式表示为:

cA:近似子带
cH:水平细节子带
cV:垂直细节子带
cD:对角细节子带

pywt.dwt2函数使用指定的小波(wavelet)对输入的图像data进行2D离散小波变换。其中,mode参数表示信号扩展模式,可以选择不同的模式进行计算。axes参数用于指定要进行变换的轴(即图像的维度)。函数返回近似子带cA和包含水平、垂直和对角细节子带的元组cH, cV, cD

在示例中,我们使用Haar小波对其进行2D-DWT变换。

请注意,实际应用中,我们通常使用真实的图像数据,并根据不同的任务选择适合的小波函数。

数学公式

2D离散小波变换(2D-DWT)的数学公式可以用以下方式表示:

给定一个二维离散信号(图像) f ( x , y ) f(x, y) f(x,y),其中 ( x , y ) (x, y) (x,y) 表示图像的坐标,2D-DWT 将其分解为近似子带(Approximation, c A cA cA)和三个细节子带(Details):水平细节子带(Horizontal Detail, c H cH cH)、垂直细节子带(Vertical Detail, c V cV cV)和对角细节子带(Diagonal Detail, c D cD cD)。

数学公式表示为:

c A = ( c A L L , c A L H , c A H L , c A H H ) c H = ( c H L L , c H L H , c H H L , c H H H ) c V = ( c V L L , c V L H , c V H L , c V H H ) c D = ( c D L L , c D L H , c D H L , c D H H ) \begin{align*} cA &= (cA_{LL}, cA_{LH}, cA_{HL}, cA_{HH}) \\ cH &= (cH_{LL}, cH_{LH}, cH_{HL}, cH_{HH}) \\ cV &= (cV_{LL}, cV_{LH}, cV_{HL}, cV_{HH}) \\ cD &= (cD_{LL}, cD_{LH}, cD_{HL}, cD_{HH}) \end{align*} cAcHcVcD=(cALL,cALH,cAHL,cAHH)=(cHLL,cHLH,cHHL,cHHH)=(cVLL,cVLH,cVHL,cVHH)=(cDLL,cDLH,cDHL,cDHH)

其中, c A L L , c H L L , c V L L , c D L L cA_{LL}, cH_{LL}, cV_{LL}, cD_{LL} cALL,cHLL,cVLL,cDLL 是具有更低空间分辨率的近似子带和细节子带,分别代表水平、垂直和对角方向的低频信息。而 c A L H , c H L H , c V L H , c D L H cA_{LH}, cH_{LH}, cV_{LH}, cD_{LH} cALH,cHLH,cVLH,cDLH 分别代表水平、垂直和对角方向的高频信息。

在实际应用中,通常会对近似子带进行进一步的分解,即多级小波变换,以获得更多层次的细节信息。2D-DWT 是图像处理和压缩中常用的技术,它允许我们在不同频率和空间尺度上分析图像内容,并用于多种图像处理任务。

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

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

相关文章

安装Python之后 安装库报错 There was an error checking the latest version of pip.

报错代码 & 图片如下 Looking in indexes: https://pypi.tuna.tsicmdnghua.edu.cn/simple WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HT…

Matplotlib_概述_绘制图象

⛳绘制基础 在使用 Matplotlib 绘制图形时&#xff0c;其中有两个最为常用的场景。一个是画点&#xff0c;一个是画线。 pyplot 基本方法的使用如下表所示 方法名说明title()设置图表的名称xlabel()设置 x 轴名称ylabel()设置 y 轴名称xticks(x, ticks, rotation)设置 x 轴的…

【蓝图】p44简单解密机关

p44简单解密机关 p44简单解密机关文字提示开门文字提示开灯For Each Loop和For Each Loop With Break区别For Each LoopFor Each Loop With Break小操作&#xff1a;改变走线Execute Console Command(执行控制台命令) p44简单解密机关 文字提示开门 创建Actor蓝图类&#xff…

软件测试生命周期

本章简要介绍了软件开发项目中常用的生命周期模型&#xff0c;并解释了测试在每个模型中扮演的角色。它讨论了各种测试级别和测试类型之间的区别&#xff0c;并解释了这些在开发过程中的应用位置和方式。 大多数软件开发项目是按照事先选择的软件开发生命周期模型来计划和执行…

win11任务栏不合并 终于回归啦

25915.1000 win11任务栏不合并 终于回归啦&#xff01;&#xff01;&#xff01; 下载地址&#xff1a;https://uup.rg-adguard.net/

Jenkins搭建最简教程

纠结了一小会儿&#xff0c;到底要不要写这个&#xff0c;最终还是决定简单记录一下&#xff0c;因为Jenkins搭建实在是太简单了&#xff0c;虽然也有坑&#xff0c;但是坑主要在找稳定的版本上。 先学一个简称&#xff0c;LTS (Long Term Support) 属实是长见识了&#xff0c…

Excel透视表与python实现

目录 一、Excel透视表 1、源数据 2、数据总分析 3、数据top分析 二、python实现 1、第一张表演示 2、第二张表演示 一、Excel透视表 1、源数据 1&#xff09;四个类目&#xff0c;每类50条数据 2&#xff09;数据内容 2、数据总分析 1&#xff09;选择要分析的字段&…

live-server本地起node服务解决跨域问题

一、初始化node,构建package.json NPM 全局安装live-server npm install -g live-server在当前项目文件夹下cmd运行&#xff1a; npm init -y此时会在根目录下生成一个package.json文件。 二.生成代理脚本 在根文件夹新建一个build.js文件&#xff08;名字可以自定义) var …

银行项目性能压测?关键链路性能压力测试,测试老鸟总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 随着银行业数字化…

Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集

Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集 前言相关介绍COCO格式实例分割数据集转换为YOLO格式实例分割数据集coco格式对应的json文件&#xff0c;以test.json为例格式转换代码&#xff0c;内容如下 前言 由于本人水平有限&#xff0c;难免出现错漏&#xf…

MySQL基础(五)主从复制及读写分离

目录 前言 一、概述 &#xff08;一&#xff09;、MySQL Replication &#xff08;二&#xff09;、MySQL复制类型 &#xff08;三&#xff09;、MySQL支持的复制方式 二、部署MySQL主从异步复制 &#xff08;一&#xff09;、master&#xff08;主&#xff09; &#x…

一起来学shiny把(3)—-添加控件

什么是shiny&#xff1f;Shiny是一个R包&#xff0c;可让您轻松地直接从 R 构建交互式 Web 应用程序&#xff08;应用程序&#xff09;。本系列是个长教程&#xff0c;带你由浅入深学习shiny。 上一节我们在文章《R语言系列教程—–一起来学shiny吧&#xff08;2&#xff09;》…

【C++11】——右值引用、移动语义

目录 1. 基本概念 1.1 左值与左值引用 1.2 右值和右值引用 1.3 左值引用与右值引用 2. 右值引用实用场景和意义 2.1 左值引用的使用场景 2.2 左值引用的短板 2.3 右值引用和移动语义 2.3.1 移动构造 2.3.2 移动赋值 2.3.3 编译器做的优化 2.3.4 总结 2.4 右值引用…

开源盛行:为什么学习国产达梦数据库?

开源盛行&#xff1a;为什么学习国产达梦数据库&#xff1f; 武汉达梦数据库股份有限公司成立于2000年&#xff0c;是国内领先的数据库产品开发服务商&#xff0c;国内数据库基础软件产业发展的关键推动者。公司为客户提供各类数据库软件及集群软件、云计算与大数据等一系列数据…

【数据结构】·顺序表函数实现·赶紧学起来呀

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

element-ui使用动态渲染下拉选择框el-select已经选择的下拉框的值不可以重复选择让其disabled

调接口拿到下拉框数据的数据的时候将其disabled全为true 但是如果编辑的时候就需要与详情接口对比&#xff0c;如果有id一致就将disabled为true if (res.code 0) {if (this.dialogtitle "新增合同") {res.data.map((v) > {v.nameUnitVoList.forEach((item) >…

九耶:产品经理面试题 ——请说说工作中你主导的产品上线后你会关注哪些数据指标?

【面试官考察的点】 实际的产品工作中需要通过数据驱动业务&#xff1a;产品经理了解用户对不同功能的使用情况&#xff0c;行为特征和使用反馈&#xff0c;这样可以为产品的改进提供很好的方向。面试官想考察你是否具备数据分析的意识和能力。 【满分回答】 在产品上线后&am…

百度开发者平台API地理编码,根据地址获取经纬度

地理编码 | 百度地图API SDK (baidu.com) 原始csv # encoding:utf-8 import requests import csv import json # 接口地址 url "https://api.map.baidu.com/geocoding/v3"# 此处填写你在控制台-应用管理-创建应用后获取的AK ak "XXXXXXX"# 创建CSV文件并…

vue 实现拖拽效果

实现方式&#xff1a;使用自定义指令可以实现多个面板拖拽互不影响 1.自定义指令 js directives: {// 拖拽drag(el) {el.onmousedown function (e) {let x e.pageX - el.offsetLeftlet y e.pageY - el.offsetTopdocument.onmousemove function (e) {el.style.left e.pag…

掌握Python的X篇_12_如何使用VS Code调试Python程序

本篇将会介绍如何使用VS Code调试Python程序。 文章目录 1. 什么是调试2. 断点3. 如何启动调试4. 监视窗口5. 单步 1. 什么是调试 我们可以利用VS Code对Python代码进行调试。所谓调试&#xff0c;大家可以理解成有能力将程序进行 “慢动作播放”让我们有机会看到程序一步一步…