基于奇异值分解的图片压缩
一、目的
在网络空间安全数学基础上,老师给出了一种基于奇异值分解的图片压缩办法。在本篇文章中,对此进行简单的实现。
二、简单的数学原理
step1:我们考虑一个 n * n 的方阵A,其总满足:
假设有好多特征值 Lambda 与特征向量 x 都满足上述公式,则有:
可以得到:
这样,我们就把一个方阵 A 进行了分解。
step2:同理,任意 m * n 的矩阵 M,都可分解为这样的形式,我们把它称为奇异值分解。
step3:我们将 M 分解为如下图所示:
化简一下,就变为:
我们看到,这个式子大概加了 n 次,如果我们将图片变为矩阵,n是很大的,那如果只保留前 k 项,对矩阵 M 的影响如何呢?
(注意:la_1 > la_2 >…> la_n)
三、Matlab代码实现:
在此,我们将一个图片化为矩阵,只保留奇异值分解的前 k 项,观察对图片的影响。
I = imread('C:\Users\dell\Desktop\IMG_20190405_111109.jpg');
I=double(I); %将图片 0~255 转化为 double 形式,方便奇异值分解
[u s v]=svd(I(:,:,1)); %奇异值分解只能分解二维矩阵
k=200; %保留项数为200
left=u(:,1:k);
val=s(1:k,1:k);
right=v(:,1:k);
out=left*val*right';
low=min(min(out));
high=max(max(out));
imshow(out,[low,high]); %看一下图片啥样的啊
imwrite(uint8(out), 'C:\Users\dell\Desktop\result.jpg');%保存一下
四、测试结果:
我们所处理的图片:5.87 MB
1.当 k = 200 时,大小为1.6 MB:
2.当 k = 50 时,大小为1.0 MB: