- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
建模案例二基于SVD算法的图片压缩程序
建模案例二:基于SVD算法的图片压缩程序
一、矩阵的奇异值
在第四章中,我们知道满足了实对称方阵的特征值都是实数,而且,任一实对称方阵可以正交相似对角化。对于矩阵,由于,是对称矩阵,所以矩阵可以正交相似对角化,设是矩阵的特征值,是对应的单位特征向量,那么对于
所以,的特征值都是非负数,因为必要,我们将其特征值按照从大到小重新排列
的奇异值是的特征值的平方很,记为,且它们用递减顺序排列,也就是对。
二、矩阵的奇异值分解
矩阵的分解涉及一个“对角”矩阵,其形式为
(1)
此处,是一个对角矩阵,且。
定理 设是秩为的矩阵,那么存在一个类似于(1)的矩阵,此时的对角线元素是的前个奇异值,,并且存在一个正交矩阵和一个正交矩阵,使得.
任何分解称为的一个奇异值分解(singular value decomposition,简记为SVD),其中矩阵和并不是由唯一确定。
在MATLAB里,库函数用于求矩阵的奇异值分解,它既有数值功能,又有符号功能。
求矩阵的奇异值分解。
解
A=[1,2,3;4,5,6;7,8,9;10,11,12];
svd(A)
ans =
25.4624
1.2907
0.0000
[U,D,V]=svd(A)
U =
-0.1409 0.8247 0.5473 -0.0221
-0.3439 0.4263 -0.7133 0.4373
-0.5470 0.0278 -0.2153 -0.8085
-0.7501 -0.3706 0.3813 0.3932
D =
25.4624 0 0
0 1.2907 0
0 0 0.0000
0 0 0
V =
-0.5045 -0.7608 -0.4082
-0.5745 -0.0571 0.8165
-0.6445 0.6465 -0.4082
所以,矩阵的奇异值为,且存在正交矩阵
使得,其中
。
三、矩阵的秩逼近
由的奇异值分解
可见,是矩阵的加权和,其中是权重。若将奇异值按递减顺序排列
显然,奇异值大的项对矩阵的贡献大。因此,当舍去了权重小的部分项后仍然能够较好地“逼近”,这一特性常被用来压缩图像。
矩阵的秩逼近定义为
四、基于SVD算法的图像压缩
图像的每一个点对应一个像素。在8位的数字图像中,灰度图像的像素是一个介于0—255间的整数,以表示点的亮度;RGB彩色图像的像素是一个三元整数组(R,G,B),分别表示原色红、绿、蓝的亮度。 长方形的图片可以用一个横竖均匀划分的离散网格来覆盖,每一个网格对应一个像素,它是该网格上各点像素的均值。这样,长方形的灰度图片就可以用一个矩阵表示;而彩色图片就用三个矩阵(分别对应原色红、绿、蓝亮度)表示。SVD算法压缩图像的算法可以描述如下: STEP1:用imread函数读入图数据,放在矩阵A中;STEP2:根据需要输入秩k的值; STEP3:从A中取出表示红、绿、蓝亮度的矩阵,记为矩阵A;STEP4:分别计算A的秩k逼近; STEP5:用矩阵分别近似表示红、绿、蓝的亮度矩阵,构造(即A的秩k逼近); STEP6:用imwrite函数将中的数据写到指定的图文件。 clear;
InputName=input(\n请输入要压缩的图片名,例如C:\\Flower.jpg,请输入C:\\Flower\n\n,s);
ImageExt=jpg;
A=imread(InputName,ImageExt);
imshow(A);
A=im2double(A);
[m,n]=size(A);
Dimensions_of_the_picture_matrix=[m,n];
Rank=input(\n请输入秩: \n\n,s);
OutputName=input(\n请输入压缩后的图片名,例如C:\\Flowercpd.jpg\n\n,s);
OutputExt=jpg;
NewA=im2uint8(zeros(m,n));
[U,D,V]=svd(A);
[m n]=size(D);
New=zeros(m,n);
for k=1:Rank
New=New+D(k,k)*(U(:,k)*V(:,k));
end
NewA(:,:)=im2uint8(New
文档评论(0)