Study-基于主成分分析的图像压缩和重建

2,207 阅读5分钟

案例背景

  主成分分析是一种通过降维技术把多个标量转化为少数几个主成分的多元统计方法,这些主成分能够反映原始的大部分信息,通常表示为原始变量的线性组合。为了使这些主成分所包含的信息互不重,则要求各主成分之间互不相关。

  主成分分析能够有效减少数据的维度,并使提取的成分与原始数据的误差达到均方最小,可用于数据的压缩和模式识别的特征提取。本章通过采用主成分分析去除了图像数据的相关性,将图像信息浓缩到几个主成分的特征图像中,有效地实现了图像的压缩,同时可以根据主成分的内容恢复不同的数据图像,满足对图像压缩、重建的不同层次的需要。

基础理论及代码实现

  主成分分析(PCA)通过计算,选择少数几个主分量来代表多变量的方差(即协方差)结构,是一种有效的特征提取方法。数字图像是二维矩阵,对其通过PCA处理来提取特征,可以在一定比例上保留原始图像的特征信息,并且能够大大减少计算量。因此,PCA图像压缩处理属于--种降维方法,它通过对高维图像块向量空间进行降维处理,将多变量的图像块数据表进行最佳综合简化,导出少数几个主分量,进而实现在一定比例上保留原始图像信息,又能保持图像块之间的不相关性,进而保证图像压缩结果的有效性。

主成分分析:

  本节通过编写函数pcaimage来实现对图像进行PCA压缩的目的,通过传入图像矩阵、主成分配置、子块大小来进行PCA处理,返回压缩重构的图像矩阵、压缩比、贡献率信息,具体代码如下所示。

function [coeff,score,rate]=pcasample(X,p)
[V,D]=eig(X'*X);
for i=1:size(V,2)
    [~,idx]=max(abs(V(:,i)));
    V(:,i)=V(:,i)*sign(V(idx,i));
end
[lambda,locs]=sort(diag(D),'descend');
V=V(:,locs);
coeff=V(:,1:p);
score=X*V(:,1:p);
rate=sum(lambda(1:p))/sum(lambda);

图像和样本转换:

  在一般情况下,数字图像矩阵可以视为二维数组,为了将图像数组转换为样本矩阵,需要首先对图像进行子块划分,然后将每个子块拉伸成一维,最后将所有子块组合成一个样本矩阵。其中,MATLAB自带的im2col()函数可以实现二维数组的分块及向量整合。

  有一点需要注意,im2col()是将 每个子块拉伸成列向量,col2im()是 将列向量重组成子块,而样本矩阵是每行一个样本,在进行主成分分析时,就要相对样本矩阵进行转置。另外,im2col()和 col2im()函数只能对二维数组进行操作,如果是三位彩色图像,则需要自己编写图像分块和重组函数,或者先将彩色图转换为灰度图。

基于主成分分析的图像压缩:

  主成分分析(PCA)通过计算,选择少数几个主分量来代表多变量的方差(即协方差)结构,是一种有效的特征提取方法。数字图像是二维矩阵,对其通过PCA处理来提取特征,可以在一定比例上保留原始图像的特征信息,并且能够大大减少计算量。因此,PCA图像压缩处理属于--种降维方法,它通过对高维图像块向量空间进行降维处理,将多变量的图像块数据表进行最佳综合简化,导出少数几个主分量,进而实现在一定比例上保留原始图像信息,又能保持图像块之间的不相关性,进而保证图像压缩结果的有效性。

  本节通过编写函数pcaimage来实现对图像进行PCA压缩的目的,通过传入图像矩阵、主成分配置、子块大小来进行PCA处理,返回压缩重构的图像矩阵、压缩比、贡献率信息,具体代码如下所示。

function [Ipca,ratio,contribution]=pcaimage(I,pset,block)
if nargin<1
    I=imread('football.jpg');
end
if nargin<2
    pset=3;
end
if nargin<3
    block=[16 16];
end
if ndims(I)==3
    I=rgb2gray(I);
end
X=im2col(double(I),block,'distinct')';
[n,p]=size(X);
m=min(pset,p);
[coeff,score,contribution]=pcasample(X,m);
X=score*coeff';
Ipca=cast(col2im(X',block,size(I),'distinct'),class(I));
ratio=n*p/(n*m+p*m);

  为了比较不同参数下执行PCA图像压缩的效果,本实验选择在循环结构中调用pcaimage()程,并配置不同数量的主成分参数来对图像进行压缩和重构,比较压缩比和贡献率,具体代码如下所示:

clc; clear all; close all;
I=imread('liftingbody.png');
k=1;
figure('Units', 'Normalized', 'Position', [0 0 1 1]);
for p=1:5:20
    [Ipca,ratio,contribution]=pcaimage(I,p,[24 24]);
    subplot(2,2,k);    
    imshow(Ipca)
    title(['主成分个数=',num2str(p),...
        ',压缩比=',num2str(ratio),...
        ',贡献率=',num2str(contribution)],'fontsize',14);
    k=k+1;
end

image.png

  由图可以看出,基于主成分分析的图像压缩技术具有很高的压缩比,同时达到高信噪比。例如,主成分个数为16时,压缩比达到16.43;主成分个数为50时,压缩比达.到5.26,此时肉眼基本无法辨识失真。