PCA与图像压缩
2015-8-10
奇异值分解在图像压缩处理中有着重要的应用。假定一副图像有 n×n 个像素,如果将这 n2 个数据一起传送,往往会显得数据量太大。因此,我们希望能够改为传送另外一些比较少的数据,并且在接收端还能够利用这些传送的数据重构原图像。
不妨用矩阵
A
表示要传送的原
比率:
称为图像的压缩比。显然,被选择的大奇异值的个数
k
应该满足条件
因此,我们在传送图像的过程中,就无须传送 n×n 个原始数据,而只需要传送 k(2n+1) 个有关奇异值和奇异值向量的数据即可。在接收端,接收到奇异值 σ1,σ2,...,σk 以及左奇异向量 u1,u2,...,uk 和右奇异向量 v1,v2,...,vk 后,即可通过截尾的奇异值分解公式
一个容易理解的事实是:若
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
实验结果: