将matlab中SVD分解用于图像压缩

首先,我们需要知道几个简单的知识:
1、任何一张灰度图片都是由二维的像素组成的,每一个像素对应一个颜色块(这一点用过ps的应该比较了解),其对应一个二维的矩阵;
2、对于RGB色彩的图像来说,每一维度分别是RGB的一个分量,整张图像对应一个三维矩阵;
3、利用SVD分解用于压缩图片可以在满足清晰度需求的情况下尽可能的减少图片的大小,也就是所占的存储空间。
其次,首先将matlab测试代码展示如下,代码中的每一步都做了注释:

a=imread('C:\**************\img.png');%读取一张图片,此处粘贴图片路径
a=a(:,:,1);%取一个颜色分量,留下灰度图片,该矩阵为RGB的三原色三个维度分量
imshow(mat2gray(a))%转化成标准的灰度图片
[m,n]=size(a);%取矩阵的大小
a=double(a);%将a中数据转化为双精度浮点值
r=rank(a)%求矩阵的秩
[U,S,V]=svd(a);%进行svd分解
k=200;%取前k个特征值
re=U(:,1:k)*S(1:k,1:k)*V(:,1:k)';%结尾前的逗号不能漏,先转置再相乘,否则矩阵维度会报错
%将分解得到的三个矩阵相乘,得到还原矩阵
%逗号前表示行向量,逗号后表示列向量;
%123表示从13取值且步长为2,即取13;若无2则表示取13,默认步长为1
figure;%使用默认属性值创建一个新的图窗窗口
imshow(mat2gray(re));%显示还原之后的图片

我们来使用如下图片来进行测试:
其图片大小为554kb
将matlab中SVD分解用于图像压缩_第1张图片
我们分别测试代码中取特征值为10,50,100三种情况,来看看有什么变化
k=10时:图像大小为242kb
将matlab中SVD分解用于图像压缩_第2张图片
k=50时:图像大小为329kb
将matlab中SVD分解用于图像压缩_第3张图片
k=100时:图像大小为370kb
将matlab中SVD分解用于图像压缩_第4张图片
我们发现随着取的特征值k的不断增大,图像会越来越清晰,但是当图片清晰到一定程度之后,我们继续增加特征值的数值时会发现清晰度没有明显的变化,此时像素分辨率超出了人眼识别的敏感区,所以只需要在满足个人清晰度需求的情况下选取合适的特征值即可。
最后,还需要注意的一点是,用户所取的特征值k不能超过原矩阵的秩,否则将会报错!

你可能感兴趣的:(matlab,SVD分解,matlab)