基于奇异值分解的图像压缩处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于奇异值分解的图像压缩处理
矩阵奇异值分解在图像压缩中的应⽤
电⼦科技⼤学微固学院贾旺旺
[摘要]本⽂⾸先介绍了矩阵的奇异值分解(SVD)定理,然后讨论了基于矩阵奇异值分解的图像压缩编码原理,最后⽂中给出了实例,并⽤matlab 编程实现了图像的压缩和重构,发现随着图像压缩⽐的减⼩,图像传输时间增⼤,但重构后得到的图像失真度减⼩了。
[关键词]奇异值分解图像压缩压缩⽐⼀.引⾔
随着⽹络的快速发展,数据量的增长也⼗分迅速,这使⼈们必须想办法如何能以最少的存储空间,最⼤的传输效率来进⾏数据的存储和传输。
如在宇航中,拍摄得到的图像⽂件⼀般都⽐较⼤且数量也很多,它的存储,传输和处理会受到⼀定的限制,因此图像压缩就显得格外重要。
图像压缩技术就是要减少图像数据中的冗余信息从⽽以更加⾼效的格式存储和传输数据。
图像压缩的基本⽅法包括⽆损压缩的⾏程长度编码,熵编码法;有损压缩的⾊度抽样法,变换编码,分形压缩等。
近⼏年,基于矩阵奇异值分解的图像压缩⽅法也得到了很多学者的关注[1]。
因为图像的像素点具有矩阵的结构,我们可以利⽤奇异值分解来对任意阶数的矩阵操作。
本⽂就是利⽤了矩阵的奇异值分解,达到了图像压缩的⽬的。
⼆. 矩阵奇异值分解原理[2] 引理 1
的⾮零特征值相同
的特征值均为⾮负实数,则有
设H H H H H H n
m r
AA A A AA A A AA rank A A rank A rank C A ,)3(,)2()()()()1(==∈? )
()()()(00)(0
0)()1(:1111111A A rank A rank A A rank A rank Ax Ax Ax Ax A x Ax A x X k n Ax A k A A rank H H H H H
H H
H H =?≤?=?==?=?-=?=维,记为的解空间为设证明0
),(),(),(),(0)2(≥?===≤?=λααλλααααααλααA A A A A A H H
.
...,,,...,,0...0)...(0
...0...,...,..
)()()(0
......0......)3(2121221122112211221111k 21121复度相同的⾮零特征值的代数重与所以的维数的特征⼦空间的维数不⼤于的特征⼦空间同理可证:的维数特征⼦空间的维数不⼤于的特征⼦空间线性⽆关,全为零⼀组基底
的特征⼦空间是设下⾯考虑其代数重数:
的⾮零特征值的⾮零特征值也是同理可证:的⾮零特征值也是的特征值为的特征值是是A A AA V A A V AA V AA V A A Ay Ay Ay k k k y k y k y k y k y k y k Ay A k Ay A k Ay A k Ay k Ay k Ay k V A A y y A A AA AA A A AA A A A A AA A A AA A A H H H H H H p p p p p p p H p H H p p H p H H H i i i i H i H i H i i i H m k H n r r H λλλλλλλαλααααλαµµµµµλλλλλ=+++?=+++?=+++?=+++?
=?=?====>≥≥≥====>≥≥≥++定义 1
的正奇异值。
为的奇异值为则称的特征值为设A r i A n i A A C A i i i i n r r H n
m r
),...,2,1(,),...,2,1(.
0......,121=======>≥≥≥∈+?λσλσλλλλλ定理 1
.),...,2,1),,...,,(000n ,...,,,i i i 2121n
m r
的复数(是满⾜⽽,其中得,使
阶⾣矩阵及阶⾣矩阵个正奇异值,则存在的是设r i diag D V D U A V U m r A C A r r ===
=∈?σ
δδδδδσσσ)
2()()()
1(00)(00)(0,000,,)0,...0,,...,,(000n 1111111211212211112222222112212
2111)(212122221D D D D AV A V D AV U AV U D AV U U U U U U U A V D U AV AV AV AV A V AV A V D D AV A V D D AV A V AV A V AV A V AV A V C V C V V V V diag D D AV
VA A A H H H
H H H
H
H
H
H
H H H H H
m
r r H H H
H
H
H H H H H H H H H H H H H H H H
H H n r n r n n r r r H H
H
H
====?==
=∈=?=?==?==???? ??=???? ???∈∈???? ??==???
=?---?-?--?σσσ阶正规矩阵为证明:
====000)3(0,0022212D AV
U AV U AV U AV H
H
H
H
H
H
H
所以
三.基于奇异值分解的图像压缩编码 1.图像的压缩
奇异值分解算法的⼀个重要的特征是可以降维。
设A 是n m ?型矩阵,表明A 是n 个m 维向量,若A 的秩为r 我们可以通过奇异值分解,将A 表⽰为r 个m 维向量和r 个n 维向量。
若A 的秩⼩于或远⼩于m 和n ,那么就可以通过奇异值分解达到降维的⽬的。
以⼀幅有n n ?个像素点的图画为例,当n 很⼤时,如果将这2
n 个像素点全
部传送,虽然得到的图像失真度很低,但是传输的效率也会很低。
⽽我们希望在误差允许范围内,尽可能快的传送数据,且在数据接收端能够根据得到的数据重构图像。
另外,⼤的奇异值对图像的贡献⼤,⼩的奇异值对图像的贡献⼩,所以可以从r 个正奇异值中选取前k )(r k <个较⼤的特征值,再结合这k 个奇异值对应的左右⾣矩阵向量,来近似表⽰图像。
那么需要传送的像素点就变成了
)12(+n k 个,如果2)12(n n k <+,就会提⾼传输效率。
定义图像压缩⽐为:
)
12(2
+=n k n ρ (3-1)
显然,如果k 值越⼩,则压缩⽐越⼤,需要传送的像素点也越⼩,因⽽传输速度越快,但是得到的图像失真度将越⼤,反之亦然。
2. 图像的重构
为
’和’,’’可以写为那么的特征值为列向量均为⼆维
和其中以⼆维数组为例,如21222111212121212121,,,,,),,(00),(βββαλβαλλλββααββλλαα+=
=A A A A 转置向量,同理,若A 为n m ?型矩阵,那么在图像的数据接收端,接收到的是k 个奇异值和k 个m 维列向量,k 个n 维列向量。
近似有公式:
∑=∧
=k
i T
i i i v u A 1σ, (3-2)
那么就可以通过∧
A 近似作出图像。
在matlab 中读⼊图像的数据类型是uint8,⽽在矩阵中使⽤的数据类型是double ,因此需要将图像数组转换为double 类型,如果不转换,在对uint8进⾏加减时可能会产⽣错误[3]。
我们都知道图像⼀般都是由三原⾊R,G,B 构成的,matlab 中提取出⼀幅图像的像素点也是由R,G,B 三原⾊构成,它是⼀个三维数组,设为L ,那么L(:,:,1)表⽰R 原⾊构成的⼆维数组,元素值在[0,255],同理,L(:,:,2)表⽰G 原⾊,L(:,:,3)表⽰B 原⾊。
通过转换为double 数据类型,矩阵中每个元素值在[0,1]内。
四.图像压缩和重构的matlab 代码实现 1.算法流程
根据上述原理,⽂中选取了⼀幅JPG 图⽚,命名为pic ,像素为648*991。
利⽤matlab 先提取出了像素矩阵A ;然后将这个三维数组拆分为三个⼆维数组,即R,G,B 三个三原⾊矩阵,对这三个⼆维数组利⽤SVD ⽅法,计算其奇异值;选取前k 个奇异值及其对应的向量,进⾏图像压缩处理;最后重构图像。
为了对⽐压缩效果和传输时间,分别令k=10,50,100。
k 为选取的奇异值的个数。
下图给出了压缩和重构过程的流程图。
开始
提取图⽚pic 的像素矩阵L
将矩阵L 拆分为三个⼆维矩阵
对三个⼆维矩阵做SVD 分解
作出原图像,及R,G,B 三原⾊图
选取k个奇异值和对应向量,
利⽤(3-2)重构图像
终⽌
2.代码实现
clc
clear Q
L=imread('pic.jpg');
L1=L(:,:,1);
L2=L(:,:,2);
L3=L(:,:,3);
I1=im2double(L1);I2=im2double(L2);I3=im2double(L3); % maltab读⼊图像时,⽤` 的是unit8型
% 显⽰原图像
subplot(4,4,1); imshow(L); title('原图像');
subplot(4,4,2); imshow(I1); title('原图像R原⾊');
subplot(4,4,3); imshow(I2); title('原图像G原⾊');
subplot(4,4,4); imshow(I3); title('原图像B原⾊');
% 做奇异值分解
[u1,s1,v1]=svd(I1);
[u2,s2,v2]=svd(I2);
[u3,s3,v3]=svd(I3);
% ⽤来存储数据压缩后的三个矩阵
C1=zeros(size(I1));
C2=zeros(size(I2));
C3=zeros(size(I3));
k=10; % 取前10个特征值
% 利⽤公式重构矩阵
for j=1:k
C1=C1+s1(j,j)*u1(:,j)*v1(:,j).';
end
for j=1:k
C2=C2+s2(j,j)*u2(:,j)*v2(:,j).';
end
for j=1:k
C3=C3+s3(j,j)*u3(:,j)*v3(:,j).';
end
R1=im2uint8(C1); % 所占字节数较double型少
R2=im2uint8(C2);
R3=im2uint8(C3);
Q(:,:,1)=R1;
Q(:,:,2)=R2;
Q(:,:,3)=R3;
% k=10 压缩后图像
subplot(4,4,5); imshow(Q,[]); title('压缩后的原图像'); % 显⽰压缩后的原图像subplot(4,4,6); imshow(C1); title('压缩后的原图像R原⾊'); subplot(4,4,7); imshow(C2); title('压缩后的原图像G原⾊');
subplot(4,4,8); imshow(C3); title('压缩后的原图像B原⾊');
C1=zeros(size(I1));
C2=zeros(size(I2));
C3=zeros(size(I3));
k=50;
for j=1:k
C1=C1+s1(j,j)*u1(:,j)*v1(:,j).';
end
for j=1:k
C2=C2+s2(j,j)*u2(:,j)*v2(:,j).';
end
for j=1:k
C3=C3+s3(j,j)*u3(:,j)*v3(:,j).';
end
R1=im2uint8(C1);
R2=im2uint8(C2);
R3=im2uint8(C3);
Q(:,:,1)=R1;
Q(:,:,2)=R2;
Q(:,:,3)=R3;
% k=50压缩后图像
subplot(4,4,9); imshow(Q,[]); % 显⽰压缩后的原图像
subplot(4,4,10); imshow(C1);
subplot(4,4,11); imshow(C2);
subplot(4,4,12); imshow(C3);
C1=zeros(size(I1));
C2=zeros(size(I2));
C3=zeros(size(I3));
k=100;
for j=1:k
C1=C1+s1(j,j)*u1(:,j)*v1(:,j).';
end
for j=1:k
C2=C2+s2(j,j)*u2(:,j)*v2(:,j).'; end
for j=1:k
C3=C3+s3(j,j)*u3(:,j)*v3(:,j).'; end
R1=im2uint8(C1); R2=im2uint8(C2); R3=im2uint8(C3); Q(:,:,1)=R1; Q(:,:,2)=R2; Q(:,:,3)=R3;
% k=100压缩后图像
subplot(4,4,13); imshow(Q,[]); %显⽰压缩后的原图像 subplot(4,4,14); imshow(C1); subplot(4,4,15); imshow(C2); subplot(4,4,16); imshow(C3);
3.结果分析
由于原图像是⼀个648*991的图像,相当于矩阵为m=648,n=991。
利⽤公式
(3-1),压缩⽐可写为:
)1(++??=
n m k n
m ρ。
那么当k=10, 50, 100时压缩⽐分别为
92.3,83.7,16.39321===ρρρ。
另外由matlab 计算出图像传输时间(或称为图
下所⽰:
单位为秒。
画出图像如。
分别为像重构时间像压缩时间,不包括图728.13,003.13,521.12)321===t t
t
可以看出,随着压缩⽐的减⼩,图像传输所⽤的时间逐渐增⼤,⽽图像的失真度越来越⼩,即图像越来越接近真实图像。
为了更清晰的对⽐出结果,只做出彩⾊图来对⽐,结果如下:
(a) 原图像 (b) k=10
(c) k=50 (d) k=100
我们发现,随着压缩⽐的减⼩,图像失真度确实是越来越⼩。
验证了我们之前的说法是正确的。
四.结论与展望
本⽂基于矩阵的奇异值分解,利⽤matlab实现了图像的压缩处理和重构,得到结论:随着图像压缩⽐的减⼩,重构后得到的图像失真度减⼩了,但图像传输时间增⼤了,虽然时间增加的不明显,但是如果图⽚的数量增多,那么时间的增加将会很明显。
因此需要进⼀步的研究来选取⼀个最优的k值。
使时间和失真度上都得到较好结果。
另外,因为本⽂中只选取了⼀张普通的图⽚,如果是⼀张超⾼清的图⽚或者数量很多的照⽚,那么就会得到⼀个⼤型矩阵,或者很多个⼤矩阵,利⽤matlab ⾃带函数进⾏矩阵奇异值分解速度就会过慢,因此需要寻找新的算法来快速实现⼤型矩阵的奇异值分解。
五.参考⽂献
[1] 吴俊政. ⼀种基于奇异值分解的图像压缩⽅法[J]. 2009年5⽉
[2] 黄延祝,钟守铭,李正良.矩阵理论.⾼等教育出版社,2003,119-121
[3] matlab图像数据类型转换. /doc/ef93b1ec360cba1aa911da19.html /p-332119385.html。