图像压缩原理-JPEG

news2024/9/29 7:27:08

搬来一个基础啊 给自己看~~ 非技术指正勿扰 

图像的格式有很多种,比如PNG,JPEG等等,但当我们把一张图用工具变成各种其他格式时,其在计算机文件系统显示的文件大小各不一样,但是当你打开显示时,从视觉角度上看,几乎看不出差距。这其中涉及到的领域被称为图像压缩技术。常用的技术包括:颜色空间转换(RGB→YCrCb)和DCT 2D变换。

从事各行各业的大佬们,我相信,你们对图像格式是不陌生的,有很多种图像格式,比如,png,jpeg等等,但是你发现,同一张图片,当我们把他用工具变成各种其他格式时,其在计算机文件系统显示的文件大小各不一样,但是当你打开显示时,从视觉角度上看,几乎看不出差距。那为什么现实的文件大小不一样,但是带给我们的视觉感受确实几乎一样的呢,这里面就涉及到一个领域:数据压缩,具体到图像这块称之为图像压缩技术。今天,我就来给大家简单讲讲我们常用的JPEG压缩原理技术。

我们知道,常见的图像是由RGB格式组成,图像上的每个像素值分别由R(8bit)G(8bit)B(8bit)表示,如下图所示:

下面展示的是一张2592x1944(所谓的2K分辨率)图像,在没有经过任何压缩和利用JPEG技术后的文件大小:

压缩前大约15M,压缩后大约只有0.8M。

压缩技术一:颜色空间转换  

研究人员通过大量实验证明,人类视觉系统对亮度的更敏感,而对颜色没那么敏感,如下图所示,A和B其实是一种颜色。

因此,我们可以将图像从RGB→YCrCb空间(Y:亮度,Cb:蓝色色度,Cr:红色色度),缩减Cr和Cb分量的采样数,而对于亮度Y,则保留0~255等级,这个技术就叫做色度下采样,更常见的称呼是色度抽样。

 

未对Cr和Cb进行下采样

 

对Cr和Cb进行下采样

我们来具体看看一个例子,下图是一副8x8的图,将其YCrCb单独分离出来:

 

YCrCb空间

然后我们分别对Cr和Cb进行下采样操作(2X2窗口滑动,取左上角元素):

对Cr进行下采样,Cb也进行同样的操作

最终得到如下:

下采样的YCrCb空间

然后合并得到: 

 未进行下采样和进行下采样的图

上述过程进行对图像进行色彩下采样操作,再来看看对于2k的图,进行色彩下采样操作后的前后对比:

原图像(未经压缩)和被压缩后的图像

通过上述操作,我们可以看出,相对于原图,我们压缩了50%的存储空间:

图像数据在压缩了接近50%之后,对于人类视觉系统而言,也几乎没有什么差距,但是JPEG压缩技术可以做到接近95%的压缩,那还能从哪些地方进行数据压缩呢?

压缩技术二:DCT 2D变换  

从信号处理角度看,数字图像其本身就是一种信号,那可不可以从这个角度剖析图像自身蕴含的信号,进一步抽取我们尽可能需要保留的信息,而去除一些无关紧要的其他信息呢?答案是肯定的。首先我们抽取图像的一行,

 图像的一行所蕴含的信号图像

通过大量的视觉实验,我们知道,人类视觉对高频信息并不那么敏感:

人类视觉对高频信息并不敏感

可以利用信号处理领域的相关手段,分析出图像中高低频信息含量,并通过一定手段筛选出我们需要的信息。此时,一个重要的方法排上了用场,DCT(离散余弦变换),在冈萨雷斯的《数字图像处理》书中,有详细的推理,这里简述一下精髓:一切信号都可以用若干不同频率的标准余弦信号通过特定的组合形式表示出来。考虑下面一个只有8个像素的单行图像:

cos(x)

从上面可以看出,对于y0~y7,这8个离散值从标准的cos(x)函数上采样获取。也就是说,对于y来说,其可以只用一个cos(x)就能完全表达,因此,通过DCT变换后,在幅频图上,对于cos(x)的那个系数X1=1,而其他X0, X2, ....., X7则为0(X0~X7分别代表从低频信号(比如cos(x))到高频信号(比如cos(7x))的系数),同理有,当y0~y7服从cos(2x)时,其经过DCT变换后,其X2=1,下图是将y值在0~255范围空间进行转换到-128~128空间。 

cos(2x)

类似的有,对于y0~y7从cos(3x)进行下采样操作,对应的DCT变换后的的幅频图。

cos(3x)

因此,经过上述分析,就有:cos(kx) 与Xk一一对应的关系:

cos(kx)

枚举所有情况,如下所示:

因此,我们也可以得到:8个像素值的所有组合,均可以表示为该8个余弦函数的总和。这里我们分析一下,对于任意的8个像素值组合,其对应的下面的DCT变换如下,其Xk求解形式如下: 

将其写成向量形式有: 

更进一步有:

 

需要注意的是,DCT变化是可逆的,对应如下图所示:

 

我们将Inrerse DCT拆开写,更清楚的显示任意信号和对应的标准余弦信号组合关系: 

接下来,我们从图像中,任意扣取一个8x8的区域进行分析,此时,一维的DCT变换也随之拓展到二维:

 

DCT 2D变换

由于DCT具有可逆性,也就是说,根据DCT 2D得到的变换矩阵,我们可以完整反推出对应的像素值,我们可以把64个系数从低频到高频依次加入,其图像的变换情况:

从上述变换可以看出,后面添加的一些高频信息,对图像的整体改变并没有变多少,这是发生一些非常细微上的表现,然而,我们人类视觉系统对这些改变并不敏感。

在 JPEG 算法中,图像被分为了 8*8 的像素组,每个像素组用自己的离散余弦变化进行频域编码。为什么选用 8*8 的像素组。采用比 8*8 更大的像素组,会大幅增加 DCT 的运算量,且编码质量也不会明显提升;采用比 8*8 更小的像素组会导致分组增多降低精度。所以8*8 的像素组是效率最优的结果。对每个像素组组,我们都用上述DCT进行变换。

下面演示不断添加频率个数,图像恢复情况:


当系数为0时,恢复出来一片白板;只用一个系数时,图像大体轮廓已出现;加入8个频率时,图像基本上恢复出原样;加入16个频率时,图像越来越清楚。随着后续高频不断加入,图像并没有多大改变,此时,我们就可以丢弃DCT的高频分量了。

具体怎么丢弃呢?研究人员通过大量的视觉实验,最终定义出一个量化表格(Quantization Table),如下所示:

Quantization Table

将DCT 2D变换得到表格(上面Encoding中左边)与量化表格进行逐元素触发,得到右边蓝色表格,可以发现,变成一个稀疏矩阵,同时,也注意到一个事情,如下图所示,DCT 2D得到的系数矩阵,其左上角最大,低频信息集中在左上角区域,而高频部分则集中在右下角部分(低频信息,对应的DCT系数矩阵其能量系数也大)。这个性质其实可以从DCT 2D的推理过程可以得到。在上述经过量化后的系数矩阵中,右下部分出现大量的0,也就意味着,该信号可以被舍弃。注意,舍弃高频信息的过程就是量化过程,这里会出现信息损失。


JPEG压缩技术规定了不同quality factor下的量化值,QF越大,量化表格里的数值就越小,其损失也就越小,同时,结合人眼对色彩的敏感要低于亮度,因此,对于Y和CrCb,定义了不同的量化系数。

为了进一步对数据进行压缩,我们对经过量化后的稀疏矩阵进一步分析,采用游程编码(ZigZag)和霍夫曼编码组合手段,进一步减少信息存储,如下图所示:

ZigZag游程编码+Huffman编码

最后,对压缩信息进行huffman编码处理,如下图所示:

ZigZag游程编码+Huffman编码

上述整个过程中,就是JPEG图像压缩原理,整个过程清晰明朗,一气呵成,希望能帮助到各位。    whaosoft aiot http://143ai.com

总结  

JPEG图像压缩技术原理其核心技术包括以下两个方面:

RGB to YCrCb:利用人类视觉系统对色彩的不敏感特性,对Cr和Cb下采样;

 DCT 2D变换:利用人类视觉系统对高频的不敏感特性,舍弃部分高频信息,采用游程编码和Huffman编码技术,进一步减少数据冗余。

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

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

相关文章

Android进阶之路 - Json解析异常

在App与H5交互时,有一个调原生分享的需求,交互方面没有问题,因为分享需要多值,所以采用json进行传递,在app接收进行解析时遇到了这个解析异常 Value  of type java.lang.String cannot be converted to JS…

【操作系统一】图解TCP/IP模型+实战

【操作系统一】OSI模型和TCP/IP模型一、OSI模型1、什么是OSI模型2、osi七层参考模型3、我更想介绍TCP/IP模型二、TCP/IP模型1、TCP/IP模型起源2、TCP/IP模型是五层还是四层?3、两层TCP/IP模型4、传输层(也叫传输控制层)4.1 TCP4.3、三次握手4…

【算法面试题汇总】LeetBook列表的算法面试题汇总---动态规划题目及答案

整理不易留个小心心呗🥰 如果有更好的或者是我有错的地方还请各位大佬指出哦 有些是copy的还望不要介意 动态规划至少有k个重复字符的最长子串二叉树中的最大路径和最长连续序列打家劫舍完全平方数最长上升子序列*零钱兑换矩阵中的最长递增路径至少有k个重复字符的最…

java计算机毕业设计ssm民宿管理系统设计7lky4(附源码、数据库)

java计算机毕业设计ssm民宿管理系统设计7lky4(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Linux服务器上Neo4j的安装、迁移

目录 1、环境 2、下载 3、修改配置 4、启动及其他命令 5、客户端访问: 6、数据迁移 1、环境 Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。 neo4j版本:neo4j-community-3.5.6 2、下…

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务,让学生可以在 100 USD的金额下,自行练习所要使用的 AWS 服务,如何进入 Learner Lab 请参考 使用 Learner Lab …

第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)

第十三章 DFS与BFS一、深度优先搜索1、什么是DFS?2、DFS代码模板(1)问题:(2)分析:(3)模板:3、DFS代码分析二、广度优先搜索1、什么是BFS?2、BFS代…

就是把一个数组中相同类别数据,组成新的数组

效果图如上,就是把一个数组中相同类别数据,组成新的数组,每个数组最后加一个空对象,对象对应的格式要做些许改变 分店 品牌 业绩(元) 订单个数 单值(元) {{item.shopname}} {{item.shopname}} {{item.shopname}} {{item.shopname}…

《InnoDB引擎九》InnoDB关键特性-自适应哈希索引

InnoDB 关键特性 InnoDB存储引擎的关键特性包括: Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 自适应哈…

猿如意开发工具|emeditor

写在前面 昨天升了下系统,可以下载了,我就试了试 正文 在客户端里搜索我所需要的工具,就可以搜出来 这里我已经下好了,直接点开文件就好了 再点开文件 点击下一步,接下来还有几个步骤,都点下一步就可以了…

【HBuilder X】解决HBuilder X内置浏览器显示过大影响使用

1- 前言 不知道宝子们有没有遇到过这种情况,小媛发现自己的内置浏览器过大,很大,很丑,占了半个屏幕,像下图那样。 也试了几种方法,比如: 看自己的版本不是最新,或者和其他人的不一样…

嫁给程序员老公,我后悔了

01 在我还没长开的时候,就常听人说,有两种男人不能嫁:一种是兵哥哥,另一种是程序员。前者见不着,后者死的早。 一想到不等头发花白,就要踟蹰独行,我就害怕的厉害。所以,很长一段时…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教室管理系统9y8cv

相信很多和我一样的同学,因为实习,因为考研和考公等等,来不及做毕业设计,双专业的话 到时肯定忙不过来。提前做好准备吧,能自己完成的尽量自己完成,尽量不要找别人。自己的毕业前的一次大作业。努力完成也有…

Java项目:ssm高校党员管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 高校党员信息管理系统,分为普通用户和管理员两种角色。 普通用户登录后主要功能有: 我的中心:首页、个人资料、修改密…

广州蓝景分享—开发人员都知道的JavaScript技巧

JavaScript包含各种对典型编程思想有用的一些技巧,在实际开发中,我们通常希望减少代码行数;因此,今天这些技巧代码希望可以帮助到你。 现在我们就开始今天的内容吧。 1、与Javascript对象相关的 01)、对象解构 将对象的值解构为…

Vue2.0简讲!

Vue2.0简讲 Draven入门1.1、响应式渲染1.1.0、Vue创建1.1.1、指令(7)1.1.2、class与style绑定HTML Class对象语法数组语法绑定内联样式对象语法数组语法1.1.3、条件渲染v-if else-iftemplate v-if1.1.4、列表渲染v-forkey数组更新检测列表渲染Vue2列表渲染Vue3过滤应用(模糊查询…

机器学习与数据挖掘——前言

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔空间 这是从老师的PPT里面提取出来的,知识点分布比较零散,可能他做PPT的时候也没想那么多。 一:机器学习 机器学习的定义:一个计算机程序被称为…

前端岗位初入职场后的最初一段时间需要做什么

文章题目有点长,叫 《前端岗位初入职场后的最初一段时间需要做什么》,说下写这篇文的初衷,在前端自学团里有很多刚毕业或者是刚从培训班出来的同学,在群里天天讨论着找工作和面试的事情,面试的题在很多app或者小程序可…

四、【React-Router6】高亮 NavLink

项目修改自 上一节 的 Demo 这里需要注意的变化 默认高亮样式类名如果依然是 active 则依然默认有效 6 里移除了 activeClassName ,如果我的高亮样式类名是 peiqi,需要配置 className 为一个函数 函数接收两个参数 isActive:是否激活isPendi…

Arduino开发实例-DIY双向访客计数器和自动灯光控制

双向访客计数器和自动灯光控制 1、应用介绍 本应用将使用 Arduino 创建双向访客柜台和自动灯光控制系统。该应用基于一对 IR(红外)传感器,可在出现中断时检测障碍物。实际上,该系统可以检测来自两个方向的访客。从而对进入的访客数量和离开的访客数量进行计数。 该双向访…