基于MATLAB的LBG矢量量化图像压缩系统
这是一个基于MATLAB编写的完整图像压缩系统,采用LBG (Linde-Buzo-Gray) 算法进行矢量量化(Vector Quantization, VQ)。该项目演示了如何将高维图像数据块映射到有限的码向量空间,通过迭代训练生成最优码本,从而实现有损数据压缩。系统包含完整的数据预处理、码本训练、编码解码流程,以及详细的性能评估与可视化模块。
项目简介
本项目实现了矢量量化技术中的核心算法——LBG算法(基于分裂法的广义K-means聚类)。程序并不依赖现成的聚类函数,而是从底层实现了基于分裂法(Splitting Method)的码本生成逻辑。系统能够自动读取图像,将其划分为非重叠的小块(向量),通过训练过程最小化量化误差,最后重建图像并评估压缩性能。
主要功能与特性
- 全流程图像压缩:涵盖图像分块、向量化、训练、量化编码、索引解码及图像重组。
- LBG算法底层实现:实现了LBG算法的核心逻辑,包括初始质心计算、码本分裂(由1分裂至N)、最近邻搜索和质心更新。
- 高效的矩阵运算:在最近邻搜索(E-step)中,利用MATLAB的矩阵运算(范数展开公式)替代循环计算,显著提升了距离计算速度。
- 自适应图像预处理:自动处理彩色/灰度图像转换,并根据分块大小裁剪图像边缘,确保整除。
- 详细的性能评估:实时计算均方误差(MSE)、峰值信噪比(PSNR)、比特率(bpp)及压缩比。
- 多维度可视化:提供原始图与重建图对比、5倍放大的误差热力图以及训练过程中的失真收敛曲线。
- 容错机制:内置合成图像生成逻辑,若未找到测试图片,系统自动生成正弦波纹理图像进行演示。
系统要求
- MATLAB R2016a 或更高版本(需包含基础图像处理工具箱用于
imread, rgb2gray, im2col, col2im 等函数)。 - 内存要求取决于图像大小,标准512x512图像即可流畅运行。
使用方法
- 确保MATLAB当前路径包含
main.m 文件。 - 在脚本同级目录下放置名为
peppers.png 的测试图像(可选,若无则自动生成合成图)。 - 直接运行
main 函数。 - 程序将输出训练进度日志,并在结束时弹出包含四个子图的结果窗口。
关键算法与实现细节
本项目严格遵循 main.m 中的逻辑,核心算法实现细节如下:
1. 图像向量化 (Vectorization)
系统设置分块大小为 4x4。通过
im2col 函数将图像划分为不重叠的块,并将每个块拉直为 16维(4x4)的列向量。这些向量构成了训练数据集。
2. LBG 码本训练策略
代码采用了经典的
分裂法 (Splitting Method) 初始化和扩展码本,而非随机初始化:
- 初始化:首先计算所有训练向量的全局均值,作为大小为1的初始码本。
- 分裂阶段:将当前码向量 $y$ 分裂为 $y(1+epsilon)$ 和 $y(1-epsilon)$,使码本大小翻倍。
- 优化阶段 (K-means迭代):
*
E-step (最近邻搜索):计算所有训练向量与当前码本中每个码字的欧氏距离,将向量分配给最近的码字。距离计算利用了 $||x-y||^2 = x^2 + y^2 - 2xy$ 的展开式进行矩阵化加速。
*
M-step (质心更新):计算归属同一类的所有向量的均值,更新码字。若某类为空(虽极少发生),代码中保留了旧质心以维持稳定性。
*
收敛判定:计算平均量化失真(MSE)的相对变化率,当变化率低于阈值(0.001)时停止迭代。
- 上述过程循环进行,直到码本达到预设的目标大小(128)。
3. 编码与解码
- 编码:这是一个非迭代的最近邻搜索过程。对于每个输入图像块,在训练好的码本中找到距离最小的码字,并记录其索引。
- 解码:根据索引查表,从码本中提取对应的码向量,利用
col2im 将其重组为二维图像矩阵。
代码结构解析
main.m 文件内部结构清晰,按执行顺序分为以下模块:
- 参数设置:定义了分块大小(4)、码本大小(128)、分裂扰动参数(0.01)及最大迭代次数等。
- 数据预处理:
* 读取图像并转换为
double 类型以便数学运算。
* 强制转换为灰度图。
* 按照
floor(H/block)*block 裁剪图像边缘,防止分块越界。
* 执行
im2col 生成训练数据集。
- 模型训练:调用
lbg_training 子函数,记录并输出训练耗时。 - 量化与重建:调用
vector_quantization 获取索引,随即通过索引映射回码向量并重建图像。 - 性能评估:
*
MSE:计算原图与重建图差值的平方均值。
*
PSNR:基于MSE计算峰值信噪比。
*
bpp:计算每个像素占用的平均比特数($log_2(128) / 16$)。
*
压缩比:原始8bit深度与bpp的比值。
- 可视化输出:
* 子图1:原始灰度图像。
* 子图2:重建图像(标题附带PSNR值)。
* 子图3:量化误差图像(绝对误差乘以5倍,配合jet色图,以便肉眼观察微小差异)。
* 子图4:LBG训练收敛曲线(记录了每次分裂及迭代后的失真下降趋势)。
结果示例
运行程序后,控制台将打印如下格式的报告:
- 预处理完成:显示向量维度与总数。
- 码本分裂日志:显示从大小 1 -> 2 -> 4 ... -> 128 的过程。
- 性能评估报告:
* 均方误差 (MSE)
* 峰值信噪比 (PSNR)
* 比特率 (bpp)
* 压缩比 (例如 22.86 : 1)