原理
奇异值分解在图像处理中有着重要应用。假定一幅图像有
假定对矩阵
图像的压缩比率
代码
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。若要增大压缩率,保留较少就可以了。