主成分分析(PCA)在压缩图像方面的应用

一、主成分分析的原理

主成分分析能够通过提取数据的主要成分,减少数据的特征,达到数据降维的目的。
具体的原理可参见之前写的关于PCA原理的一篇文章:

点击打开链接

二、使用matlab仿真实现

%% 利用PCA对图像压缩


close all
clear all
clc
%% 输入
In = imread('lena_gray_256.tif');

%% 输入参数
num_val = 1;                                 %取前num_val个特征值
size_block = 4;                                       %取size_block*size_block块

%% 将原图像矩阵分割成n*n的块,再转化为列矩阵,构成最终矩阵reIn
In = im2double(In);
[row rol] = size(In);
m = 0;
Data = zeros(size_block*size_block,(row/size_block)*(rol/size_block));              % 数据矩阵
for i = 1:size_block:row
    for j = 1:size_block:rol
        m = m+1;
        block = In(i:i+size_block-1,j:j+size_block-1);
        Data(:,m) = block(:);
    end
end

%% PCA处理
Data1 = Data - ones(size(Data,1),1)*mean(Data);             % 标准化处理
c = cov(Data1');                                     % 求矩阵协方差矩阵
[vec,val] = eig(c);                                      % 求特征值和特征向量
% 按特征值降序排列
val = diag(val);                                        % 从对角线拿出特征值
[val t] = sort(val,'descend');                             % 特征值降序排列
vec = vec(:,t);                                        % 特征向量也对应改变顺序

%% 重构图像
vec_new = vec(:,1:num_val);                                    % 取前k个特征向量

    %% 计算所取特征值贡献率
    rata = val./sum(val);
    rata_sum = sum(rata(1:num_val));
    fprintf('选取%g个特征值的贡献率为:%g',num_val,rata_sum);
    
y = vec_new'* Data;                                      % 映射 由公式:y=w'*x
Data2 = vec_new * y;                                    % 重构图像
Data2 = Data2 + ones(size(vec_new, 1), 1) * mean(Data);     % 加均值
m = 0;
for i = 1:size_block:row
    for j = 1:size_block:rol
        m = m + 1;
        block1 = reshape(Data2(:, m), size_block, size_block);        % 列向量块转化为方块
        Out(i:i+size_block-1, j:j+size_block-1) = block1; 
    end
end

%% 显示图像
imshow(In),title('原图')
figure,imshow(Out),title('压缩后的图像')
imwrite(Out,'压缩后的图像.jpg')

实验结果:

k=1:

选取1个特征值的贡献率为:0.440833 

主成分分析(PCA)在压缩图像方面的应用_第1张图片主成分分析(PCA)在压缩图像方面的应用_第2张图片

k=8:

选取8个特征值的贡献率为:0.906031

主成分分析(PCA)在压缩图像方面的应用_第3张图片

=======华丽分割线========2019.04.11=================================

鉴于留言都是问彩色RGB的图像怎么处理,这里补充一下,我自己找了张图试了一下

主成分分析(PCA)在压缩图像方面的应用_第4张图片

这是一幅彩色的tif类型的图像,下面是matlab程序运行的数据,可以看到RGB图像会产生一个三维矩阵,程序会分别进行压缩

主成分分析(PCA)在压缩图像方面的应用_第5张图片

压缩结果展示如下:

k =1

选取1个特征值的贡献率为:0.319322

主成分分析(PCA)在压缩图像方面的应用_第6张图片

可以看到,1个特征值很难诠释图片内容

接下来将选取的特征值数目变为5:

k = 5

选取5个特征值的贡献率为:0.826211

主成分分析(PCA)在压缩图像方面的应用_第7张图片

图像的压缩率变低

================2019.04.14补充===============================

关于处理彩色图像,以及压缩后的图像大小问题

%% 显示合成彩色图片的代码段
% 用该部分代码替换前面代码的显示图像代码段
Out1 = Out(:,1:256);
Out2 = Out(:,257:2*256);
Out3 = Out(:,2*256+1:768);
imshow(In),title('原图') 
figure(1),imshow(Out1)
figure(2),imshow(Out2)
figure(3),imshow(Out3)
RGB = cat(3,Out1,Out2,Out3);
figure(4),imshow(RGB)
title('压缩后的图像') 
imwrite(RGB,'压缩后的图像.tif')

合成以后压缩后的图像颜色并没有失真:

主成分分析(PCA)在压缩图像方面的应用_第8张图片

经过PCA提取主成分后,图像大小会有所减小:

主成分分析(PCA)在压缩图像方面的应用_第9张图片 主成分分析(PCA)在压缩图像方面的应用_第10张图片

以上分析均可用上面提供的代码得到。

你可能感兴趣的:(特征学习)