机器学习与深度学习——通过奇异值分解算法压缩图片

news2024/10/5 9:14:23

机器学习与深度学习——通过奇异值分解算法压缩图片

什么是奇异值分解?

奇异值分解(Singular Value Decomposition,SVD)是一种重要的线性代数方法,用于将一个矩阵分解成三个部分的乘积形式。它的应用非常广泛,包括数据降维、图像压缩、信号处理等领域。

对于一个 m × n m\times n m×n的实数矩阵 A A A,它的SVD分解可以表示为:

A = U Σ V T A = U \Sigma V^T A=UΣVT

其中, U U U V V V是正交矩阵, Σ \Sigma Σ是一个 m × n m\times n m×n的对角矩阵,且对角线上的元素 σ i \sigma_i σi称为 A A A的奇异值(Singular Value)。具体来说,我们有以下步骤:

  1. 对矩阵 A A T AA^T AAT求特征值和特征向量,得到 A A T = U Σ 2 U T AA^T = U\Sigma^2U^T AAT=UΣ2UT,其中 U U U是由AAT的特征向量组成的正交矩阵,$\Sigma^2$是由AAT的特征值组成的对角矩阵。

  2. 对矩阵 A T A A^TA ATA求特征值和特征向量,得到 A T A = V Σ 2 V T A^TA = V\Sigma^2V^T ATA=VΣ2VT,其中 V V V是由A^T A的特征向量组成的正交矩阵, Σ 2 \Sigma^2 Σ2与上面一步相同。

  3. U U U V V V中的列向量单位化。

  4. Σ \Sigma Σ Σ 2 \sqrt{\Sigma^2} Σ2 的矩阵,即对角线上的元素为 σ i \sigma_i σi,其余为0。

最后得到的 U U U V V V满足 U U T = I UU^T=I UUT=I V V T = I VV^T=I VVT=I,即 U U U V V V是正交矩阵。这样,我们就将一个矩阵分解成了三个部分的乘积形式。更具体地说,我们可以将矩阵 A A A表示为:

A = U Σ V T = ∑ i = 1 r σ i u i v i T A = U \Sigma V^T = \sum_{i=1}^{r}\sigma_iu_iv_i^T A=UΣVT=i=1rσiuiviT

其中 r r r是矩阵 A A A的秩, σ i \sigma_i σi是奇异值, u i u_i ui v i v_i vi分别是左奇异向量和右奇异向量,它们是对应于 σ i \sigma_i σi的特征向量。奇异向量具有非常重要的性质,可以用于数据降维、图像压缩、信号处理等领域。

我们来做一个案列,感受一下奇异值分解算法。

目的

通过奇异值分解进行图片压缩,绘制出压缩后的图片和计算出压缩率

步骤

1、导入所需的库;
2、定义压缩函数 zip_img_by_svd
3、初始化压缩后的图片 zip_img 为全零数组
4、对每个通道进行 SVD 分解并进行归一化处理
5、将压缩后的近似矩阵乘以 255 并转换为 uint8 类型,并将原图像压缩成低维矩阵。
6、展示压缩前后的图像

代码:

#导入所需的库
import numpy as np
import matplotlib.pyplot as plt
#定义压缩函数 zip_img_by_svd ,函数的输入参数为待压缩的图片 img,绘图所需的参数 plotId,以及压缩比率 rate(默认值为 0.8)
def zip_img_by_svd(img, plotId, rate=0.8):
#初始化压缩后的图片 zip_img 为全零数组,并初始化三个变量 u_shape、sigma_shape、vT_shape 为零。u_shape、sigma_shape、vT_shape 分别表示 u、sigma、vT 三个矩阵的形状
    zip_img = np.zeros(img.shape)
    u_shape = 0
    sigma_shape = 0
    vT_shape = 0
#对图片的三个通道进行遍历,并对每个通道进行 SVD 分解。然后通过奇异值数量,创建对应的 SigmaMat 对角矩阵,并将其填充为选取的奇异值。最后将三个矩阵相乘,得到压缩后的近似矩阵。
    for chanel in range(3):  # 3个图层
        u, sigma, v = np.linalg.svd(img[:, :, chanel])  # numpy svd函数
        sigma_i = 0
        temp = 0

        while (temp / np.sum(sigma)) < rate:  # 选取的奇异值和需要达到设定的权重
            temp += sigma[sigma_i]
            sigma_i += 1
        SigmaMat = np.zeros((sigma_i, sigma_i))  # 选取了sigma_i 最大的奇异值
        for i in range(sigma_i):
            SigmaMa
#对压缩后的每个通道进行归一化处理。
    for i in range(3):  # 对三个通道的矩阵数值进行归一化处理
        MAX = np.max(zip_img[:, :, i])
        MIN = np.min(zip_img[:, :, i])
        zip_img[:, :, i] = (zip_img[:, :, i] - MIN) / (MAX - MIN)
#将压缩后的近似矩阵乘以 255 并转换为 uint8 类型,并原图像压缩成低维矩阵。
## 保存压缩后的图片并输出相关压缩信息
plt.imsave("压缩.jpg", zip_img)  # 保存压缩后的图片
    zip_rate = (img.size - 3 * (
            u_shape[0] * u_shape[1] + sigma_shape[0] * sigma_shape[1] + vT_shape[0] * vT_shape[1])) / (zip_img.size)

    f = plt.subplot(3, 3, plotId)
    f.imshow(zip_img)
    f.set_title("SVD压缩率 %.4f,奇异值数量:%d" % (zip_rate, sigma_i))

    print("设置的压缩率:", rate)
    print("使用的奇异值数量:", sigma_i)
    print("原始图片大小:
#展示压缩前后的图像
if __name__ == '__main__':
    imgfile = "1.jpg"
    plt.figure(figsize=(12, 12))
    plt.rcParams['font.sans-serif'] = 'SimHei'  # 消除中文乱码
    img = plt.imread(imgfile)
    f1 = plt.subplot(331)  # 绘制子图,3行3列,3*3个子图,现在画第1幅
    f1.imshow(img)
    f1.set_title("原始图片")
    for i in range(8):  # 再画8个子图
        rate = (i + 1) / 10.0  # 压缩率 10% - 80%
        zip_img_by_svd(img, i + 2, rate)

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
该代码主要分为两个部分:

zip_img_by_svd函数
这个函数接收待压缩的图片img,绘图所需的参数plotId以及压缩比率rate,然后对图片的三个通道进行遍历,并对每个通道进行奇异值分解(SVD)。然后通过设定的奇异值数量创建对应的SigmaMat对角矩阵,并将其填充为选取的奇异值。最后将三个矩阵相乘,得到压缩后的近似矩阵。

主函数
这个主函数首先读取指定路径下的原始图片,然后使用zip_img_by_svd函数对图片进行压缩,并展示压缩前后的图像。压缩率从10%变化到80%。

Σ是一个m×n的奇异值矩阵,对角线上的元素称为奇异值。SVD的一个重要应用是数据降维,即将高维数据压缩成低维数据,同时保留尽可能多的信息。在这个过程中,可以选择只保留最大的k个奇异值,从而得到一个k维的低维表示。

奇异值算法(Singular Value Algorithm,简称SVA)是一种用于求解矩阵特征值和特征向量的迭代算法。它的主要优点和缺点如下:

优点:

  1. 简单易实现:奇异值算法的实现相对简单,计算量较小,适用于小规模矩阵的求解。
  2. 收敛速度快:奇异值算法具有较快的收敛速度,特别是对于较大的矩阵,收敛性能较好。
  3. 在线性代数理论支持:奇异值算法是基于线性代数理论的,因此在理论上具有较好的保证。

缺点:

  1. 不保证唯一解:虽然奇异值算法具有收敛性,但并不保证一定能找到唯一的解。如果存在多个特征值相等的情况,需要通过其他方法进行处理。
  2. 数值稳定性问题:奇异值算法在处理某些特殊矩阵时可能存在数值稳定性问题,如退化现象、奇异值爆炸等。
  3. 对于稀疏矩阵的处理能力有限:奇异值算法主要适用于稠密矩阵的求解,对于稀疏矩阵的处理能力有限。

总之,奇异值算法是一种简单有效的求解矩阵特征值和特征向量的算法,但在实际应用中需要注意其局限性。

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

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

相关文章

Leecode98

leecode98 验证二叉搜索树 给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征&#xff1a; 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 &#x1…

【Linux】shell编程—Here Document免交互

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、免交互概述二、免交互常规用法1.read 命令的读取2.wc -l 的内容行数统计3.passwd用户密码的修改4.cat 查看内容并输出到文件中5.cat 查看交互内容并输出到新的文…

Spring传播机制(七种)

一、概述 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。Propagation枚举则引用了这些类型&#xff0c;开发过程中我们一般直接用Propagation枚举。 1.1 Propagation源码 public enum Propagation {REQUIRED(0),SUPPORTS(1),MANDATORY(2),REQUIRES_NEW(…

redis源码浅析-ziplist实现

redis中的list是有多种实现的&#xff0c;其中一种是ziplist&#xff0c;其介绍如下 ziplist 是一个经过特殊编码的双向链表&#xff0c;旨在提高内存效率。 它存储字符串和整数值&#xff0c;其中整数被编码为实际整数而不是一系列字符。 它允许在 O(1) 时间内在列表的任一侧进…

戴尔 Dell Latitude E7480电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板戴尔 Dell Latitude E7480 处理器Intel Core i7-7700U已驱动 内存8GB 2133MHz DDR4 * 2已驱动 硬盘Sandisk 1T M.2 NVMe SSD已驱动 显…

windows解决python安装django架构没有django-admin命令

目录 一.尝试安装与配置 1.直接pip命令安装 2.用pycharm测试 3.官网下包安装 二.解决 1.找到django安装的路径 2.配置系统变量 3.测试创建项目 3.1.执行访问页面 3.2.解决 3.3.继续测试 4.pycharm打开 一.尝试安装与配置 1.直接pip命令安装 pip install django dja…

chatgpt赋能Python-python_7

Python 7 - 探索最受欢迎的Python版本 如果你是一位Python开发人员&#xff0c;你就会知道Python 7是什么。Python 7是Python编程语言的第7个主要版本&#xff0c;它带来了许多新的功能和改进&#xff0c;包括内置类型注释、上下文变量、字节码优化和更多。 在本文中&#xf…

度小满科技金融迭代:普惠小微与技术创新并肩而行

2015年&#xff0c;深度贫困乡镇隘口镇推出“本土人才”政策,呼吁大学生人才下基层,助力乡村经济振兴工作。 叶茂的人生轨迹因此而发生改变。彼时&#xff0c;20多岁的叶茂果断辞去药材公司的高薪工作&#xff0c;开始了回乡种植黄精的创业路&#xff0c;并成功竞选东坪村村主任…

log4cpp的安装(vs/visual studio版)

log4cpp安装下载源visual studio安装方法 log4cpp安装 下载源 log4cpp visual studio安装方法 将下载好的压缩包解压缩后得到下列目录&#xff08;解压缩的文件夹最好放C盘&#xff0c;不然在编译阶段往往会出现链接不上的问题&#xff09; 找到mscv10文件夹内的mscv10.sl…

【概念篇】浅谈 AOP、OOP、DDD、IOC

前言 在招聘要求中&#xff0c;有没有经常看见&#xff0c;对AOP、OOP、DDD、IOC有一定的认识&#xff0c;能够自主开发模块&#xff0c;这一类的要求。听起来是不是挺高大上&#xff0c;然后百度一搜&#xff0c;给你出来一堆概念性的东西——结果就是&#xff0c;东西…

《LKD3粗读笔记》(14)块I/O层

什么是块设备&#xff1f; 系统中能够随机访问固定大小数据片的设备被称为块设备&#xff0c;这些数据片称作块&#xff0c;最常见的块设备是硬盘。什么是字符设备&#xff1f; 字符设备按照字符流的方法被有序访问&#xff0c;像串口和键盘就都属于字符设备。这两种设备的区别…

从零开始搭建 Lsky Pro 兰空图床

本文源码&#xff1a;https://github.com/chen2438/chenhaotian.top/tree/main/source/_posts/linux-app/lsky.md 在我的博客上查看&#xff1a;https://chenhaotian.top/2022/12/30/linux-app/lsky/ 从零开始搭建 Lsky Pro 兰空图床 官方教程 安装环境 使用OneinStack安装…

第五章 面向对象-8.enum 枚举

enum 枚举 枚举的实例对象是固定的&#xff0c;实例是自动new&#xff0c;每个枚举类会自动继承java.lang.Enum 抽象类 如何声明枚举&#xff1f; 所有枚举类都是java.lang.Enum的子类&#xff0c;无需用extends来继承&#xff0c;如下是枚举类拥有的常用方法 方法名称说明…

测试报告框架 —— Allure2测试报告

目录 Allure2测试报告 1、使用 Allure2 运行方式-Python 2、使用 Allure2 运行方式-Java 3、生成测试报告 4、Allure2 报告中添加用例标题 5、allure2报告中添加用例步骤 6、allure2报告中添加用例链接 7、allure2报告中添加用例分类 8、Allure2 报告中添加用例描述 …

【面试题】前端必修-浏览器的渲染原理

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 1.浏览器的渲染原理 #浏览器是如何渲染页面的 1.什么叫渲染 render 当我们输入一个url地址的…

新书上市 | 从大脑认知开始,全方面提高编程能力,助你摆脱“GPT焦虑症”

目录 一、ChatGPT火爆全网二、《程序员超强大脑》三、本书内容四、本书特色五、作译者简介1、费莉安赫尔曼斯&#xff08;Felienne Hermans&#xff09;2、蒋楠 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xff0c;49天精通Java从入门到就业。 全网最细Java零…

程序人生-Hello’s P2P

摘要 本文讨论了与编程和软件开发相关的几个关键概念和过程。首先介绍了链接的概念和作用&#xff0c;它是将代码和数据片段组合成单一文件的过程&#xff0c;使得分离编译成为可能&#xff0c;从而可以更好地管理和修改模块。接下来探讨了进程的概念和作用&#xff0c;进程是正…

图像数据处理

文章目录 1&#xff1a;TFRecords1-1 将MNIST数据集转换成TFRecord格式1-2 读取TFRecord文件中的数据 2&#xff1a;图像数据的预处理2-1 处理图像编码2-2 调整图像大小2-3 剪裁和填充2-4 按比例剪裁2-5 图像翻转2-6 图像亮度调整2-7 图像对比度调整2-8 图像色相调整2-9 图像饱…

chatgpt赋能Python-python_99乘法

Python编程实现——99乘法表的生成 Python编程语言是一种高级程序设计语言&#xff0c;具有简单易学、可移植性强、功能强大等特点&#xff0c;受到广大开发者的喜爱。Python可以被应用于网站开发、数据分析、人工智能、机器学习等多个领域。而在Python编程中&#xff0c;生成…

《程序员面试金典(第6版)》面试题 02.06. 回文链表(双指针(快慢指针),查找链表中间节点,反转链表)

题目描述 编写一个函数&#xff0c;检查输入的链表是否是回文的。 题目传送门~&#xff1a;面试题 02.06. 回文链表 示例 1&#xff1a; 输入&#xff1a; 1->2 输出&#xff1a; false 示例 2&#xff1a; 输入&#xff1a; 1->2->2->1 输出&#xff1a; true 进…