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

小波变换(详细解释和代码示例)

本文将详细介绍小波变换(Wavelet Transform, WT),包括其原理、公式以及应用代码示例。


一、小波变换的原理

Time-Frequency 把时域和频域联系起来,是两者的折中。

1. 背景

在信号和图像处理中,傅里叶变换(FT) 能很好地描述信号的频率特性(拆成sin cos 的组合),但它不包含时域信息

  • FT:频率分布准确,但丢失了信号在时间上的位置。
  • 短时傅里叶变换(STFT):通过固定窗口引入时间局部化,但窗口大小固定 → 高频和低频信号的分析精度受限。

傅里叶只是频率的函数,为了解决这个问题。
于是乎,我们引入了 小波变换(Wavelet Transform, WT),

  • 使用 伸缩、可平移的小波基函数(wavelet basis function)—— 故具有“短时性”,也就是在时域上是局部的
  • 高频信号 → 用窄窗口(高分辨率)分析。
  • 低频信号 → 用宽窗口(低分辨率)分析。
    这就是 多分辨率分析(Multiresolution Analysis, MRA) 的思想。

PS: There is always a trade-off between time resolution & frequency resolution. WT is between the two.


2. 数学公式

设信号为 f(t)f(t)f(t),母小波(mother wavelet)为 ψ(t)\psi(t)ψ(t)

连续小波变换(CWT):

Wf(a,b)=1∣a∣∫−∞∞f(t)ψ∗(t−ba)dtW_f(a, b) = \frac{1}{\sqrt{|a|}} \int_{-\infty}^{\infty} f(t) \, \psi^*\left(\frac{t-b}{a}\right) \, dt Wf(a,b)=a1f(t)ψ(atb)dt

  • aaa:尺度因子(scale, 类似频率的倒数)。
  • bbb:平移因子(translation, 表示时间位置)。
  • ψ(t)\psi(t)ψ(t):小波基函数。
  • ψ∗\psi^*ψ:复共轭。

含义:对信号 f(t)f(t)f(t) 与一系列伸缩、平移后的波形 ψa,b(t)\psi_{a,b}(t)ψa,b(t) 做内积 → 得到不同时间-尺度上的特征。

小波函数的两个约束(Zero mean &Finite energy):

当然可以!我们来详细说明 小波函数(wavelet function) 的两个基本约束条件,以及它们的数学意义和直观解释。小波函数 ψ(t)\psi(t)ψ(t) 是小波分析的核心,它必须满足以下两个条件:零平均值(零矩条件)有限能量条件(平方可积条件)


1) 零平均值条件(Zero Mean Condition)

数学公式:

∫−∞+∞ψ(t)dt=0\int_{-\infty}^{+\infty} \psi(t) \, dt = 0 +ψ(t)dt=0

解释:

  • 这个条件意味着小波函数在时间轴上“平均值为零”,即正负波动抵消
  • 它确保小波函数是一个振荡函数(oscillatory),不会包含直流分量(DC)。
  • 直观上,小波用于检测信号的变化或局部细节,而不是整体平均值。零平均值保证小波对常数信号的响应为零,从而专注于信号的局部变化

例子:

  • Haar 小波:

ψ(t)={1,0≤t<0.5−1,0.5≤t<10,otherwise\psi(t) = \begin{cases} 1, & 0 \le t < 0.5 \\ -1, & 0.5 \le t < 1 \\ 0, & \text{otherwise} \end{cases} ψ(t)=1,1,0,0t<0.50.5t<1otherwise

∫00.51dt+∫0.51(−1)dt=0\int_{0}^{0.5} 1 \, dt + \int_{0.5}^{1} (-1) \, dt = 0 00.51dt+0.51(1)dt=0


2) 有限能量(Finite Energy / Square Integrable Condition)

数学公式:

∫−∞+∞∣ψ(t)∣2dt<∞\int_{-\infty}^{+\infty} |\psi(t)|^2 \, dt < \infty +ψ(t)2dt<

解释:

  • 这个条件要求小波函数在整个时间域上的平方可积。
  • 它保证了小波函数在频域上有良好的表现,可以进行傅里叶变换。
  • 从信号分析角度,有限能量意味着小波不会“无限振荡”,能够有效捕捉信号局部特征。

二、小波变换的作用

  1. 信号去噪:小波变换能区分出信号的主要成分和噪声,保留主要特征,去除噪声。
  2. 图像压缩:JPEG2000 就是基于小波变换的图像压缩方法。
  3. 特征提取:在语音识别、图像识别、地震波分析中提取局部特征。
  4. 边缘检测:小波对高频分量敏感,可用于图像边缘检测。
  5. 多尺度分析:同时看到“整体趋势”和“局部细节”。

三、Python 实际代码示例

1. 小波去噪(Wavelet Denoising)

思路:

  1. 对图像做小波分解
  2. 对高频系数做阈值处理(去除噪声)
  3. 小波重构 → 得到去噪图像
import matplotlib.pyplot as plt
import numpy as np
import pywt
import pywt.data# 载入示例图像
original = pywt.data.camera()# 添加噪声
noisy = original + 20 * np.random.standard_normal(original.shape)# 小波分解
coeffs2 = pywt.dwt2(noisy, 'db1')
LL, (LH, HL, HH) = coeffs2# 阈值处理(软阈值)
def soft_threshold(data, threshold):return np.sign(data) * np.maximum(np.abs(data) - threshold, 0)threshold = 30
LH = soft_threshold(LH, threshold)
HL = soft_threshold(HL, threshold)
HH = soft_threshold(HH, threshold)# 重构
denoised = pywt.idwt2((LL, (LH, HL, HH)), 'db1')# 可视化
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
titles = ['Original', 'Noisy', 'Denoised']
for i, img in enumerate([original, noisy, denoised]):axes[i].imshow(img, cmap='gray')axes[i].set_title(titles[i])axes[i].axis('off')
plt.show()

结果:
在这里插入图片描述

小波阈值能有效去除噪声,同时保持图像边缘。


2. 小波图像压缩

思路:

  1. 小波分解图像
  2. 只保留最大的部分系数,舍弃小系数(信息压缩)
  3. 小波重构 → 得到近似压缩图像
import matplotlib.pyplot as plt
import pywt
import pywt.data
import numpy as np# 载入示例图像
original = pywt.data.camera()# 小波分解
coeffs2 = pywt.wavedec2(original, 'haar', level=2)# 将系数展平成数组
arr, coeff_slices = pywt.coeffs_to_array(coeffs2)# 压缩:保留前 10% 最大系数
threshold = np.percentile(np.abs(arr), 90)
arr_compressed = arr * (np.abs(arr) > threshold)# 重构
coeffs_compressed = pywt.array_to_coeffs(arr_compressed, coeff_slices, output_format='wavedec2')
reconstructed = pywt.waverec2(coeffs_compressed, 'haar')# 可视化
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original, cmap='gray')
axes[0].set_title("Original")
axes[1].imshow(reconstructed, cmap='gray')
axes[1].set_title("Compressed (10% coeffs)")
plt.show()

结果:
在这里插入图片描述

图像基本保留主要信息,但文件存储大幅减少。


3. 小波边缘检测

思路:高频分量(LH, HL, HH)包含了边缘信息,可以直接用于检测。

import matplotlib.pyplot as plt
import pywt
import pywt.data# 载入示例图像
original = pywt.data.camera()# 小波分解
coeffs2 = pywt.dwt2(original, 'haar')
LL, (LH, HL, HH) = coeffs2# 边缘图像 = 高频部分叠加
edges = abs(LH) + abs(HL) + abs(HH)# 可视化
fig, axes = plt.subplots(1, 2, figsize=(10, 5))
axes[0].imshow(original, cmap='gray')
axes[0].set_title("Original")
axes[1].imshow(edges, cmap='gray')
axes[1].set_title("Edges (Wavelet)")
plt.show()

在这里插入图片描述

效果:得到类似 Sobel / Canny 的边缘检测结果。


四、总结

  • 小波变换是 时频局部化分析工具,弥补了傅里叶变换的不足。
  • 数学核心:通过伸缩、平移小波函数与信号做内积。
  • 应用广泛:去噪、压缩、边缘检测、特征提取。
  • Python 实现非常方便:pywt 支持一维、二维、三维小波变换。

强推这个视频:
小波变换

http://www.xdnf.cn/news/1332091.html

相关文章:

  • 车载软件架构 --- 赢得汽车软件开发竞赛
  • 【数据集】Argoverse 数据集:自动驾驶研究的强大基石
  • electron进程间通信-从主进程到渲染器进程
  • 芯科科技即将重磅亮相IOTE 2025深圳物联网展,以全面的无线技术及生态覆盖赋能万物智联
  • HTML5 视频与音频完全指南:从基础的 <video> / <audio> 标签到现代 Web 媒体应用
  • 软考网工选择题节选-2
  • 为了更强大的空间智能,如何将2D图像转换成完整、具有真实尺度和外观的3D场景?
  • 案例分享:BRAV-7123助力家用型人形机器人,智能生活未来已来
  • Java并发容器详解
  • 卸载win10/win11系统里导致磁盘故障的补丁
  • 企业微信2025年发布会新功能解读:企业微信AI——2025年企业协作的「最优解」是如何炼成的?
  • C++编程实践--表达式与语句
  • 第一章:认识 CAD 图形文件 —— DXF 格式
  • 单抗免疫原选型指南|抗体制备方案设计——常用抗原类型及制备方法
  • Spring事务源码
  • c语言多任务处理(并发程序设计)
  • 挑战极限:在256MB内存的机器上构建MySQL极简安装方案
  • 基于SpringBoot的旅游攻略系统网站【2026最新】
  • mysql-8.0.37-linux-glibc2.12-x86_64安装
  • 【shell脚本编程】-7 寻找到在5分钟内改动的文件
  • 【C++】基础:C++11-14-17常用新特性介绍
  • 【Obsidian插件】HiNote
  • ansible playbook 实战案例roles | 实现db2自动安装
  • spring第9课,spring对DAO的支持
  • 【C++】模版(初阶)
  • 【STM32】HAL库中的实现(六):DAC (数模转换)
  • wpf之ComboBox
  • uniapp学习【上手篇】
  • Ubuntu 重连usb设备(断电和不断电方案)亲测可行
  • 【科研绘图系列】R语言绘制平滑曲线折线图