建模案例二基于SVD算法的图片压缩程序.doc

建模案例二基于SVD算法的图片压缩程序.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

kabudou + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档