基于小波零树的EZW图像压缩编码系统 README
项目简介
本项目是一个基于MATLAB环境开发的图像压缩系统,核心算法采用了嵌入式零树小波(Embedded Zerotree Wavelet, EZW)编码技术。系统实现了从图像预处理、离散小波变换(DWT)、EZW编码(包含主扫描和副扫描)、到解码重建及质量评估的完整流程。该实现专注于利用小波系数的零树结构特性来消除频带间的冗余,支持嵌入式码流输出,允许根据目标比特率(BPP)灵活控制压缩比。
功能特性
- 鲁棒的图像读取机制:系统尝试读取标准测试图像(如
cameraman.tif),若读取失败,会自动生成一张合成的测试图像以确保程序能顺利运行。 - 图像预处理与标准化:自动将图像转换为灰度图,并强制调整尺寸为 $256 times 256$ 像素,以适应后续的小波分解需求。
- 多级离散小波变换:使用 Haar 小波基对图像进行3级二维离散小波分解,生成多尺度的小波系数矩阵。
- 嵌入式EZW编码:
*
自适应阈值:根据最大系数值自动计算初始阈值,并在迭代过程中逐级减半。
*
主扫描(Dominant Pass):对系数进行分类(正/负重要系数、零树根ZTR、孤立零IZ),并生成符号流。
*
副扫描(Subordinate Pass):对已识别的重要系数进行逐次逼近量化,提高重建精度。
- 码率控制:支持设定目标比特率(Target BPP),在编码过程中实时计算比特消耗,一旦达到预算即停止编码。
- 解码与重构:包含对应的解码逻辑,能够解析主扫描的符号流和副扫描的细化比特流,从压缩数据中恢复图像小波系数。
- 性能评估:计算并评估实际压缩比(CR)和实际比特率。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
- Wavelet Toolbox(小波工具箱)
使用方法
- 确保MATLAB路径中包含本项目的相关脚本。
- 直接运行主程序脚本。
- 程序将依次执行:图像加载 -> DWT变换 -> EZW迭代编码 -> 压缩性能计算 -> EZW解码(代码中包含解码逻辑的实现)。
- 程序运行过程中会在控制台输出图像尺寸、分解层数、目标比特率以及当前的阈值处理状态。
详细功能实现与算法逻辑
1. 初始化与预处理
程序首先清空环境,尝试读取外部图像文件。如果文件不存在,则利用三角函数生成一个 $256 times 256$ 的合成灰度图案。无论图像来源如何,系统都会将其转换为灰度格式,并缩放到固定的 $256 times 256$ 尺寸,转换为
double 精度以进行数学运算。
2. 离散小波变换 (DWT)
系统调用MATLAB内置的小波分解函数,使用
haar 小波基进行 3 层分解。为了便于后续的零树扫描,程序将分解得到的小波系数向量和结构数据重构为一个二维系数矩阵,该矩阵保留了小波子带的空间结构。
3. EZW 编码核心逻辑
编码过程是一个基于阈值的迭代循环,直到阈值小于1或达到目标码率为止:
- 初始阈值计算:取图像小波系数绝对值的最大值,计算其向下取整的对数幂次作为初始阈值 $T_0$。
- 主扫描 (Dominant Pass):
* 利用特定的扫描顺序(从低频到高频)遍历系数矩阵。
* 对于未被标记为重要的系数,判断其幅度:
*
显著系数:若幅度 $ge$ 当前阈值,根据符号输出
POS (Code 2) 或
NEG (Code 3),将其标记为重要,并加入副扫描列表。
*
不显著系数:若幅度 $<$ 当前阈值,判断是否为零树根。如果系数及其所有子孙节点的幅度均小于阈值,且未被父级ZTR覆盖,则输出
ZTR (Code 0);否则输出
IZ (Code 1)。
* 对所有在主扫描中被标记为重要的系数进行细化。
* 通过判断系数值是否落在当前量化区间 $ [T, T + T/2) $ 或 $ [T + T/2, 2T) $ 的上半区或下半区,输出
0 或
1 作为细化比特。
- 数据结构存储:每一层的编码结果(阈值、主扫描符号流、副扫描比特流)被封装在结构体数组
EZW_Data 中,模拟二进制码流的传输结构。
4. 码率控制与性能计算
在编码的每一步骤(符号输出或比特细化),程序通过累加计数器
totalBits 实时监控码流长度。如果超过预设的
maxBits(由图像尺寸和
targetBPP 决定),编码循环将强制终止。程序最后会计算原始数据量与压缩数据量的比值(CR)。
5. 解码与重建
系统实现了与编码对应的逆过程:
- 主扫描解码:读取符号流。遇到 POS 或 NEG 符号时,在重构矩阵的对应位置赋予初始重建值($pm 1.5 times T$),更新扫描状态图;遇到 ZTR 则根据零树逻辑跳过相关子孙节点的处理;IZ 则将当前位置置零。
- 副扫描解码:读取细化比特流,对已有的显著系数进行精度修正,根据比特值调整系数值(加或减当前阈值的 $1/4$),从而逐次逼近原始系数值。
> 注意:系统依赖若干辅助逻辑(如
generate_scan_order,
check_zerotree,
mark_descendants_skip 等)来处理复杂的树结构遍历和状态判断,这些逻辑是实现零树算法空间相关性分析的关键。