利用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 np


def 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)) * percent
    k = -1
    curSum = 0
    while curSum <= count:
        k += 1
        curSum += s[k]
    D = U[:, :k].dot(Sigma[:k, :k].dot(VT[:k, :]))
    #将矩阵 D 中小于 0 的元素设置为 0,将大于 255 的元素设置为 255。
    #因为在图像处理中,像素值通常被限制在0~255
    D[D < 0] = 0
    D[D > 255] = 255
    return 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] = 0
    D[D > 255] = 255
    return 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%(算一下)。因此,建议按照奇异值总和的百分比压缩图像(其实通俗来说就是用的数据少,但是效果还不错,下层的图效果虽然都很好,但是用的数据太多了,压缩的数据量不够大)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java入门篇 之 内部类

本篇碎碎念&#xff1a;本篇没有碎碎念&#xff0c;想分享一段话&#xff1a; 你不笨&#xff0c;你只是需要时间&#xff0c;耐心就是智慧&#xff0c;不见得快就好&#xff0c;如果方向都不对&#xff0c;如果心术不正&#xff0c;如果德不配位&#xff0c;快就是对自己天分的…

Go——二、变量和数据类型

Go 一、Go语言中的变量和常量1、Go语言中变量的声明2、如何定义变量方式1&#xff1a;方式2&#xff1a;带类型方式3&#xff1a;类型推导方式定义变量方式4&#xff1a;声明多个变量总结 3、如何定义常量4、Const常量结合iota的使用 二、Golang的数据类型1、概述2、整型2.1 类…

Windows配置全局代理

一. Windows下为PowerShell/CMD/Git设置代理 —————————————————————————————————————————————————————— 二. [WinError 10061] 由于目标计算机积极拒绝&#xff0c;无法连接。 keyerror:192。 HTTP Error 403: Forbidd…

python实战—数据分析与图表1(QQ群聊天数据分析) lv2

目录 一、核心代码解释 二、代码 三、运行截图 一、核心代码解释 1、readlines() 方法 描述 readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表&#xff0c;该列表可以由 Python 的 for... in ... 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。 语法 r…

Monitor 原理

每个 Java 对象都可以关联一个 Monitor 对象&#xff0c;如果使用 synchronized 给对象上锁&#xff08;重量级&#xff09;之后&#xff0c;该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。 Monitor组成内容 EntryList&#xff08;入口列表&#xff09; 当一个线…

STM32F4串口USART发送为00的解决方案

检查接线是否正确检查TX是否为复用推挽输出 3.检查是否将TX和RX引脚重映射为USART功能 在STM32中&#xff0c;每个GPIO引脚可以配置为不同的复用功能&#xff0c;例如UART、SPI、I2C等。具体来说&#xff0c;GPIO_PinAFConfig函数用于配置GPIO引脚的复用功能。它的参数包括GPIO…

ANSYS中如何手动为装配体添加接触约束教程

接触的类型&#xff1a; 在接触类型&#xff08;Type&#xff09;选项中&#xff0c;软件共提供了绑定接触&#xff08;Bonded&#xff09;、不分离接触&#xff08;No Separation&#xff09;、无摩擦接触&#xff08;Frictionless&#xff09;、粗糙接触&#xff08;Rough&a…

新一代最强开源UI自动化测试神器Playwright(Java版)(对话框处理)

&#x1f3ad;Playwright让网页对话框&#x1f310;&#x1f4ac;处理变得更加快捷&#xff01;网页对话框是在网页上出现的常见弹窗&#xff0c;包括Alert、Confirm和Prompt等。这些对话框通常需要用户输入信息或进行某些选择&#xff0c;但是在自动化测试中处理它们可能会很棘…

全球首款容器计算产品重磅发布,激活上云用云新范式

云布道师 10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;阿里云云原生应用平台负责人丁宇宣布&#xff0c;阿里云容器计算服务 ACS 正式发布&#xff01;ACS 将大幅降低企业和开发者用云门槛&#xff0c;真正将 Serverless 理念大规模落地。 容器计算服务 ACS&#xff0c…

fractional Brownian Motion driven stochastic integrals

See https://mathoverflow.net/questions/304366/fractional-brownian-motion-driven-stochastic-integrals

程序员如何“升级打怪”?我用了这几个“歪瓜”!

不会吧&#xff1f;不会吧&#xff1f;计算机本命专业出身、以及半路出家的&#xff0c;混了几年了&#xff0c;还在新手村&#xff1f;对得起这几年摸的鱼&#xff1f; 思考一下&#xff1a;如何从小白一跃为大师&#xff0c;从此走上人生巅峰、迎娶白富美&#xff1f;变强只…

高速数据时代的引领者:ETU-LINK 100G DAC全系列技术简介

伴随科技的不断进步&#xff0c;我们正迅速迈向一个高速数据时代。在这个时代&#xff0c;数据的传输速度已经成为发展的重要因素之一。ETU-LINK推出的100G DAC全系列产品&#xff0c;助力高速数据传输领域的新一轮发展。 一、100G DAC全系列产品解析 100G QSFP28 DAC无源高速…

【Python】给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

问题描述 给出一个包含n个整数的数列&#xff0c;问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数&#xff0c;为给定的数列&#xff0c;数列中的每个数都不大于10000。 第三行包含一个整数a&#xff0c;为待查找的数。 输出格式…

# 聚类系列(一)——什么是聚类?

目前在做聚类方面的科研工作, 看了很多相关的论文, 也做了一些工作, 于是想出个聚类系列记录一下, 主要包括聚类的概念和相关定义、现有常用聚类算法、聚类相似性度量指标、聚类评价指标、 聚类的应用场景以及共享一些聚类的开源代码 下面正式进入该系列的第一个部分&#xff…

设置 wsl 桥接模式

一、环境要求 Win10/Win11 专业版&#xff0c;并已安装 Hyper-V 二、具体步骤 打开 Hyper-V 管理器 创建虚拟交换机 WSL Bridge 修改wsl配置文件 .wslconfig .wslconfig 文件所在路径如下&#xff1a; C:\Users\<UserName>\.wslconfig若 .wslconfig 文件不存在&am…

苍穹外卖遇到的问题—员工分页查询

项目场景&#xff1a; 系统中的员工很多的时候&#xff0c;如果在一个页面中全部展示出来会显得比较乱&#xff0c;不便于查看&#xff0c;所以一般的系统中都会以分页的方式来展示列表数据。而在我们的分页查询页面中, 除了分页条件以外&#xff0c;还有一个查询条件 “员工姓…

美团面试:微服务如何拆分?原则是什么?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、网易的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 微服务如何拆分&#xff1f; 微服务拆分的规范和原则…

行情分析——加密货币市场大盘走势(11.21)

大饼昨日笔者已经离场&#xff0c;目前下跌形态破坏&#xff0c;等待机会再入场&#xff0c;下跌是必然的&#xff0c;只是现在从MACD日线来看是要上涨的&#xff0c;上涨趋势没有打破&#xff0c;等待机会入场。 MACD日线多单策略&#xff1a;入场37500 止盈38000-38600 止损…

MySQL InnoDB 引擎底层解析(二)

6.2.InnoDB 的表空间 表空间是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个页的池…

AC修炼计划(AtCoder Beginner Contest 329)

传送门&#xff1a;&#xff33;&#xff4b;&#xff59; Inc, Programming Contest 2023&#xff08;AtCoder Beginner Contest 329&#xff09; - AtCoder A&#xff0c;B&#xff0c;C&#xff0c;D 这四道题比较简单&#xff0c;就不多叙述。 E - Stamp 这题是一道比较…