图像压缩(SVD方法)

原理

奇异值分解在图像处理中有着重要应用。假定一幅图像有 nn 个像素,如果将这 n2 个数据一起传送,往往会显得数据量很大。因此我们希望能够改传送另外一些比较少的数据,在接收端利用这些数据重构原图像。
假定对矩阵 A 进行奇异值分解,便得到 A=UΣV2 ,其中,奇异值从小到大的顺序排列。如果从中选取 k 个大奇异值以及这些对应的左右奇异向量逼近原图像,便可以共使用 k(2n+1) 个数值取代原来的 nn 个图像数据。
图像的压缩比率

ρ=n2k(2n+1)

代码

clear all;close all; clc
f = imread('lena.jpg');
[m,n] = size(f);

k = 100;            %保留最大奇异值个数
f = double(f);      %uint8类型
[u,s,v] = svd (f);  %进行奇异值分解,这里s为对角矩阵 
s = diag(s);        %提出对角矩阵的对角线元素,得到一个向量
smax = max(s);smin = min(s);    %求最大奇异值和最小奇异值
s1=s;s1(k:end) = 0;            %只保留前20个大的奇异值,其他奇异值置零
s1 = diag(s1);      %把向量变成对角矩阵
g = u*s1*v';        %计算压缩以后的图像矩阵
g = uint8(g);
compressratio = n^2/(k*(2*n+1));

subplot(1,2,1),imshow(mat2gray(f));title('source') %原图
subplot(1,2,2),imshow(g); title(['compress ratio',num2str(compressratio)]) %压缩后的图像
figure,plot(s,'.','Color','k')  %画出奇异值对应的点

结果

从图像的奇异值分布情况,可以看出来但保留前100个图像的奇异值,基本上可以保留图像的大部分信息,此时的压缩率2.5575。若要增大压缩率,保留较少就可以了。
图像压缩(SVD方法)_第1张图片
图像压缩(SVD方法)_第2张图片
图像压缩(SVD方法)_第3张图片

你可能感兴趣的:(SVD,图像压缩,矩阵分解)