程序地带

用SVD进行图片压缩


    本文利用了SVD,对图片进行了压缩测试。直接给出源码,注释写的都很清楚,压缩比例自己可以随意调整。 


import numpy as np
from numpy import linalg
from PIL import Image
img = Image.open("C:\Users\Paul\Desktop\frag.jpg")
# 转为灰度图,并将灰度图转换为ndarray
gray_img = img.convert('L')
img_array = np.array(gray_img)
# m: 左奇异矩阵,sig: 奇异值对角阵,v: 右奇异矩阵
m,sig,v = np.linalg.svd(img_array)
sig = np.eye(sig.shape[0]) * sig
# 计算奇异值能量分布
sum_sig_list = []
s = 0.0
for i in range(sig.shape[0]):
s += sig[i][i]
sum_sig_list.append(s)
# 选择最优的奇异值个数, ratio控制阈值
i = 0
ratio = 0.3
while i < sig.shape[0]:
r = sum_sig_list[i] / sum_sig_list[-1]
if r >= ratio:
print("%.2f : %.2f" % (sum_sig_list[i], sum_sig_list[-1]))
i += 1
break
i += 1
print("%d, %.2f" % (i, sum_sig_list[i]))
sub_m = m[:,:i] # 左奇异矩阵的前i列
sub_sig = sig[:i,:i] # 对角阵的前i行和前i列组成的对角阵
sub_v = v[:i,:] # 右奇异矩阵的前i行
# 压缩图片
compr_img_array = np.dot(np.dot(sub_m, sub_sig), sub_v)
compr_img = Image.fromarray(compr_img_array).convert("RGB")
compr_img.save("C:\Users\Paul\Desktop\compress_frag_30_precent.jpg", "JPEG")
print("%f" % (np.sum(compr_img_array) / np.sum(img_array)))

   原图如下



 压缩比为0.9的图片如下



  压缩比为0.7的图片如下



   压缩比为0.5的图片如下



 


 


 


 


 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gaoxueyi551/article/details/112689297

随机推荐

关于深度学习下目标检测入门那点事

关于深度学习下目标检测入门那点事你需要知道的学前班知识边界框(BoundingBox)交并比(IOU)非极大值抑制(NMS...

婕婕高升_OD 阅读(588)

对称加密算法:长期有效的加密(下)

对称算法列表:3种最常见的对称算法类型在本节中,我们整理了一个对称算法列表,该列表将帮助我们浏览最常见的对称密码。我们将从最古老的算法开始,逐步...

沃通WoTrus 阅读(311)

Dockerfile(php)

这里制作镜像分两步,第一步创建基础环境,第二步创建php启动镜像。第一步:创建基础环境Dockerfile-1内容:FROMphp:7.1-ap...

江流川 阅读(747)

简易入门git:本地上传代码入GitHub仓库

文章目录前言一、git简易原理说明1.git是什么2.git的工作原理3.操作理论预备二、在git操作之前1.安装git2.注册GitHub3.创建GitHub远程仓库4.打开GitHub仓库...

Elinkers 阅读(211)

Vue路由传参query和params的区别

路由配置:{path:’/login’,name:‘Login’,component:Login},1.页面携带query参数跳转(path,name指定跳转到Login时都可以携带qu...

李泽举 阅读(916)

IDEA本地仓库存在jar包但maven引入仍然报红

IDEA本地仓库存在jar包但maven引入仍然报红一个项目下S分多个模块ABCD,本地仓库是同一个,每个模块有自己的pom文件,其中一个子模块A引入了...

azi_csdn 阅读(446)

Metasploitsble2靶机的介绍和攻击

Metasploitsble2靶机的介绍和攻击一、Metasploitable2简介:Metasploitable2Linux系统是一个特别制作的Ubuntu系统,本身设计...

凌晨三点- 阅读(497)