奇异值分解在图形压缩中的应用

奇异值分解在图形压缩中的应用


在研究奇异值分解的工程应用之前,我们得明白什么是奇异值?什么是奇异向量?

奇异值与奇异向量

概念:奇异值描述了矩阵在一组特定向量上的行为,奇异向量描述了其最大的作用方向。

奇异值分解(SVD)

矩阵A的分解涉及一个 m × n m \times n m×n的矩阵 Σ \Sigma Σ,其中 Σ \Sigma Σ= [ D 0 0 0 ] \begin{bmatrix} D &0\\0&0\end{bmatrix} [D000],D是一个 r × r r\times r r×r的方阵 ( r ≤ m , r ≤ n ) ( r \leq m , r\leq n) (rm,rn)

定理:设A是秩为 r r r m × n m\times n m×n的矩阵,那么存在一个类似于 Σ \Sigma Σ的矩阵,其中 D D D的对角线元素是 A A A的前 r r r个奇异值, σ 1 ≥ σ 2 ≥ σ 3 ≥ . . . ≥ σ r > 0 \sigma_1 \geq\sigma_2 \geq\sigma_3 \geq... \geq\sigma_r>0 σ1σ2σ3...σr>0并且存在一个 m × m m\times m m×m的正交矩阵 U U U 和一个 n × n n\times n n×n的正交矩阵 V T V^T VT使得 A = U Σ V T A=U\Sigma V^T A=UΣVT

奇异值分解计算过程

我们先假设一个矩阵 A = [ 2 3   0 2 ] A = \begin{bmatrix} 2 & 3 \\ \ 0 & 2\end{bmatrix} A=[2 032]
U = [ u 1 u 2 u 3 . . . ] U=[u_1 u_2 u_3 ...] U=[u1u2u3...] , ∑ = d i a g [ σ 1 σ 2 σ 3 . . . ] \sum = diag[\sigma_1 \sigma_2 \sigma_3 ...] =diag[σ1σ2σ3...] , V = [ v 1 v 2 v 3 . . . ] T V=\begin{bmatrix} v_1 \\ v_2\\ v_3 \\ ...\end{bmatrix}^T V= v1v2v3... T
其中 U U U代表A的正交矩阵; ∑ \sum 代表A的由奇异值组成的左奇异向量矩阵; V V V代表A的右奇异向量矩阵。

求A的 U , ∑ , V U , \sum , V U,,V.

  1. 计算 A T A A^TA ATA
    A T A = [ 2 3 0 2 ] [ 2 0 3 2 ] = [ 13 6 6 4 ] A^TA = \begin{bmatrix} 2&3\\0&2\end{bmatrix}\begin{bmatrix} 2&0\\3&2 \end{bmatrix} = \begin{bmatrix} 13&6\\6&4 \end{bmatrix} ATA=[2032][2302]=[13664]
  2. 计算 A T A A^TA ATA的奇异值 σ \sigma σ
    σ 1 2 σ 2 2 = d e t A T A = 16 σ 1 2 + σ 2 2 = t r A T A = 17 ∴ σ 1 2 = 16 , σ 2 2 = 1 ∴ σ 1 = 4 , σ 2 = 1 ∴ Σ = [ 4 0 0 1 ] \sigma_1^2\sigma_2^2 = det A^TA = 16 \\ \sigma_1^2 + \sigma_2^2 = tr A^TA = 17 \\ \therefore \sigma_1^2 =16, \sigma_2^2= 1\\ \therefore \sigma_1 =4, \sigma_2= 1\\ \therefore \Sigma=\begin{bmatrix} 4&0\\0&1 \end{bmatrix} σ12σ22=detATA=16σ12+σ22=trATA=17σ12=16,σ22=1σ1=4,σ2=1Σ=[4001]
  3. σ 1 , σ 2 \sigma_1,\sigma_2 σ1,σ2带入 A T A A^TA ATA中求其特征向量
    v 1 = [ 1 5 2 5 ] , v 2 = [ − 2 5 1 5 ] ∴ V = [ 1 5 − 2 5 2 5 1 5 ] \\ v_1= \begin{bmatrix} \frac{1}{\sqrt5} \\\\ \frac{2}{\sqrt5} \end{bmatrix} , v_2= \begin{bmatrix} -\frac{2}{\sqrt5}\\\\\frac{1}{\sqrt5} \end{bmatrix} \\\therefore V= \begin{bmatrix} \frac{1}{\sqrt5}&-\frac{2}{\sqrt5} \\\\ \frac{2}{\sqrt5}&\frac{1}{\sqrt5}\end{bmatrix} v1= 5 15 2 ,v2= 5 25 1 V= 5 15 25 25 1
  4. 构造标准正交向量
    u i = 1 σ i A v i ∴ u 1 = 1 σ 1 A v 1 = 1 4 [ 2 3 0 2 ] [ 1 5 2 5 ] = [ 2 5 1 5 ] ∴ u 2 = 1 σ 2 A v 2 = 1 1 [ 2 3 0 2 ] [ − 2 5 1 5 ] = [ − 1 5 2 5 ] ∴ U = ( u 1 , u 2 ) = [ 2 5 − 1 5 1 5 2 5 ] u_i=\frac{1}{\sigma_i}Av_i \\ \therefore u_1=\frac{1}{\sigma_1}Av_1=\frac{1}{4}\begin{bmatrix} 2&3\\\\0&2\end {bmatrix} \begin{bmatrix} \frac{1}{\sqrt5} \\\\ \frac{2}{\sqrt5} \end{bmatrix} =\begin{bmatrix} \frac{2}{\sqrt5}\\ \\ \frac{1}{\sqrt5} \end {bmatrix} \\ \therefore u_2=\frac{1}{\sigma_2}Av_2=\frac{1}{1}\begin{bmatrix} 2&3\\\\0&2\end {bmatrix} \begin{bmatrix} - \frac{2}{\sqrt5} \\\\ \frac{1}{\sqrt5} \end{bmatrix} =\begin{bmatrix} -\frac{1}{\sqrt5}\\ \\ \frac{2}{\sqrt5} \end {bmatrix} \\ \therefore U=(u_1,u_2)=\begin{bmatrix} \frac{2}{\sqrt5} & -\frac{1}{\sqrt5} \\ \\ \frac{1}{\sqrt5} &\frac{2}{\sqrt5} \end{bmatrix} ui=σi1Aviu1=σ11Av1=41 2032 5 15 2 = 5 25 1 u2=σ21Av2=11 2032 5 25 1 = 5 15 2 U=(u1,u2)= 5 25 15 15 2
  5. 写出表达式
    A = U Σ V T = [ 2 5 − 1 5 1 5 2 5 ] [ 4 0   0 1 ] [ 1 5 2 5 − 2 5 1 5 ] A=U\Sigma V^T=\begin{bmatrix} \frac{2}{\sqrt5} & -\frac{1}{\sqrt5} \\ \\ \frac{1}{\sqrt5} &\frac{2}{\sqrt5} \end{bmatrix} \begin{bmatrix} 4 & 0 \\\\ \ 0 & 1\end{bmatrix} \begin{bmatrix} \frac{1}{\sqrt5}& \frac{2}{\sqrt5}\\\\ -\frac{2}{\sqrt5}&\frac{1}{\sqrt5}\end{bmatrix} A=UΣVT= 5 25 15 15 2 4 001 5 15 25 25 1

利用奇异值分解(SVD)进行图片压缩

首先我们先找一张图片来进行实验。
请添加图片描述

通道分离

对于JPG格式的彩色图片,拥有3个颜色通道,R(红)、G(绿)、B(蓝),那么可以尝试将每个颜色通道进行分离,产生3个形状均为图像高 x 宽 的单通道剧展,即imageR,imageG,imageB。

进行通道分离,将imageArray数组中的每个通道分别单独取出来,得到3个高 × \times × 宽的二维数组。这3个二维数组中每个位置上的取值就是对应像素的某个颜色通道的取值,代码如下:

import numpy as np
from PIL import Image
 
originalImage = Image.open(r'teriri.jpg', 'r')
imageArray = np.array(originalImage)
R = imageArray[:, :, 0]
G = imageArray[:, :, 1]
B = imageArray[:, :, 2]
print(R)
print(G)
print(B)

运行结果如下:

[[207 207 207 … 141 141 141]
[207 207 207 … 141 141 141]
[207 207 207 … 141 141 141]

[246 247 248 … 239 239 239]
[246 247 248 … 239 239 239]
[246 247 248 … 239 239 239]]
[[198 198 198 … 126 126 126]
[198 198 198 … 126 126 126]
[198 198 198 … 126 126 126]

[233 234 235 … 235 235 235]
[233 234 235 … 235 235 235]
[233 234 235 … 235 235 235]]
[[215 215 215 … 149 147 147]
[215 215 215 … 149 147 147]
[215 215 215 … 149 147 147]

[230 231 233 … 203 203 203]
[230 231 233 … 203 203 203]
[230 231 233 … 203 203 203]]

至此,我们成功得到了3个二维ndarray数组,将R、G、B三个通道成功进行了分离。

矩阵压缩

对每个单通道矩阵进行奇异值分解,按照压缩的实际需要取前k个奇异值,进行3个单通道的矩阵的压缩,最后分别形成3个压缩后的矩阵:imageRC,imageGC,imageBC,代码如下:

def imgCompress(channel,percent):
    U,sigma,V_T = np.linalg.svd(channel)
    m = U.shape[0]
    n = V_T.shape[0]
    reChannel = np.zeros((m,n))
    for k in range (len(sigma)):
        reChannel = reChannel + sigma[k] * np.dot(U[:,k].reshape(m,1),V_T[k,:].reshape(1,n))
        if float(k) / len(sigma) > percent:
            reChannel[reChannel < 0] = 0
            reChannel[reChannel > 255] = 255
            break
        return np.rint(reChannel).astype("unit8")

图像重建

将经过奇异值分解处理的3个单通道矩阵合并,从而重构出压缩后的彩色图像。

    for p in [0.001, 0.005, 0.01, 0.02, 0.03, 0.04, 0.05, 
              0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]:
    #p表示取所有奇异值的前多少比例
        reR = imgCompress(R,p)
        reG = imgCompress(G,p)
        reB = imgCompress(B,p)
        reI = np.stack((reR,reG,reB),2)
        Image.fromarray(reI).save("{}".format(p)+"img.png")

整体运行结果如下:

比例为0.001至0.04
在这里插入图片描述>0.05至0.5
在这里插入图片描述
0.6至原图
在这里插入图片描述
总结:

  1. 取前0.1%奇异值重建的图像是一个非常模糊的,基本只能看到大体轮廓。
  2. 取前1%奇异值重建的图像就可以看到一个比较清晰的图片了。
  3. 随着比例的提升,图片越来越清晰,到30%的时候就基本与原图一致了。

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

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

相关文章

【Redis】Redis分布式锁

引入 首先看下面这段代码&#xff1a; 这是一段抢券代码&#xff0c;看着没什么问题&#xff0c;但是当是多线程情况下&#xff0c;那么就可能出现并发问题&#xff0c;出现超卖。为了解决这个问题&#xff0c;我们可能会加锁&#xff0c;那么接下来看加锁后的代码&#xff…

推荐5款大佬都在用的开源项目!PDF处理、AI换脸、声音克隆等!

GitHub圈选 项目推荐&#xff1a; Stirling-PDF&#xff08;PDF处理工具&#xff09; Rope&#xff08;AI换脸工具&#xff09; clone-voice&#xff08;声音克隆工具&#xff09; N_m3u8DL-RE&#xff08;流媒体下载器&#xff09; toBeBetterJavaer&#xff08;Java学习指…

自动化测试框架—数据驱动

什么是数据驱动&#xff1f; 数据驱动是主流的自动化测试设计模式&#xff0c;测试数据和测试代码分离&#xff0c;测试数据存储在外部文件中&#xff0c;如 excel、json、yaml等文件&#xff0c;也可以存在数据库中。同一个测试方法&#xff0c;可以多个自动化测试 case。 数…

【PDF密码】PDF文件为什么无法修改?为什么PDF文档不支持编辑?

pdf文件大家应该都经常接触&#xff0c;但是不知道大家会遇到这种情况&#xff1a;有些PDF文件打开之后无法编辑&#xff1f;是什么原因呢&#xff1f;今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下&#xff0c;PDF文件中的内容是否是图片&#xff0c;如果确认…

螺纹钢负公差轧制中的测径仪应用

1、负公差轧制意义 为了满足生产使用要求&#xff0c;并根据轧制水平&#xff0c;在产品标准冲规定钢材尺寸的波动范围&#xff0c;允许钢材的实际尺寸与公称尺之间有一定的偏差&#xff0c;这个偏差一般称公差&#xff0c;公差分正、负公差&#xff0c;钢材按负公差轧制时&…

untiy使用http下载资源

文章目录 提醒下载一个资源并保存到本地下载一张图片 提醒 部分API需要将Unity的 Edit/PrejectSetting/Player/OtherSetttings/AConfiguration/ApiCompatibilityLevel 设为.NetFramework 才可以使用 下载一个资源并保存到本地 private IEnumerator DownloadFormServer_IE(st…

python爬虫实战(7)--获取it某家热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求榜单 def fetch_ranking_data():url "https://m.xxx.com/rankm/" #某家response requests.get(url)if response.status_code 200:return response.contentelse:print(f…

解决python画图无法显示中文的问题

python画图遇到的问题&#xff1a; 中文不显示&#xff1a; 解决方法&#xff1a;把字体设置为支持中文的字体&#xff0c;比如黑体 黑体下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BD7zQEBUfcIs6mC2CPYy6A?pwdv120 提取码&#xff1a;v120 pyhon…

“双碳”目标下绿色节能数据中心的节能降耗之路

随着数字经济的发展和国家东数西算工程的推进&#xff0c;数据中心行业也在快速发展。数字时代&#xff0c;算力是重要支撑,数据中心作为算力网络的底座为数字经济的发展起到支撑的作用&#xff0c;同时作为能耗最多的行业之一&#xff0c;在国家“双碳”战略下&#xff0c;如何…

国产服务器 BIOS下组建RADI不同RAID卡-超详细

国产服务器 长城 组建Raid的方法 说明 大多数国产服务器通用型服务器进入BIOS的都是按DEL键。 9361RAID卡组建方法 在服务器启动过程中&#xff0c;按下DEL键进入BIOS界面。 进入设备管理器&#xff0c;选择AVAGO MegaRAID页签。 3. 进入RAID卡设备&#xff0c;选择Main Me…

【数字人】9、DiffTalk | 使用扩散模型基于 audio-driven+对应人物视频 合成说话头(CVPR2023)

论文&#xff1a;DiffTalk: Crafting Diffusion Models for Generalized Audio-Driven Portraits Animation 代码&#xff1a;https://sstzal.github.io/DiffTalk/ 出处&#xff1a;CVPR2023 特点&#xff1a;需要音频对应人物的视频来合成新的说话头视频&#xff0c;嘴部抖…

Mysql——索引相关的数据结构

索引 引入 我们知道&#xff0c;数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快&#xff0c;因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找&#xff08;linear search&#xff09;&#xff0c;这种复杂度为…

缓存代理服务器

1 缓存代理 1.1 缓存代理的概述 web代理的作用 缓存网页对象&#xff0c;减少重复请求 存储一些之前被访问的或且可能将要备再次访问的静态网页资源对象&#xff0c;使用户可以直接从缓存代理服务器获取资源&#xff0c;从而减少上游原始服务器的负载压力&#xff0c;加快整…

android自定义时间选择

自定义时间选择器&#xff0c;可以更改到年月日&#xff0c;时分秒 一、自定义DatePicker public class CustomDatePicker {/*** 定义结果回调接口*/public interface ResultHandler {void handle(String time);}public enum SCROLL_TYPE {HOUR(1),MINUTE(2);SCROLL_TYPE(int …

【动态规划】【 数学】C++算法:514自由之路

作者推荐 【动态规划】458:可怜的小猪 涉及知识点 动态规划 数学 力扣514 自由之路 电子游戏“辐射4”中&#xff0c;任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘&#xff0c;并使用表盘拼写特定关键词才能开门。 给定一个字符串 ring &#x…

PyCharm安装使用教程2024

简介 PyCharm是一种PythonIDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…

【C++期末】酒店住宿信息管理系统(含easyX)

诚接计算机专业编程作业(C语言、C、Python、Java、HTML、JavaScript、Vue等)&#xff0c;如有需要请私信我&#xff0c;或者加我的企鹅号&#xff1a;1404293476 本文资源&#xff1a;https://download.csdn.net/download/weixin_47040861/88725363 目录 1.题目要求 2.实现效…

Spring Security介绍

一、Spring Security&#xff1a; 1、简介&#xff1a;Spring Security 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。一般来说&#xff0c;Web 应用的安全性包括用户认证&#xff08;A…

从吸引外资连续三年高增长看中国IT云计算科技行业的发展

​引言&#xff1a;开放合作共发展,砥砺前行迎未来 【科技明说 &#xff5c; 科技热点关注】 我今天刚注意到商务部公布的最新数据&#xff0c;2019年至2021年&#xff0c;中国吸引外资实现连续三年高增长。 2022年前11个月实际使用外资金额11560.9亿元&#xff0c;为历史同期…

【开源】基于JAVA的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…