PCA与图像压缩

PCA与图像压缩

2015-8-10

奇异值分解在图像压缩处理中有着重要的应用。假定一副图像有 n×n 个像素,如果将这 n2 个数据一起传送,往往会显得数据量太大。因此,我们希望能够改为传送另外一些比较少的数据,并且在接收端还能够利用这些传送的数据重构原图像。

不妨用矩阵 A 表示要传送的原 n×n 个像素。假定对矩阵 A 进行奇异值分解,便得到 A=UΣVT ,其中,奇异值按照从大到小的顺序排列。如果从中选择 k 个大奇异值以及这些奇异值对应的左和右奇异向量逼近原图像,便可以共用 k(2n+1) 个数值代替原来的 n×n 个图像数据。这 k(2n+1) 个被选择的新数据是矩阵 A 的前 k 个奇异值、 n×n 左奇向量矩阵 U 的前 k 列和 n×n 右奇向量矩阵 V 的前 k 列的元素。

比率:

ρ=n2k(2n+1)

称为图像的压缩比。显然,被选择的大奇异值的个数 k 应该满足条件 k(2n+1)<n2

k<n22n+1

因此,我们在传送图像的过程中,就无须传送 n×n 个原始数据,而只需要传送 k(2n+1) 个有关奇异值和奇异值向量的数据即可。在接收端,接收到奇异值 σ1,σ2,...,σk 以及左奇异向量 u1,u2,...,uk 和右奇异向量 v1,v2,...,vk 后,即可通过截尾的奇异值分解公式

A^=i=1kσiuivTi
重构出原图像。

一个容易理解的事实是:若 k 值偏小,即压缩比 ρ 偏大,则重构的图像的质量有可能不能令人满意。反之,过大的 k 值又会导致压缩比过小,从而降低图像压缩和传送的效率。因此,需要根据不同种类的图像,选择合适的压缩比,以兼顾图像传送效率和重构质量。

matlab 实现代码如下

% 利用奇异值分解进行图像压缩
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear;
clc;

img = imread('lena.jpg');
img_gray = rgb2gray(img);

img_gray = imresize(img_gray,0.5);
[m,n] = size(img_gray);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 奇异值分解
[u s v] = svd(double(img_gray));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 重构压缩后的图像
r = 4;    % 压缩率
K =round(2 * m * n / ( r * (m + n + 1)));

if K > min(m,n)
    K = min(m,n);
end

img_c = zeros(size(img_gray));

for i = 1:K
    img_c = img_c + s(i,i) * u(:,i) * v(:,i)';    % 利用前K个特征值重构原图像
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(2,2,1); imshow(img,[]); title('原彩色图');
subplot(2,2,2); imshow(img_gray,[]); title('原灰度图');
subplot(2,2,3); imshow(img_c,[]); title(['压缩比 r = ',num2str(r), ' 的压缩图']);
subplot(2,2,4); imshow(uint8(double(img_gray) - img_c));  title('压缩前后图像的差值'); % colormap cool

实验结果:
PCA与图像压缩_第1张图片
PCA与图像压缩_第2张图片

你可能感兴趣的:(Matlab)