主成分分析(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 

k=8:

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

猜你喜欢

转载自blog.csdn.net/sinat_38486449/article/details/79766234