小波变换(详细解释和代码示例)
本文将详细介绍小波变换(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)=∣a∣1∫−∞∞f(t)ψ∗(at−b)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,0≤t<0.50.5≤t<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<∞
解释:
- 这个条件要求小波函数在整个时间域上的平方可积。
- 它保证了小波函数在频域上有良好的表现,可以进行傅里叶变换。
- 从信号分析角度,有限能量意味着小波不会“无限振荡”,能够有效捕捉信号局部特征。
二、小波变换的作用
- 信号去噪:小波变换能区分出信号的主要成分和噪声,保留主要特征,去除噪声。
- 图像压缩:JPEG2000 就是基于小波变换的图像压缩方法。
- 特征提取:在语音识别、图像识别、地震波分析中提取局部特征。
- 边缘检测:小波对高频分量敏感,可用于图像边缘检测。
- 多尺度分析:同时看到“整体趋势”和“局部细节”。
三、Python 实际代码示例
1. 小波去噪(Wavelet Denoising)
思路:
- 对图像做小波分解
- 对高频系数做阈值处理(去除噪声)
- 小波重构 → 得到去噪图像
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. 小波图像压缩
思路:
- 小波分解图像
- 只保留最大的部分系数,舍弃小系数(信息压缩)
- 小波重构 → 得到近似压缩图像
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
支持一维、二维、三维小波变换。
强推这个视频:
小波变换