基于PCA的图像压缩研究与实现

1、PCA基本原理:

主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。它是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性。目的就是就是为了在尽量保证“信息量不丢失”的情况下,对原始特征进行降维,也就是尽可能将原始特征往具有最大投影信息量的维度上进行投影。将原特征投影到这些维度上,使降维后信息量损失最小。

        PCA技术的好处是对数据进行降维的处理,它作为均方误差最小意义下的最优变换,可以对新求出的“主元”向量的重要性进行排序,根据需要取比较大的特征值对应的特征向量,将后面较小特征值的特征向量省去,达到降维、简化模型或是对数据进行压缩的效果.根据PCA这些特点可以将此项技术很好的应用于图像压缩方面。

2、代码实现:

利用PCA对图像压缩:

close all

clear all

clc

In = imread('选取的图像.jpg');

num_val = 17;                                

size_block = 4;                                 

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

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);          

rata = val./sum(val);

rata_sum = sum(rata(1:num_val));

fprintf('选取%g个特征值的贡献率为:%g',num_val,rata_sum);

y = vec_new'* Data;                                    

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);

imwrite(Out,'压缩后的图像.jpg')

显示图片代码段:

Out1 = Out(:,1:256);

Out2 = Out(:,257:2*256);

Out3 = Out(:,2*256+1:768);

figure;imshow(In),title('原图')

figure;

subplot(1,3,1);imshow(Out1)

subplot(1,3,2);imshow(Out2)

subplot(1,3,3);imshow(Out3)

RGB = cat(3,Out1,Out2,Out3);

figure;imshow(RGB)

title('压缩后的图像')

imwrite(RGB,'G:\压缩后的图像.jpg')

你可能感兴趣的:(开发语言,matlab)