【图像处理】小波变换(Wavelet Transform,WT)

文章目录

在图像领域,小波变换是一种重要的多尺度、多分辨率分析工具,能够有效地提取图像的时频局部信息,广泛应用于图像压缩、去噪、特征提取、纹理分析等多个方面。

一、小波变换的基本原理

1、概述

小波变换(Wavelet Transform,WT)是一种时频分析方法,属于多分辨率分析(Multi-Resolution Analysis, MRA)工具。它通过一组由平移伸缩操作生成的基函数(小波函数)对信号进行分解,能够同时捕捉局部细节信息(高频)整体轮廓信息(低频)

2、傅里叶变换与小波变换的关系

在信号处理领域,傅里叶变换(Fourier Transform, FT)和小波变换(Wavelet Transform, WT) 都是将信号从时间域映射到频域的重要工具,但侧重点不同。

3、连续小波变换与离散小波变换

对比维度 连续小波变换(CWT) 离散小波变换(DWT)
采样方式 尺度和位移连续采样 尺度和位移离散采样(通常指数/整数序列)
冗余性 高,系数数量多 低,系数少,计算高效
计算复杂度 低,适合快速算法
时间-频率分辨率 可在任意时间和频率精细分析 多分辨率分析,分辨率随尺度变化
系数对齐 不严格对齐原信号 对齐原信号(MODWT 除外)
能量守恒 不严格 正交 DWT 保证能量守恒
适用对象 时间序列信号分析 图像和信号均可
应用场景 瞬态信号检测、精细特征分析、时频可视化(如地震信号、心电图分析) 图像压缩(JPEG2000)、图像去噪、边缘检测、多尺度特征提取(工业检测、医学影像)
优缺点 优点:分析精细,可视化好;缺点:数据量大,计算量高 优点:计算快、适合工业应用;缺点:分辨率固定,局部细节可能不如 CWT 精细

4、按小波基特性分类

基函数的选择影响变换的平滑度、正交性和边缘保留能力。

类型 说明 特点 应用
Haar小波 最简单的阶跃型小波 计算速度快,正交性好,但不平滑 快速压缩、初学演示
Daubechies小波(dbN) 光滑、紧支撑、正交 能量集中,边缘保留效果好 图像压缩、去噪
Symlets(symN) Daubechies改进,近似对称 对称性更好,减少相位失真 图像去噪、边缘检测
Coiflets 高消失矩,正交小波 能量集中,平滑性强 特征提取、信号分析
Biorthogonal小波 双正交、对称 可分离低频和高频滤波器,边缘保留好 JPEG2000压缩、去噪
Morlet、Mexican Hat等连续小波 主要用于连续小波变换 类似高斯包络正弦波,适合频率分析 时频分析、瞬时频率检测

二、图像小波变换

1、概述

图像小波变换是将二维图像信号进行多尺度、多方向分解的过程。它通过小波函数尺度函数将图像分为低频(Approximation)高频(Detail)部分,以便针对不同频率进行分析、处理或压缩。

低频子带(LL):图像的整体结构信息(轮廓、亮度分布)
高频子带(LH、HL、HH):图像的细节信息(水平、垂直、对角纹理或边缘)

2、原理详解

(1)图像小波 - 分解:DWT

图像小波变换通常采用二维离散小波变换(2D-DWT):

  • (1)行变换

    对图像的每一行做一维小波变换,得到低频和高频行信号:

    • 低频行 → 保留行方向的轮廓信息
    • 高频行 → 保留行方向的边缘/细节
  • (2)列变换

    对行变换结果的每一列再做一维小波变换,其将图像分解为四个子带:

    • LL(低频-低频:图像整体轮廓)
    • LH(低频-高频:水平边缘)
    • HL(高频-低频:垂直边缘)
    • HH(高频-高频:对角纹理与噪声)

这样一层分解完成后,可以进一步对 LL 子带做二级分解,实现多尺度分解。

  • (3)多尺度分解(Multi-level Decomposition)
    每一层 LL 子带可以作为下一层输入继续分解,多层分解能实现逐渐抽象的图像信息提取:
    • 第一层 LL:保留主要轮廓
    • 第二层 LL:更粗略的整体结构
    • 高频子带依旧保留各层的边缘和纹理信息

这种多层分解是图像压缩和去噪的基础。

记忆口诀:低频看轮廓,高频看细节;行列分两次,四宫格呈现。

子带 包含信息 常用处理方式
LL 低频,图像整体轮廓 压缩保留、增强对比度
LH 高频,水平边缘 阈值去噪、边缘增强
HL 高频,垂直边缘 阈值去噪、边缘增强
HH 高频,对角纹理及噪声 去噪、纹理分析

阈值处理(Thresholding):常用于去噪,保留幅值大的系数,抑制噪声

系数修改:用于图像增强、压缩或特征提取

(2)图像小波 - 重构:Inverse DWT

定义:将处理后的子带通过逆小波变换组合回原图

原理:逆向执行列变换 → 行变换 → 恢复完整图像

特点:

  • 正交小波:能量守恒,重构无失真
  • 双正交小波:重构精确,同时可实现滤波器对称性,减少边缘伪影

3、算法流程

  • 选择小波基(Haar、Daubechies、Symlet 等)
  • 二维分解:对行 → 列做一维小波变换
  • 多尺度迭代分解(可选)
  • 子带处理:压缩、去噪、增强或提取特征
  • 图像重构:逆小波变换恢复处理后图像

4、优势

  • 多分辨率分析:低频-高频分离,边缘和纹理信息明确
  • 局部特征提取:能有效保留局部结构信息
  • 去噪能力强:通过阈值处理高频子带去除噪声
  • 压缩效率高:高频系数可量化或舍弃,实现图像压缩(JPEG2000)

三、函数详解

(1)pywt.dwt2():计算二维离散小波变换(2D DWT)

python 复制代码
"""#############################################################################################
# 函数功能:计算二维离散小波变换(2D DWT),将二维信号(如图像)分解为低频和高频分量。
# 函数说明:pywt.dwt2(data, wavelet, mode='symmetric', axes=(-2, -1))
# 参数说明:
#         data:输入二维数组(通常是灰度图像或二维信号)。
#         wavelet:小波基名称(如 'haar', 'db1', 'db2', 'coif1' 等)或小波对象。
#         mode:信号边界扩展模式,用于处理边界效应。常见取值:
#             - 'symmetric'(默认)
#             - 'periodization'
#             - 'constant'、'reflect'、'nearest'、'mirror'
#         axes:指定进行小波变换的轴,默认对最后两个轴进行变换(适合二维图像)。
# 返回值:
#         返回一个元组 (cA, (cH, cV, cD)):
#             cA:低频近似系数(Approximation coefficients)。
#             cH:水平方向细节系数(Horizontal detail coefficients)。
#             cV:垂直方向细节系数(Vertical detail coefficients)。
#             cD:对角线方向细节系数(Diagonal detail coefficients)。
# 功能描述:
#         - 将二维信号分解为低频部分和三个高频细节部分,有助于图像压缩、特征提取、去噪等。
# 示例:
import pywt
import numpy as np
import matplotlib.pyplot as plt

# 构造一个简单二维信号(灰度图像)
data = np.array([[1, 2, 3, 4],
                 [5, 6, 7, 8],
                 [9, 10, 11, 12],
                 [13, 14, 15, 16]], dtype=np.float32)

# 进行二维离散小波变换
cA, (cH, cV, cD) = pywt.dwt2(data, wavelet='haar')

# 输出结果
print("低频近似系数 cA:\n", cA)
print("水平细节系数 cH:\n", cH)
print("垂直细节系数 cV:\n", cV)
print("对角线细节系数 cD:\n", cD)
#############################################################################################"""

(2)pywt.idwt2():计算二维离散小波逆变换(2D IDWT)

python 复制代码
"""#############################################################################################
# 函数功能:计算二维离散小波逆变换(2D Inverse Discrete Wavelet Transform, 2D IDWT),将二维小波分解系数重建为原始二维信号(如图像)。
# 函数说明:pywt.idwt2(coeffs, wavelet, mode='symmetric')
# 参数说明:
#         coeffs:二维小波系数,可以是 (cA, (cH, cV, cD)) 形式,
#                 其中 cA 为低频近似系数,cH、cV、cD 为水平、垂直、对角线细节系数。
#         wavelet:小波基名称(如 'haar', 'db1', 'db2', 'coif1' 等)或小波对象,需与 dwt2 使用的小波一致。
#         mode:信号边界扩展模式,用于处理边界效应。常见取值:
#             - 'symmetric'(默认)
#             - 'periodization'
#             - 'constant'、'reflect'、'nearest'、'mirror'
# 返回值:
#         返回重建后的二维数组,与原始输入二维信号形状相同。
# 功能描述:
#         - 将二维小波分解系数重建回原始信号,用于图像重建、压缩恢复、去噪后重构等。
# 示例:
import pywt
import numpy as np
import matplotlib.pyplot as plt

# 构造一个简单二维信号(灰度图像)
data = np.array([[1, 2, 3, 4],
                 [5, 6, 7, 8],
                 [9, 10, 11, 12],
                 [13, 14, 15, 16]], dtype=np.float32)

# 进行二维离散小波变换
cA, (cH, cV, cD) = pywt.dwt2(data, wavelet='haar')

# 使用逆变换重建原始信号
reconstructed = pywt.idwt2((cA, (cH, cV, cD)), wavelet='haar')

# 输出重建结果
print("重建后的二维信号:\n", reconstructed)
#############################################################################################"""

四、项目实战


python 复制代码
"""pip install opencv-python pywavelets matplotlib"""

import cv2
import pywt
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 1. 读取图像(灰度模式)
img = cv2.imread('../image/image.jpg', cv2.IMREAD_GRAYSCALE)
img = cv2.imread(r"D:\py\BC\brightness_51.2-1.tif", cv2.IMREAD_GRAYSCALE)  # 替换为真实图像路径
if img is None:
    print("图像不存在!")
    exit()

# 2. 执行 2D 离散小波变换(DWT)
coeffs2 = pywt.dwt2(img, 'haar')  # 'haar' 是最简单的小波,可以换成 'db2', 'sym4' 等
LL, (LH, HL, HH) = coeffs2
# LL:低频部分(整体亮度与结构)
# LH:水平高频(垂直边缘)
# HL:垂直高频(水平边缘)
# HH:对角高频(纹理和噪声)

# 3. 显示分解结果
titles = ['低频 LL', '水平高频 LH', '垂直高频 HL', '对角高频 HH']
fig, axes = plt.subplots(1, 4, figsize=(10, 4))
for i, a in enumerate([LL, LH, HL, HH]):
    axes[i].imshow(a, cmap='gray')
    axes[i].set_title(titles[i])
    axes[i].axis('off')

plt.tight_layout()
plt.show()
###################################################################################
# 4. 将分解结果重新组合成图像(重构)
reconstructed_img = pywt.idwt2(coeffs2, 'haar')

# 5. 显示原图与重构图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray'), plt.title("原图"), plt.axis('off')
plt.subplot(1, 2, 2), plt.imshow(reconstructed_img, cmap='gray'), plt.title("小波重构图"), plt.axis('off')
plt.tight_layout()
plt.show()
相关推荐
amazinging几秒前
北京-4年功能测试2年空窗-报培训班学测开-第七十三天-投递简历-[特殊字符][特殊字符]
python·学习
IMER SIMPLE2 小时前
人工智能-python-机器学习-线性回归与梯度下降:理论与实践
人工智能·python·机器学习
mit6.8242 小时前
[Robotics_py] 机器人运动模型 | `update`函数 | 微积分&矩阵
人工智能·python·算法
一枝小雨2 小时前
opencv:直方图
人工智能·python·opencv·计算机视觉
赵英英俊3 小时前
Python day43
开发语言·python
蒋星熠3 小时前
Rust 异步生态实战:Tokio 调度、Pin/Unpin 与零拷贝 I/O
人工智能·后端·python·深度学习·rust
Warren983 小时前
公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
java·开发语言·前端·javascript·vue.js·python·安全
忆~遂愿3 小时前
Python实战教程:PDF文档自动化编辑与图表绘制全攻略
python·pdf·自动化