一、主成分分析的原理
主成分分析能够通过提取数据的主要成分,减少数据的特征,达到数据降维的目的。
具体的原理可参见之前写的关于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
k=8:
选取8个特征值的贡献率为:0.906031
=======华丽分割线========2019.04.11=================================
鉴于留言都是问彩色RGB的图像怎么处理,这里补充一下,我自己找了张图试了一下
这是一幅彩色的tif类型的图像,下面是matlab程序运行的数据,可以看到RGB图像会产生一个三维矩阵,程序会分别进行压缩
压缩结果展示如下:
k =1
选取1个特征值的贡献率为:0.319322
可以看到,1个特征值很难诠释图片内容
接下来将选取的特征值数目变为5:
k = 5
选取5个特征值的贡献率为:0.826211
图像的压缩率变低
================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提取主成分后,图像大小会有所减小:
以上分析均可用上面提供的代码得到。