Matlab基于主成分分析的图像压缩和重建 主成分分析是统计学中的主成分分析方法。 主成分分析方法从矩阵角度讲也称K-L变换。 使用PCA方法对图像进行压缩和重建的大致过程PCA图像压缩和PCA图像重建 代码可正常运行下午三点半的实验室总有点犯困突然想起去年用Matlab折腾图像压缩的经历。当时被PCA主成分分析这个数学工具惊艳到了——这玩意儿居然能用线性代数玩转图像压缩今天咱就抛开教科书里复杂的公式推导直接上手代码看看怎么把一张照片榨汁再还原。先找张测试图片我习惯用Matlab自带的cameramanimg imread(cameraman.tif); img im2double(img); imshow(img), title(原图);这个戴礼帽的老哥分辨率256x256刚好够咱们折腾。接下来才是重头戏——把二维图像转成数据矩阵。注意这里有个骚操作把图像切分成小块再展平。不过对于全局PCA直接按列拉平更简单[m, n] size(img); X img - mean(img(:)); % 数据中心化 covariance X * X / (m-1); % 计算协方差矩阵这里为什么要减去均值就像拍照时找基准线去中心化后才能准确捕捉数据波动方向。计算协方差矩阵时用了(m-1)做无偏估计学过统计的应该都懂这个梗。Matlab基于主成分分析的图像压缩和重建 主成分分析是统计学中的主成分分析方法。 主成分分析方法从矩阵角度讲也称K-L变换。 使用PCA方法对图像进行压缩和重建的大致过程PCA图像压缩和PCA图像重建 代码可正常运行特征分解才是PCA的灵魂所在[V, D] eig(covariance); [~, idx] sort(diag(D), descend); V V(:, idx); % 特征向量按特征值降序排列注意eig函数返回的特征值默认是升序排列的咱们需要手动倒排。这里的V矩阵每列都代表一个主成分方向就像给数据找到了新的坐标系。压缩的关键在于选择前k个主成分。假设我们保留95%的能量total_energy sum(diag(D)); cum_energy cumsum(diag(D(end:-1:1)))/total_energy; k find(cum_energy 0.95, 1); V_reduce V(:,1:k); % 取前k个特征向量不过实际压缩时更直接——比如指定保留50个主成分k 50; % 试试这个参数效果立竿见影 V_reduce V(:,1:k);投影到低维空间这一步最带感Z X * V_reduce; % 压缩后的数据原本256维的数据被压成了50维压缩率超过80%但怎么变回图片呢重建公式其实是对投影的逆操作X_approx Z * V_reduce; img_approx X_approx mean(img(:)); % 恢复中心化把重建后的数据和原图放一起对比subplot(1,2,1), imshow(img), title(原图); subplot(1,2,2), imshow(img_approx), title([k num2str(k)]);当k50时礼帽边缘会出现轻微马赛克但整体轮廓依然清晰。把k调到100噪点基本消失压缩率仍有60%。这种在信息损失和压缩效率之间的权衡正是PCA的魅力所在。有同学问为什么不直接用JPEG其实PCA压缩更适合特定场景——比如需要保留数据主要特征时。在人脸识别中特征脸方法就是PCA的经典应用。下次遇到高维数据时不妨先试试PCA这柄瑞士军刀说不定能切开问题的另一面。