MATLAB矢量量化(VQ)图像压缩项目
项目介绍
本项目实现了一套基于矢量量化(Vector Quantization, VQ)技术的图像压缩方案。该方案采用经典的LBG算法(Linde-Buzo-Gray)通过聚类学习构建最优码本,将图像由像素点描述转化为由特征块索引描述,从而在损失较小视觉质量的前提下实现大幅度的数据压缩。系统包含了从图像预处理、码本训练、编码映射到解码重构的完整闭环流程。
功能特性
- 智能化数据处理:支持读取标准本地图像,并在找不到源文件时自动生成合成图像以确保程序稳健运行。
- 码本分裂机制:通过初始质心倍增分裂(1变2,2变4...)直到达到目标码本容量,确保了训练过程的系统性。
- 聚类迭代优化:在每一个码本规模阶段,利用K-Means思想进行多步迭代,通过最小化欧氏距离准则优化码字。
- 全方位的性能评估:程序会自动计算峰值信噪比(PSNR)、压缩倍率(CR)以及平均比特率(BPP),量化压缩效果。
- 直观的结果可视化:不仅展示原图与重构图的对比,还专门提供了码本内部特征块的可视化视图,方便观察学习到的图像特征。
系统要求
- 运行环境:MATLAB R2016b 或更高版本。
- 基础配置:能够运行基础矩阵运算,若使用内置pdist2函数可能需要Statistics and Machine Learning Toolbox(代码中已提供自定义替代方案以增强兼容性)。
- 内存要求:建议至少8GB RAM,以处理较大图像的距离矩阵运算。
实现逻辑与功能步骤
- 参数初始化:
设置图像块大小(如4x4)、码本目标容量(如256)、收敛阈值以及码本分裂时的扰动因子(epsilon)。
- 图像预处理与对齐:
将输入图像转换为灰度图和双精度浮点数。为了确保图像能够被完整分割,系统会自动将图像的高和宽裁剪为块大小的整数倍。
- 矢量化分解:
将二维图像切割为互不重叠的小块,并将每个块展开为一维列矢量。所有矢量组成一个高维空间的样本集,作为LBG算法的训练输入。
- LBG码本训练过程:
- 阶段一:计算所有矢量的全局平均值,生成规模为1的初始码本。
- 阶段二:进入分裂循环。对当前码本中的每个码字,通过擾动因子生成两个新码字,使码本规模翻倍。
- 阶段三:迭代优化。在当前规模下,根据最近邻准则(欧氏距离)将样本分配到最接近的码字,随后重新计算每个类别的质心作为新码字。
- 阶段四:收敛判定。根据平均畸变的变化率是否低于预设阈值来结束当前阶段的优化。
- 编码与映射:
利用训练好的最终码本对原始图像块进行匹配,仅保留每个块在码本中对应的最优索引值,实现数据的极大压缩。
- 图像重构(解码):
根据索引值从码本中提取对应的矢量,并将其重新排列回原始的二维网格位置,恢复出重构后的图像。
算法与关键函数实现细节
- 欧氏距离度量:
核心算法通过计算样本矢量与码字之间的平方欧氏距离来确定所属类别。在代码实现中,采用了高效的矩阵运算方式处理大规模样本的距离匹配。
- 码本分裂逻辑:
码本并非一次性生成,而是通过 (1 + epsilon) 和 (1 - epsilon) 的运算逐步演化,这有助于避免局部最优解,确保码字能较好地代表原始图像分布。
- 码字更新机制:
在每一轮迭代中,新的码字由被分配给该类别的所有原始样本矢量的算术平均值重新定义,这保证了畸变函数(MSE)在每一步迭代中都是单调下降的。
- 辅助距离计算工具:
代码内部集成了一个自定义的距离矩阵处理函数,用于计算两个矩阵行向量之间的欧氏距离。该实现采用了循环处理模式,有效平衡了内存占用与计算效率,防止在大规模训练集下出现内存溢出的问题。
- 压缩性能衡量:
- PSNR:反映了重构图像相对于原图的保真度。
- 压缩倍率:结合了索引存储空间和码本本身的存储开销,准确反映了实际的节地效果。
- BPP(Bits Per Pixel):计算平均每个像素点占用的二进制位数。
使用方法
- 将待处理图像放置在MATLAB当前工作路径下,或在代码中修改图片名称变量。
- 在命令行窗口直接运行主函数。
- 观察命令行输出的码本训练进度。
- 训练完成后,系统会自动弹出图像对比窗口和码本特征图,并在控制台输出压缩报告。