项目:KL变换算法及其图像压缩应用系统
项目介绍
本项目基于MATLAB环境实现了一套完整的Karhunen-Loève (KL) 变换算法(亦称霍特林变换或主成分分析 PCA),并将其应用于图像压缩领域。KL变换作为均方误差(MSE)意义下的最优正交变换,能够有效地去除数据间的相关性,将信号能量集中在少数几个变换系数上。
本系统通过对图像进行分块处理、统计特征提取、特征值分解以及系数截断,演示了如何利用KL变换实现有损图像压缩。同时,系统通过计算均方误差(MSE)和峰值信噪比(PSNR),并直观展示特征值分布与重构图像,验证了算法的能量集中特性和压缩性能。
功能特性
该系统在单一脚本中集成了完整的数据处理与分析流程:
- 鲁棒的图像预处理:系统自动加载测试图像(优先读取系统内置
cameraman.tif),若无法读取则自动生成合成纹理图像作为替代。支持自动灰度化处理,并根据设定的分块大小(默认为8x8像素)对图像边缘进行裁剪,确保矩阵运算维度的匹配。 - 分块与向量化处理:实现了自定义的图像分块算法,将二维图像分割为互不重叠的子块,并将其展平为一维列向量,构建用于统计分析的数据集矩阵。
- 统计特征提取与核心变换:
* 计算数据集的均值向量并进行中心化处理。
* 计算协方差矩阵,捕捉像素间的统计相关性。
* 执行特征值分解(Eigenvalue Decomposition),获取特征值与特征向量,构建KL变换基矩阵。
- 多级压缩与重构:根据预设的能量保留比例(5%、15%、50%),对变换系数进行截断处理。通过逆变换利用保留的系数重构图像,直观展示不同压缩比下的视觉效果。
- 量化性能评估:针对每种压缩比例,自动计算并输出均方误差(MSE)和峰值信噪比(PSNR),提供客观的压缩质量评价。
- 多维可视化分析:
* 展示原始图像与不同压缩率下的重构图像对比。
* 绘制特征值分布曲线及累计能量占比曲线,直观呈现能量集中程度。
* 可视化前16个主要特征向量(基图像/Eigenblocks),展示构成图像的基本纹理特征。
系统要求
- 软件环境:MATLAB R2016a 或更高版本。
- 工具箱:推荐安装 Image Processing Toolbox(用于图像读取与转换),若未安装,脚本包含基础功能的兼容代码。
核心算法实现逻辑
本项目的核心逻辑实现于主控脚本中,具体步骤如下:
1. 数据准备与预处理
程序首先清空工作区,尝试读取图像。如果因路径问题读取失败,代码内置了生成正弦波纹理合成图像的逻辑以保证程序可运行。图像被转换为灰度双精度格式,并根据定义的块大小($8 times 8$)对图像宽高进行向下取整裁剪,以避免分块时处理边缘残余。
2. 构建观测数据矩阵
不同于MATLAB内置的
im2col的滑窗模式,本项目实现了自定义函数
myIm2Col。该函数采用
Distinct(互不重叠)模式扫描图像,将每个$8 times 8$的子块拉伸为长度为64的列向量。对于一幅图像,构建出矩阵 $X$(尺寸为 $64 times M$,其中 $M$ 为块的总数)。
3. KL变换核构建 (训练阶段)
这是PCA/KL变换的核心数学过程:
- 去均值:计算所有样本向量的均值
meanVec,并通过 $X_{centered} = X - mu$ 实现数据中心化。 - 协方差分析:计算中心化数据的协方差矩阵。代码中使用
cov(X_centered'),注意此处对矩阵进行了转置,因为MATLAB的cov默认对列变量求协方差,而我们需要的是像素位置间的协方差(即 $64 times 64$ 矩阵)。 - 特征分解:对协方差矩阵进行特征值分解
[V, D] = eig(CovMatrix)。 - 排序与基构建:将特征值按降序排列,并同步调整特征向量的顺序。排序后的特征向量矩阵 $Phi$ 即为KL变换矩阵。
4. 变换、压缩与逆变换
- 正向变换:利用公式 $Y = Phi^T times X_{centered}$ 将图像数据从像素空间投影到特征空间,得到变换系数矩阵 $Y$。此时,大部分能量集中在 $Y$ 的前几行系数中。
- 系数截断(压缩):代码设定了三种保留比例(0.05, 0.15, 0.50)。对于每个比例,程序计算需要保留的系数个数 $K$,将矩阵 $Y$ 中索引大于 $K$ 的行全部置零,模拟数据丢失/压缩过程。
- 逆变换(重构):利用公式 $X_{rec} = Phi times Y_{compressed} + mu$ 恢复数据。
- 图像重组:通过自定义函数
myCol2Im 将恢复后的列向量按照原始扫描顺序重新拼装成二维图像矩阵。
5. 性能评估
程序计算均方误差 (MSE) 和 峰值信噪比 (PSNR)。
- MSE:计算原始图像与重构图像像素差值的平方均值。
- PSNR:基于MSE计算分贝值,虽然人眼对误差的敏感度非线性,但PSNR仍是衡量重建质量的标准指标。公式体现为 $10 log_{10}(255^2 / MSE)$。
关键辅助函数说明
为了保持代码的独立性和算法逻辑的清晰度,项目包含两个内部辅助函数:
myIm2Col(img, blkSize)
- 功能:图像分块向量化。
- 逻辑:双重循环遍历图像的行和列,步长为
blkSize。提取每个子块,利用MATLAB的列优先规则 (:) 将其展平,并依序存入输出矩阵的每一列。这是构建统计样本集的关键步骤。
myCol2Im(X, blkSize, H, W)
- 功能:向量矩阵重组为图像。
- 逻辑:是
myIm2Col的逆过程。遍历数据矩阵的每一列,将其reshape回blkSize x blkSize的块,并按原来的空间位置填充回零矩阵中,最终恢复出二维图像。
使用方法
- 确保MATLAB当前工作路径包含本项目脚本。
- (可选)在同目录下放置名为
cameraman.tif 的图片文件。若不放置,程序将使用自动生成的测试图。 - 在MATLAB命令窗口直接运行主函数名称(如
main)。 - 程序将输出压缩过程的MSE和PSNR数据表格,并弹出两个图形窗口:
*
窗口1:包含原始图像、特征值能量分布图、累计能量占比图以及三个不同压缩比率下的重构图像。
*
窗口2:可视化展示前16个特征基图像(Eigenblocks),展示了KL变换提取到的主要纹理模式(如直流分量、横向/纵向梯度等)。
结果分析示例
运行程序后,您将观察到:
- 能量集中:特征值分布图显示数值迅速衰减,前几个特征值占据了绝大部分能量。
- 压缩效果:
*
5%保留率:图像主要轮廓可见,但包含明显的模糊和块效应,PSNR较低。
*
15%保留率:图像质量显著提升,细节逐步恢复。
*
50%保留率:重构图像与原始图像几乎无异,PSNR值较高,体现了KL变换在去除冗余数据方面的高效性。