奇异值分解与图像压缩

来源:互联网 发布:6080软件下载 编辑:程序博客网 时间:2024/05/17 07:56

本文是叙述对于矩阵进行奇异值分解(SVD分解的方法),后面有利用SVD分解对于图像压缩的应用,代码使用matlab语言。


SVD分解可以对于一个一般矩阵使用,将其分解为3个特殊的矩阵,公式如下:


其中,若M为一个m*n (m<n) 矩阵,则分解后的三个矩阵:

U为m*m酉矩阵,

Σ为m*n正定对角矩阵,

V*为V的共轭转置,是n*n酉矩阵。

注:酉矩阵是指其共轭转置与逆矩阵相同的矩阵。

如下图所示:




同特征值相似,奇异值也是从大到小排列,且减小特别快。实际上我们可以用前k个奇异值就能基本近似表示整个矩阵。

则可以得到如下的近似奇异值分解方法。

若原Σ的秩为r,则我们只取前k(k<r)个奇异值,如此分解后:

U为m*r矩阵,

Σ为r*r正定对角矩阵,

V*为r*n矩阵。

如下图所示:



可以看出,如此做以后,分解后的矩阵秩更小,但最大程度保留了原矩阵的特征。

我们也可以采用SVD分解的方法,完成图片压缩。


SVD分解的matlab实现:

[s v d]=svd(a);
直接使用svd函数。


下面是做图片压缩的matlab代码:

a=imread('lena.png');a=double(a);[s v d]=svd(a);re=s(:,1:10)*v(1:10,1:10)*d(:,1:10)';figure;imshow(mat2gray(re));imwrite(mat2gray(re),'lena1.jpg')re=s(:,1:50)*v(1:50,1:50)*d(:,1:50)';figure;imshow(mat2gray(re));imwrite(mat2gray(re),'lena2.jpg')re=s(:,1:100)*v(1:100,1:100)*d(:,1:100)';figure;imshow(mat2gray(re));imwrite(mat2gray(re),'lena3.jpg')re=s(:,1:300)*v(1:300,1:300)*d(:,1:300)';figure;imshow(mat2gray(re));imwrite(mat2gray(re),'lena4.jpg')

结果:

原图(512*512):


k=10;


k=50;


k=300;


0 0