线性代数、矩阵、与图像处理的例子

最近在做相移法的实验,了解了一些图像方面的知识。另还有同学给小编抱怨说线性代数学了好像没什么用。仰天一声笑,真是sometimes naive...

这里小编简单举一个例子,引出一下线性代数的在日常中的作用,对的!你无时无刻不在用它!

上镇号之宝图!

别问我为什么这么爱这张图!劳资就是喜欢!

为了接下来处理的方便,我们将它转化为灰度格式:

进入正题

科普一下图像的存储,这张图片尺寸是640*640,也就是有409600个像素点,每个像素点需要用一个数字来表示它的灰度(由于是黑白图片,只需要灰度就够了)一个浮点数所需的存储空间是8bit,也就是1byte,所以整张图片存储需要409600/1024=400KB

假设小编的电脑上我的爷爷祖传给我的,存储容量只有50KB??what??那我要怎样存下这张图片呢?

对!聪明的你也许猜对了,我要压缩

先说一个思想,由于整个图片是640*640的像素点组成,每个像素点用一个数字来代表它的颜色。那么我们其实可以将这张图片看做一个640*640的矩阵。或者可以说,图片就是矩阵!

跟我一起念:

万物基于线性代数!

假定你们都已经学过特征值分解或者是奇异值分解(不会的话就装作自己会了)。奇异值分解实际上就是特征值分解的推广。

如上图,将A奇异值分解,得到A=SVD,S与D都是矩阵,V为对角矩阵,其中的s1,s2...代表列向量,d1,d2...代表行向量。v1,v2...代表奇异值。

也可以将上式改写为:

此式就叫做奇异值分解。比如在本图中,n就等于640.事实上,一张图片奇异值分解后将v1到v_n从大到小排列后,后面的奇异值已经变得非常小了,对整张图片的贡献不大,或者我们可以将它叫做噪声。(其实图片降噪也是这么做的)所以我们可以直接扔去后面这些很小的奇异值

比如对于这张图片,一共有640个奇异值,我们保留仅前50个。那么我们现在来计算一下需要的存储空间有多大。首先是50个奇异值,然后每个奇异值对应两个奇异向量s,d,故一共需要的空间为50+50*640+50*640=64050byte,也就是62KB。整整比原来的400KB小了六倍!!

那么可能有同学会怀疑我们真的能直接扔去后面550个奇异值?话不多说,看下效果:

这就是仅仅保留50个奇异值得到的图片!但是发现图片清晰度明显不如原图,这就是所谓的图像压缩会使得图片变模糊。

如果我们保留前100个奇异值,大小会比60KB稍大一点,但清晰度会上升,如下图:

肉眼上来说,你可能已经分辨不出来这张图与原图的差异了,但是他的大小也仅为125KB,比原图还是少了三分之一。

当然图像压缩的算法有很多种,这里只是介绍了其中的一种,可以发现线性代数其实在生活中无处不在,最后贴上本次实验matlab的代码(代码不长,应该很容易看懂吧)

THE END

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181208G1BJ3I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券