奇异值分解(Singular Value Decomposition 简称SVD)是线性代数中的一种重要分解,在很多领域都有着广泛的应用。这篇文章将通过一个图像压缩的例子教你如何在Python中使用SVD实现数据压缩,并说明其原理。

奇异值分解压缩的原理

先看一个简单的例子,如果你想要在网络上给别人发送一段数据,数据的内容为

当然,最简单的方法就是给这个矩阵直接发过去,这是一个5x5的矩阵,你至少需要发送25个数字。

但是我们可以把这个矩阵分解为两个矩阵的乘积,这样只需要发送10个数字。

图像也可以被视为矩阵,图像的每一个点都是由RGB值定义的,所以每个图像可以被表示为三个巨型矩阵(分别是R,G,B矩阵)。

但图像所生成的矩阵显然不会像上面的例子那样简单的就被分解了。想要分解任意矩阵,这就需要用到SVD了。

SVD分解可以被认为是EVD(Eigen Value Decomposition 特征值分解)的延伸。特征值分解将一个矩阵分解为两组正交的特征向量和一个特征值对角线矩阵。

而特征值矩阵又是从大到小排列的,特征值大小的下降速度很快,我们可以通过丢弃一些特征值来压缩数据。对于压缩图像来说,只要人眼不可察觉便可以认为是成功的压缩。

简单来说,就是通过把一块大的数据分解为很多项,通过给数据的每个项的重要程度排序,挑选出一部分最重要的保留,丢弃一部分最不重要的,来实现数据压缩。

Python实现图像压缩

在python中使用SVD算法很容易,直接使用库函数即可。这里主要使用numpy库用来进行矩阵计算,matplotlib用来显示图像以及PIL库用来读取本地测试图片。

首先需要把测试图片导入进来,转换为numpy的矩阵。

img=Image.open(,)

a=np.array(img)

这里图片转矩阵后的格式实际上是一个图片长乘宽的矩阵,这个矩阵的每一个项都包含3个数字,分别是R,G,B的值

实现SVD分解

SVD分解只需要一句话即可

u,sigma,v=np.linalg.svd(a[:,:,0])

这里的SVD分解返回三个执行后返回三个矩阵,分别是u,sigma和v

实现重建函数

def rebuild_img(u,sigma,v,p):

m=len(u)

n=len(v)

a=np.zeros((m,n))

count=(int)(sum(sigma))

curSum=0

k=0

while curSum<=count*p:

uk=u[:,k].reshape(m,1)

vk=v[k].reshape(1,n)

a+=sigma[k]*np.dot(uk,vk)

curSum+=sigma[k]

k+=1

a[a<0]=0

a[a>255]=255

return np.rint(a).astype()

重建函数接受4个参数,u,sigma,v即重建矩阵所需的内容,p则为使用特征值的比例,我们将通过改变比例p来看使用特征值比例对画面的影响。

算法的步骤如下描述:

首先计算出m和n,即图片矩阵的长和宽,然后创建一个零矩阵a作为组装场地。

count是所有特征值加起来的总和,用于后面计算比例使用

uk和vk就是从参数u和v中取出,改变形式后形成的与当前特征值对应得一组特征向量。

然后不断地从参数中取出uk、vk和sigma,运算后叠加到a上去,直到满足一定的比例。

最后把所有矩阵内的项取整数退出即可。

数据压缩实验

有了分解与重建,现在可以设计数据压缩试验了。

这里我们控制特征值的使用比例,从0.1到1,每次步进0.1,然后分解重建,看看图像的显示情况。

for i in np.arange(0.1,1,0.1):

u,sigma,v=np.linalg.svd(a[:,:,0])

R=rebuild_img(u,sigma,v,i)

u,sigma,v=np.linalg.svd(a[:,:,1])

G=rebuild_img(u,sigma,v,i)

u,sigma,v=np.linalg.svd(a[:,:,2])

B=rebuild_img(u,sigma,v,i)

I=np.stack((R,G,B),2)

plt.subplot(330+i*10)

plt.title(i)

plt.imshow(I)

plt.show()

为了展示细节的丢失程度,特地找了一张细节丰富的图像作为试验对象。原图分辨率1920×724,见图1.

图 1 丰富细节的原始图

图2为运行结果

图 2 SVD分解后结果图

可以看到,当sigma比例在0.5及以下时,能够明显察觉到图片被压缩的痕迹,但当sigma比例超过0.6时,细节的还原就比较好了,当0.7,0.8,0.9时,肉眼几乎无法发现压缩痕迹,证明了SVD作为图像压缩算法,在细节丢失方面是可以控制得比较好的。在保持细节的前提下,可以将数据压缩10%-30%左右。

最后,如果您有python /java /小程序/安卓/linux相关需求,可以通过微信公众号联系我们。

微信公众号:320科技工作室。

python图片压缩算法_Python实现奇异值分解(SVD)压缩图片相关推荐

  1. 如何压缩jpg图片的大小?可以一键压缩图片的软件有哪些?

    其实不同的图片有不同的大小,甚至同一张图片有不同的格式.如果图片尺寸比较大,我们在使用的时候就会比较麻烦.因为现在一些网站对图片的大小有严格的限制,我们无法上传体积较大的图片,所以我们需要将较大的图片 ...

  2. 如何使用python批量压缩图片_python利用Guetzli批量压缩图片

    Google 又开源了,这次开源了一款图像算法工具 Guetzli.Guetzli,在瑞士德语中是"cookie(曲奇)"的意思,是一个针对数码图像和网页图像的 JPEG 编码器, ...

  3. python压缩视频文件_python使用zlib库压缩图片,使用ffmpeg压缩视频

    # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -preset veryslow -profile:v baseline -crf 2 ...

  4. python视频压缩算法_Python入门到精通视频,阿里巴巴大力推荐,20行Python代码,无损压缩千百张图片!...

    阿里巴巴推荐,Python基础入门,Python小白书籍,Python学习路线,Python进阶,Python高级,Python爬虫等等一系列关于Python的文档和视频(包括hadoop,fink, ...

  5. python批量生成图片_python图像处理-批量生成纯色图片

    前言 本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑.如果觉得好可以分享转发,有问题的地方也欢迎指出,在此先行谢过. 上一 ...

  6. python批量添加水印_python 给目录下的图片批量加水印

    python 给目录下的图片批量加水印 water.py 放到 图片文件夹里 然后cd 到当前文件夹 python water.py #coding=utf-8 import Image import ...

  7. node 压缩图片_手搓一个TinyPng压缩图片的WebpackPlugin

    作者: JowayYoung 转发链接:https://mp.weixin.qq.com/s/eqsZwZPCX-GZyB-EOm3TwQ 前言 曾经发表过一篇性能优化的文章<「实践」细聊前端性 ...

  8. android设置图片亮度分10档,批处理图片同时调整图片亮度批处理图的大小压缩图片裁边(6页)-原创力文档...

    使用Microsoft Office Picture Manager的最大好处是可以批处理文件:可同时处理一批图片的亮度.对比度.调整尺寸大小(压缩图片).旋转图片等,一气呵成. 批处理图片实例操作: ...

  9. 怎么压缩图片 ? 掌握这几种免费压缩图片的方法就够了

    您需要了解图像大小调整和编辑的方法.您无需成为平面设计专家:调整图像大小和压缩照片是每个人都可以轻松学习的东西. 什么是照片压缩? 照片压缩或图像压缩是一种减少图像文件大小的过程,以便它在您的计算机中 ...

  10. 4个图片无损压缩工具,快速批量压缩图片,图片高清不糊

    给大家整理了4个图片无损压缩工具,将图片体积压缩变小的同时,还能保证原图的质量以及清晰度. 1.图片转换器 一个主打图片格式转换的工具,但还提供了很多其他的图片处理功能,包括图片图片压缩.图片转PDF ...

最新文章

  1. Centos-Server-Nginx服务(编译安装)
  2. 使用CSS3属性aspect-ratio做横屏检测优化用户体验,附demo完整代码
  3. Codeforces Round #709 (Div. 1) C. Skyline Photo dp + 单调栈优化
  4. 顶尖的语音识别软件――Nuance Recognizer_语音识别_CTI论坛
  5. access insert语句怎么写_被缠上了,小王问我怎么在 Spring Boot 中使用 JDBC 连接 MySQL
  6. 自定义一个可复用的BaseAdapter
  7. Java并发编程实战——并发编程的优缺点
  8. 单片机C 语言程序设计教程,基于51单片机的C语言程序设计教程.doc
  9. 1matlab像素值及统计
  10. 课堂派“互动课件”文件下载
  11. 华为不要php开发,华为手机开发者选项的利与弊!有些设置最好不要打开
  12. 《Windows驱动开发技术详解》学习笔记
  13. opencv与C++实现最大类间方差法(OTSU)进行图像二值化
  14. 啪!啪!给 JobIntentService 打针, Hilt 号的大针,看你爽不爽?哎呦,Espresso 看不到结果,用 UiAutomator 测。
  15. [架构之路-26]:目标系统 - 系统软件 - bootloader uboot使用方法、常用命令
  16. Python输出斐波拉契数列
  17. 23神经网络 :唐宇迪《python数据分析与机器学习实战》学习笔记
  18. 【逻辑漏洞技巧拓展】————5、密码逻辑漏洞
  19. Greenplum 扩容
  20. 期刊论文写作的注意事项

热门文章

  1. 基于MATLAB的隐函数偏导与多重积分(附代码)
  2. 部分更新没有安装 KB4535102
  3. 微信小程序 弹出确定取消框
  4. 用计算机清点木材的数量,木材检验员培训课件-木材出入库管理.ppt
  5. 3904三极管是什么功能_你了解三极管的种类吗
  6. 对抗攻击与防御 (2):对抗样本的反制策略
  7. 應用程式中發生伺服器錯誤
  8. pinyin4j获取汉字正确的全拼和简拼
  9. 竹子的故事:送给那些坚持了很久却准备放弃的人 --- 厚积方能薄发
  10. Jsoup爬虫获取公司纳税识别号