利用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.rhkb.cn/news/200165.html

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

相关文章

git修改commit历史提交时间、作者

1、修改最近的几条记录&#xff0c;进入提交记录列表&#xff0c;修改提交记录模式 git rebase -i HEAD~3 // 修改最近的三条记录&#xff0c;顺序排列按提交时间升序 指令说明&#xff1a; pick&#xff1a;保留该commit&#xff08;缩写:p&#xff09; reword&#xff1a…

苍穹外卖—解决前端时间属性显示问题

项目场景&#xff1a; 点击员工管理 出现显示时间属性问题 输入员工姓名为zhangsan 现实的时间属性是数组类型 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 例如&#xff1a;数据传输过程中数据不时出现丢失的情况&#xff0c;偶尔会丢失一部分数据 APP …

AD从原理图到PCB超详细教程

AD超详细教程 前言一、建立一个工程模板二、原理图1.设计原理图。2.使用AD自带库和网上开源原理图库3.画原理图库4.编译原理图 三、PCB1.确定元器件尺寸大小2.绘制PCB Library①使用元器件向导绘制元件库②原理图与PCB的映射 3.绘制PCB①更新PCB②调整元件位置③布线④漏线检查…

Git 远程仓库(Github)

目录 添加远程库 查看当前的远程库 提取远程仓库 推送到远程仓库 删除远程仓库 Git 并不像 SVN 那样有个中心服务器。 目前我们使用到的 Git 命令都是在本地执行&#xff0c;如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员…

OSG文字-各种文字效果(边框、阴影及颜色倾斜)示例(2)

各种文字效果(边框、阴影及颜色倾斜)示例 各种文字效果(边框、阴影及颜色倾斜)示例的代码如程序清单9-2所示&#xff1a; 1. /* 各种文字效果(边框、阴影及颜色倾斜)示例 */ 2. osg::ref_ptr<osg::Camera> createAllKindText(const string &strDataFolder) 3. {…

问题 R: 胜利大逃亡(HUST)

#include <deque> #define inf 200000 #include<iostream> #include<queue> using namespace std;// 迷宫坐标 int map[59][59][59] { 0 };// 可访问标记 int visit[51][51][51] { 0 }; // 移动方式 int next1[7][4] { {1,0,0},{-1,0,0}, {0,1,0},{0,-1,…

mysql主从搭建(docker)

一、主从概述 MySQL主从又叫Replication、AB复制。简单讲就是A与B两台机器做主从后&#xff0c;在A上写数据&#xff0c;另外一台B也会跟着写数据&#xff0c;实现数据实时同步。有这样几个关键点&#xff1a; 1&#xff09;MySQL主从是基于binlog&#xff0c;主上需开启binl…

Altium Designer学习笔记6

原理图库的制作&#xff0c;SMA元件的制作&#xff1a; 图形不是很重要&#xff0c;重要的是管脚的功能。 Design Item ID和Designator两个值是要注意的。 进行Place放置&#xff0c;切换到原理图工作区&#xff0c;测试下功能。 AD9851元件库制作&#xff1a; 不需要再新建原…

IDEA中更换java项目JDK

我们打开IDEA 打开项目 然后选择 File 下的 Project Structure 这里 我们下拉选择自己需要的JDK Sources这里 也要设置一下JDK对应版本 然后 上面这个 Project 中 也要设置一下对应jdk的版本 保持一直 然后 我们打开 File 下的 Settings 然后 找到如下图配置 如果JKD版本看…

企业app软件定制开发的重点是什么?|小程序网站搭建

企业app软件定制开发的重点是什么&#xff1f;|小程序网站搭建 在当今数字化时代&#xff0c;企业对于信息技术的依赖越来越大。为了适应市场需求并提高内部运营效率&#xff0c;许多企业开始寻求定制开发企业app软件。这种定制开发可以根据企业的具体需求和业务流程进行个性化…

基于像素特征的kmeas聚类的图像分割方案

kmeans聚类代码 将像素进行聚类&#xff0c;得到每个像素的聚类标签&#xff0c;默认聚类簇数为3 def seg_kmeans(img,clusters3):img_flatimg.reshape((-1,3))# print(img_flat.shape)img_flatnp.float32(img_flat)criteria(cv.TERM_CRITERIA_MAX_ITERcv.TERM_CRITERIA_EPS,2…

IonQ、Rigetti、D-Wave公布2023年第三季度财报!

近期&#xff0c;量子计算公司Rigetti、IonQ和D-Wave均公布了各自在2023年第三季度的盈利收益。 这三家公司在近期均实现了收入增长&#xff0c;并助力客户实现相应的业务增长。然而&#xff0c;在追求实现量子霸权和超越经典硅基计算机系统的同时&#xff0c;这些公司仍面临着…

平民如何体验一把大模型知识库

背景 随着openai发布的chatgpt,各界掀起大模型热. 微软、谷歌、百度、阿里等大厂纷纷拥抱人工智能, 表示人工智能将是下一个风口.确实, chatgpt的表现确实出乎大部分的意料之外,网上也不断流传出来,chatgpt未来会替换很多白领.作为一名普通的程序员,觉得非常有必要随波逐流一下…

概念解析 | 网络安全数字孪生(Digital Twin of Cyber Security, DTCS)技术

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:网络安全数字孪生。 概念解析 | 网络安全的“数字镜像” —— 网络安全数字孪生 1. 背景介绍 随着数字化转型进程的深入推进,网络空间安全问题日益凸显。当前的网络安全防护面…

城市易涝点怎么安装万宾科技内涝积水监测仪?

城市内涝是多个城市广泛存在的问题&#xff0c;经常给城市的居民和基础设施带来一些安全威胁。暴雨引发的道路积水和交通中断、财产损失&#xff0c;甚至公共安全威胁都是城市管理者需要提前预防的问题。为了解决这些问题&#xff0c;内涝积水监测仪的应用是一大重要的举措&…

Linux--网络编程

一、网络编程概述1.进程间通信&#xff1a; 1&#xff09;进程间通信的方式有**&#xff1a;管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号&#xff0c;信号量这么集中 2&#xff09;特点&#xff1a;依赖于linux内核&#xff0c;基本是通过内核来实现应用层…

【机器学习】039_合理初始化

一、稳定训练 目标&#xff1a;使梯度值在更合理的范围内 常见方法如下&#xff1a; 将乘法变为加法 ResNet&#xff1a;当层数较多时&#xff0c;会加入一些加法进去 LSTM&#xff1a;如果时序序列较长时&#xff0c;把一些对时序的乘法做加法 归一化 梯度归一化&…

LLM大模型 (chatgpt) 在搜索和推荐上的应用

目录 1 大模型在搜索的应用1.1 召回1.1.1 倒排索引1.1.2 倒排索引存在的问题1.1.3 大模型在搜索召回的应用 (实体倒排索引&#xff09; 1.2 排序1.2.1 大模型在搜索排序应用&#xff08;融入LLM实体排序&#xff09; 2 大模型在推荐的应用2.1 学术界关于大模型在推荐的研究2.2 …

开源集群管理系统对比分析:Kubernetes 与 Apache Mesos

集群管理系统是关键的软件解决方案&#xff0c;可以在互连机器网络中有效分配和利用计算资源。毫无疑问&#xff0c;它们通过确保可扩展性、高可用性和有效的资源管理在现代计算中发挥着至关重要的作用&#xff0c;这使得它们对于运行复杂的应用程序、管理数据中心以及进一步增…