利用SVD对图像进行压缩

利用SVD对图像进行压缩

使用SVD能够对数据进行降维,对图像进行SVD,降维之后然后重构数据,还原后的图像就是压缩后的图像。
SVD
请添加图片描述

SVD进行图像压缩所依据的数学原理就是矩阵的近似表示:
A m × n ≈ U m × k ∑ k × k V k × n T A_{m\times n}\approx U_{m\times k}{\sum}_{k\times k}V_{k\times n}^T Am×nUm×kk×kVk×nT
请添加图片描述
使用SVD对图像进行压缩的最关键的就是确定k值,也就是使用多少个奇异值。用的越多那肯定包含原矩阵的信息就越多,但这样处理的数据也多,所以需要在数据量和还原度之间取个平衡。确定k有很多启发式的策略,其中一个典型的做法就是保留矩阵中90%的能量信息,即计算所有奇异值的平方和,取前k个奇异值平方和是总体奇异值平方和的90%。另一个启发式策略是当矩阵有上万奇异值时,就保留前面的2000或3000个,该方法虽然在实际中容易实施,但是任何数据集都不能保证前3000个奇异值就能够包含90%的能量信息。
在进行图像压缩时,我们采用两种策略来确定k的值:
1.通过奇异值总和的百分比来确定k的值
2.通过奇异值总个数的百分比来确定k的值

from PIL import Image
import numpy as npdef get_approx_SVD1(data, percent):#这里了的percent是奇异值总和的百分比U, s, VT = np.linalg.svd(data)Sigma = np.zeros(np.shape(data))Sigma[:len(s), :len(s)] = np.diag(s)count = int(sum(s)) * percentk = -1curSum = 0while curSum <= count:k += 1curSum += s[k]D = U[:, :k].dot(Sigma[:k, :k].dot(VT[:k, :]))#将矩阵 D 中小于 0 的元素设置为 0,将大于 255 的元素设置为 255。#因为在图像处理中,像素值通常被限制在0~255D[D < 0] = 0D[D > 255] = 255return np.rint(D).astype("uint8")def get_approx_SVD2(data, percent):U, s, VT = np.linalg.svd(data)Sigma = np.zeros(np.shape(data))Sigma[:len(s), :len(s)] = np.diag(s)k = (int)(percent * len(s))D = U[:, :k].dot(Sigma[:k, :k].dot(VT[:k, :]))D[D < 0] = 0D[D > 255] = 255return np.rint(D).astype("uint8")def rebuild_img(filename, p, get_approx_SVD, flag):img = Image.open(filename, 'r')a = np.array(img)#以下的R0,G0,B0,R,G,B都是二维的,不要想成三维了R0 = a[:, :, 0]#获得红色的色素值G0 = a[:, :, 1]#获得绿色的色素值B0 = a[:, :, 2]#获得蓝色的色素值R = get_approx_SVD(R0, p)G = get_approx_SVD(G0, p)B = get_approx_SVD(B0, p)I = np.stack((R, G, B), 2)#合成三通道的Nummpy数组#Image.fromarray()函数的作用是将Nummpy数组还原为图像对象Image.fromarray(I).save(str(p * 100) + flag + ".jpg")img = Image.open(str(p * 100) + flag + ".jpg", 'r')img.show()filename = "./test.jpg"
'''
np.arange(0.2, 1.2, 0.2)
第一个参数(0.2):起始值,即数组的第一个元素。
第二个参数(1.2):终止值,创建的数组中不包括这个值。
第三个参数(0.2):步长,即数组中相邻元素之间的差值。
[0.2,0.4,0.6,0.8,1.0]
'''
for p in np.arange(0.2, 1.2, 0.2):rebuild_img(filename, p, get_approx_SVD1, "SVD1")
for p in np.arange(0.2, 1.2, 0.2):rebuild_img(filename, p, get_approx_SVD2, "SVD2")

原图:
请添加图片描述

效果示例:
请添加图片描述

使用特征值可以将图像进行压缩处理,压缩后的图像颜色像素会损失部分,通过设定不同的奇异值筛选百分比,对比图片压缩后的效果。
原图像的每一层大小为512x512=262144,效果图中上层的5个图,依次对应按奇异值总和的20%,40%,60%,80%,100%,进行压缩,当按奇异值总和的60%压缩时,可以达到原图像的效果,此时,只取了33个奇异值(占总奇异值个数的6%),即 U U U ∑ \sum V T V^T VT的大小分别为512x33、33x33、33x512。此时,大小总共为 512 × 33 + 33 × 33 + 33 × 512 = 34881 512\times33+33\times33+33\times512=34881 512×33+33×33+33×512=34881,3个矩阵的大小总和远小于原图像的每一层大小。效果图下层的5个图,依次按照奇异值个数的20%,40%,60%,80%,100%,进行压缩。显然,当按照奇异值个数的20%取值时,其对应的奇异值总和的百分比已经超过了60%(算一下)。因此,建议按照奇异值总和的百分比压缩图像(其实通俗来说就是用的数据少,但是效果还不错,下层的图效果虽然都很好,但是用的数据太多了,压缩的数据量不够大)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码

基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于晶体结构优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

Vue原型对象

原型对象 prototype 称为&#xff1a;显示的原型属性&#xff0c;用法&#xff1a;函数.prototype&#xff0c;例如&#xff1a;Vue.prototype __proto__称为&#xff1a;隐式的原型属性&#xff0c;用户&#xff1a;实例.proto&#xff0c;例如&#xff1a;vm.proto 不管如何 …

[Docker]八.Docker 容器跨主机通讯

一.跨主机通讯原理 在主机192.168.31.140上的docker0(172.17.0.0/16)中有一个容器mycentos( 172.17.0.2/16), 在主机192.168.31.81上的docker0(172.17.0.0/16)中有一个容器mycentos( 172.17.0.2/16),然后在主机192.168.31.140上ping主机192.168.31.81,发现ping不通要实现两个主…

vite构建项目不能使用require解决方案

在utils文件夹下创建一个getImgUrl.ts文件 /** vite的特殊性, 需要处理图片 */ export const require (imgPath: string) > {try {const handlePath imgPath.replace(, ..)console.log(handlePath::, imgPath)return new URL(handlePath, import.meta.url).href} catch (…

如何入驻抖音本地生活服务商,附上便捷流程!

抖音作为一款短视频社交媒体应用&#xff0c;已经成为全球范围内数以亿计的用户的首选。而在普及的同时&#xff0c;短视频领域也在不断拓展自身的业务领域&#xff0c;其中之一就是本地生活服务。继抖音本地生活服务之后支付宝、视频号也相继开展了本地生活服务&#xff0c;用…

Linux(5):Linux 磁盘与文件管理系统

认识 Linux 文件系统 磁盘的物理组成&#xff1a; 1.圆形的磁盘盘(主要记录数据的部分); 2.机械手臂&#xff0c;与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据)&#xff1b; 3.主轴马达&#xff0c;可以转动磁盘盘&#xff0c;让机械手臂的读取头在磁盘盘上读写数据。 4…

05_面对对象高级_抽象类

抽象类 1. 认识抽象类 在 Java 中有一个关键字叫&#xff1a;abstract &#xff0c;它的中文含义是"抽象"&#xff0c;可以用它来修饰类、成员方法。 abstract 修饰类&#xff0c;这个类就是抽象类。 abstract 修饰方法&#xff0c;这个方法就是抽象方法。 2. 注…

python接口自动化-参数关联

前言 我们用自动化发帖之后&#xff0c;要想接着对这篇帖子操作&#xff0c;那就需要用参数关联了&#xff0c;发帖之后会有一个帖子的id&#xff0c;获取到这个id&#xff0c;继续操作传这个帖子id就可以了 &#xff08;博客园的登录机制已经变了&#xff0c;不能用账号和密…

【算法设计实验三】动态规划解决01背包问题

请勿原模原样复制&#xff01; 01背包dp具体解释详见链接 ↓ 【算法5.1】背包问题 - 01背包 &#xff08;至多最大价值、至少最小价值&#xff09;_背包问题求最小价值_Roye_ack的博客-CSDN博客 关于如何求出最优物品选择方案&#xff1f; 先在递归求dp公式时&#xff0c;若…

Proteus下仿真AT89C51单片机串行口的问题

在Proteus下仿真AT89C51单片机的串行口的时候&#xff0c;Proteu不同版本下差别较大。     同样的程序&#xff0c;在7.8的老版本&#xff08;7.8版本的原理图仿真软件名称是ISIS 7 Professional&#xff09;下仿真串行口&#xff0c;收发均正常。但是&#xff0c;在8.13版…

打印lua输出日志

日志级别&#xff1a; ngx.STDERR 标准输出ngx.EMERG 紧急报错ngx.ALERT 报警ngx.CRIT 严重&#xff0c;系统故障&#xff0c; 触发运维告警系统ngx.ERR 错误&#xff0c;业务不可恢复性错误ngx.WARN 提醒&#xff0c; 业务中可忽略错误ngx.NOTICE 提醒&#xff0c; 业务中比较…

增速大幅下滑?基础L2博弈成本

在高阶智驾&#xff08;从ALC到NOA&#xff09;的光环之下&#xff0c;传统入门级基础L2级辅助驾驶赛道也在发生一些微妙的变化。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-9月&#xff0c;基础L2在中国市场&#xff08;不含进出口&#xff09;乘用车前装标配交付45…

数据库存储引擎

一、MySQL体系结构 二、存储引擎-简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可以被成为表的类型 MySQL 5.5版本之后&#xff0c;默认存储引擎就是InnoDB&#xff0c;之前…

十六进制字符串转成十进制数

需求 转码要求 案例 A2 转成 十进制数是 10 *16 2 162 代码 需要注意的是可能十六进制 里面有大小写&#xff0c;比如F 写成f&#xff0c; a 写成A&#xff0c;或者大小写混合&#xff0c;要提高鲁棒性就要两个都可行,算法很是简单&#xff0c;其实就是求取当前值x1&…

HarmonyOS云开发基础认证【最新题库 满分答案】

系列文章 HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者基础认证【满分答案】 HarmonyOS云开发基础认证【最新题库 满分答案】 目录 系列文章一、判断题二、单选题三、多选题 一、判断题 1.应用架构的演进依次经历了微服务架构、单体架构、Serverle…

Python数据结构——List

一、列表 1.1创建列表 &#xff08;1&#xff09;构造函数创建 dataListlist() &#xff08;2&#xff09;直接赋值 dataList[1,2,3,4,5] 1.2添加元素到列表 dataListlist() dataList.append(3) # > [3] 1.3删除元素 &#xff08;1&#xff09;删除第一个匹配的元素…

ArcGIS如何处理并加载Excel中坐标数据?

做GIS行业的各位肯定免不了跟数据打交道&#xff0c;其中数据的处理说复杂也复杂&#xff0c;因为我们要花时间去做数据的转换及调整工作&#xff0c;那说简单也简单&#xff0c;因为我们有很多的工具可以使用&#xff0c;那么今天我就给大家带来处理Excel中的GIS数据中的其中一…

导师散养,硕博士生如何进行学术自救?

https://mp.weixin.qq.com/s/PQkL6XKoQfysq_W9kmmiDA 在公众号上看到这篇文章&#xff0c;觉得挺有道理&#xff01; 经常在小红书看到很多学生吐槽导师散养的帖子&#xff0c;觉得蛮有趣的。 我整个的学术历程&#xff0c;可能也算是一种「散养」历程。如果说硕士是被动选择的…

图像处理02 matlab中NSCT的使用

06 matlab中NSCT的使用 最近在学习NSCT相关内容&#xff0c;奈何网上资源太少&#xff0c;简单看了些论文找了一些帖子才懂了一点点&#xff0c;在此分享给大家&#xff0c;希望有所帮助。 一.NSCT流程 首先我们先梳理一下NSCT变换的流程&#xff0c;只有清楚流程才更好的理清…

代码随想录算法训练营第23期day57|739. 每日温度、496.下一个更大元素

一、739. 每日温度 力扣题目链接​​​​​​ 1. 什么时候用单调栈? 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时就要想到可以用单调栈。 单调栈的本质是空间换时间,更直白来说&#xff0c;就是用一个栈来…