python小波变换 wavedec2函数 各个返回值详解

        网上找了好多文章都没有提到这个东西,没有说明 wavedec2 函数各个返回值究竟是什么意思

        我们先看看 wavedec2 函数的大概形式,

pywt.wavedec2(data, wavelet, mode=’symmetric’, level=None, axes=(-2, -1))
    data:    输入的数据
    wavelet: 小波基
    level:   尺度(要变换多少层)
    return: 返回的值要注意,每一层的高频都是包含在一个tuple中,例如三层的话返回为 [cl, (cH3, cV3, cD3), (cH2, cV2, cD2)(cH1, cV1, cD1)]

        单单这么看可能不太好懂,所以来个实例,我的目的是把11.xlsx 里面的灰度图像进行3层的小波变换,并要提取变换后的低频分量的系数和高频分量的系数

实例

import pywt
import xlrd
import numpy as np

def excel2matrix(path):    # 把xlsx文件的数据变成np.array数组
    data = xlrd.open_workbook(path)
    table = data.sheets()[0]
    nrows = table.nrows  # 行数
    ncols = table.ncols  # 列数
    datamatrix = np.zeros((nrows, ncols))
    for i in range(nrows):
        rows = table.row_values(i)
        datamatrix[i,:] = rows
    return datamatrix

pathX = '11.xlsx'  # 数据路径
x = excel2matrix(pathX)     # 我的灰度图数据

w = 'sym4'  # 小波基类型
l = 3       # 小波变换层次
coeffs = pywt.wavedec2(x,w,l)
[cl, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1)] = coeffs

       

        说一下这个 coeffs 返回值究竟是个啥,它是个列表,里面主要有两个东西:1)低频系数,以数组形式存放。2)高频系数,每一层的(水平、垂直、对角线)高频系数构成一个 3 维元组,所以有几层小波分解就有几个元组

在这里插入图片描述

       有的同学可能不知道怎么设置看到代码运行后各变量的值 ,可以参考我这篇文章 pycharm 设置在控制台运行,显示代码涉及到的变量值(类似matlab的工作空间)

        使用 wavedec2 函数时注意输入参数的匹配,尽量用名称指定,不要用参数位置匹配,如果用参数位置匹配,一定要检查是否每个参数都匹配正确。不然可能会出现我这篇文章里面的错误 ValueError: too many values to unpack (expected 4)错误,小波变换函数 wavedec2 使用时提示的

       

数据集链接

链接:https://pan.baidu.com/s/1kqIBkgNecK2sJl5cnwc-cg
提取码:m600

### PyWavelets `pywt.wavedec2` 函数使用说明 #### 1. 基本功能介绍 `pywt.wavedec2` 是 PyWavelets 库中的一个重要函数,用于执行二维离散小波变换(DWT)。该函数能够分解输入数据到多个尺度的小波系数[^1]。 #### 2. 参数详解 以下是 `pywt.wavedec2` 的主要参数及其作用: - **data**: 输入的二维数组或矩阵。通常是一个图像或其他二维信号的数据表示。 - **wavelet**: 小波基的选择。可以是字符串形式的小波名称(如 `'haar'`, `'db4'`),也可以是预先定义好的 Wavelet 对象[^2]。 - **level** *(可选)*: 分解的层数。如果不指定,则会自动计算最大可能的层数。 - **mode** *(可选)*: 边界处理模式,默认为 `'symmetric'`。其他选项包括 `'zero'`, `'constant'`, `'periodic'` 等[^3]。 #### 3. 返回值结构 返回的结果是一个元组 `(cA, (cH, cV, cD))` 或者更深层次嵌套的形式,具体取决于分解的层次: - **cA**: 近似系数(Approximation Coefficients) - **cH**, **cV**, **cD**: 水平、垂直和对角细节系数(Detail Coefficients) 如果指定了更高的分解级别,则会有更多的近似和细节系数组合。 #### 4. 示例代码 以下是一段完整的 Python 示例代码展示如何使用 `pywt.wavedec2` 和其逆操作 `pywt.waverec2` 来完成二维小波变换及重建过程[^4]: ```python import numpy as np import pywt from matplotlib import image, pyplot as plt # 导入必要库并加载测试图片 img = image.imread('example_image.png') # 替换为实际路径 plt.imshow(img, cmap='gray') plt.title("Original Image") plt.show() # 执行二维小波变换 coeffs = pywt.wavedec2(img, 'bior1.3', level=2) # 提取不同部分的系数 cA, (cH, cV, cD), (_, _, _) = coeffs # 显示各个子带图 plt.figure(figsize=(8, 6)) for i, a in enumerate([cA, cH, cV, cD]): ax = plt.subplot(2, 2, i + 1) ax.imshow(a, interpolation="nearest", cmap='gray') ax.set_title(['Approximation', 'Horizontal detail', 'Vertical detail', 'Diagonal detail'][i]) ax.set_xticks([]) ax.set_yticks([]) plt.tight_layout() plt.show() # 使用逆变换重构原图 reconstructed_img = pywt.waverec2(coeffs, 'bior1.3') # 展示重构后的图像 plt.imshow(reconstructed_img, cmap='gray') plt.title("Reconstructed Image") plt.show() ``` #### 5. 注意事项 当调用 `pywt.wavedec2` 时需要注意以下几个方面: - 如果不通过关键字传递参数而仅依赖于顺序传参,容易引发错误,比如常见的 `ValueError: too many values to unpack (expected 4)` 错误。因此建议始终显式命名参数。 - 需要确保输入数据维度与所选用的小波兼容;对于彩色图像需先转换成灰度格式再进行处理。 ---
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南自动化学院至渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值