作者 | Jack Sigmoid  编辑 | 3D视觉开发者社区

前言

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

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

图像组成

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

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

压缩技术一:颜色空间转换(RGB->YCrCb)+色彩下采样(Chroma Subsampling)

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

因此,我们可以将图像从RGB->YCrCb空间,然后对于亮度Y,保留0~255等级,而对于Cr和Cb,采用下采样手段:

未对Cr和Cb进行下采样

对Cr和Cb进行下采样

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

YCrCb空间

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

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

最终得到如下:

下采样的YCrCb空间

然后进行合并得到:

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

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

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

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

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

压缩技术二:DCT变换,留低频,弃高频

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

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

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

人类视觉系统对高频信息并不那么敏感

因此,我们可以利用信号处理领域的相关手段,分析出图像中高低频信息含量,并通过一定手段筛选出我们需要的信息。此时,一个重要的方法排上了用场,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变化是可逆的,对应如下图所示:

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

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

上述过程就是DCT 2D变换:

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

加入0个频率系数时:

加入0个频率系数

加入8个频率系数时:

加入8个频率系数

加入32个频率系数时:

加入32个频率系数

加入48个频率系数时:

加入48个频率系数

加入64个频率系数时:

加入64个频率系数

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

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

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

加入0个频率时,恢复出来一片白板

只用一个系数时,图像大体轮廓已出现

当加入8个频率时,图像基本上恢复出原样

当加入16个频率时,图像越来越清楚

随着后续高频不断加入,图像并没有多大改变

后续的高频分量对于图像的视觉感受并没有多大改变

从上述分析,我们就可以看到,一些高频分量的加入,并不会对我们的视觉带来冲击,因此,这部分高频信息就可以丢弃。具体怎么丢弃呢?研究人员通过大量的视觉实验,最终定义出一个量化表格(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图像压缩原理,整个过程清晰明朗,一气呵成,希望能帮助到各位。

总结:

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

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

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

参考

1. 中文字幕视频解说:

2.视频源出处:https://www.youtube.com/watch?v=0me3guauqOU

版权声明:本文为奥比中光3D视觉开发者社区特约作者授权原创发布,未经授权不得转载,本文仅做学术分享,版权归原作者所有,若涉及侵权内容请联系删文。

3D视觉开发者社区是由奥比中光给所有开发者打造的分享与交流平台,旨在将3D视觉技术开放给开发者。平台为开发者提供3D视觉领域免费课程、奥比中光独家资源与专业技术支持。

加入【3D视觉开发者社区】学习行业前沿知识,赋能开发者技能提升!
加入【3D视觉AI开放平台】体验AI算法能力,助力开发者视觉算法落地!

令人拍案叫绝的JPEG图像压缩原理相关推荐

  1. 基于DCT变换的JPEG图像压缩原理与JPEG2000编解码原理

    目录 参考文章 基于DCT变换的JPEG图像压缩原理 图像数据压缩 图像处理 为什么可以进行图像压缩? 颜色空间转换 RGB CMY HSV/HSI/HSB/HSL YUV/YCbCr YCbCr与R ...

  2. 基于DCT变换的JPEG图像压缩原理

    1.为什么要进行图像压缩 众所周知,当今人类社会具有三大支柱,即物质.能量.信息.当下已由物质过渡到信息,从农业现代化到工业现代化,再到当今的信息化时代.信息具有通用性.抽象性.无限性.其通用性表现在 ...

  3. jpeg图像压缩原理

    jpeg格式的图片具有很高压缩比,是十分常见的一种图片储存和传输格式.通常由无损的RGB图像数据到最终的jpeg格式需要经过以下的步骤: step1.颜色模式转换 JPEG只支持YUV颜色模式(准确说 ...

  4. JPEG图像压缩原理与DCT离散余弦变换

    原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 转载请注明出处喔 1 前言 JPEG是joint Photographic E ...

  5. 图像压缩原理-JPEG

    搬来一个基础啊 给自己看~~ 非技术指正勿扰 图像的格式有很多种,比如PNG,JPEG等等,但当我们把一张图用工具变成各种其他格式时,其在计算机文件系统显示的文件大小各不一样,但是当你打开显示时,从视 ...

  6. JPEG图像压缩解压算法——C++实现

    兹于2017年11月,应<多媒体技术基础>课程实验的要求,本人就基于JPEG图像压缩解压算法做了较为深入的理解,用C++语言实现JPEG图像压缩解压算法. JPEG图像压缩解压算法 一.实 ...

  7. 基于DCT变换的JPEG图像压缩

    基于DCT变换的JPEG图像压缩 摘 要:图像和视频通常在计算机中表示会占用非常大的空间,而出于节省硬盘空间的考虑,往往要进行压缩.而随着网络的发展,图像压缩技术越来越被人所重视.DCT变换是图像压缩 ...

  8. 深度有趣 | 16 令人拍案叫绝的WGAN

    简介 在DCGAN的基础上,介绍WGAN的原理和实现,并在LFW和CelebA两个数据集上进一步实践 问题 GAN一直面临以下问题和挑战 训练困难,需要精心设计模型结构,并小心协调G和D的训练程度 G ...

  9. 音视频入门(四)-JPEG压缩算法原理

    一.JPEG的引入 JPEG属于一种图片压缩格式,之前我们通过对YUV420图像格式的学习,了解了怎么计算一帧YUV图像的大小.假设这里一帧图片的分辨率为1080p,像素格式为YUV420,那么它的大 ...

最新文章

  1. Android selector 使用注意.
  2. 视频监控行业解决方案
  3. Hadoop 2.x的DistributedCache无法工作的问题
  4. unity2D限制位置的背景移动补偿效果
  5. HTML5唐四薪,8文件存取组件课件.ppt
  6. stm32气压传感器 带探头的_ST SSC 频道 | 基于ST STM32F302R8T6 电机空气压缩机方案
  7. LiveVideoStackCon 2018公布优秀出品人与讲师
  8. Natasha v2.5.4 版与运行时实战
  9. vs不一致的行尾对话框怎么调出_细分调漆步骤,新手师傅怎么轻松调漆
  10. 物联网进入规模化应用时代 万物互联时代到来
  11. 宝宝退烧的天然方子(老中医的推荐)
  12. ls在系统中常用的选项与用法
  13. python速学_60分钟Python快速学习(给发哥一个交代)
  14. STM32MP157实现串口接收数据上云-云数据库存储多设备数据界面显示实现
  15. 一文读懂软考高项(高级-信息系统项目管理师)+无套路学习资料
  16. bcnf分解算法_BCNF范式及其分解方法(对一次Lab作业的总结)
  17. jquery发送ajax请求并设置请求头
  18. “onkeyup”=按键抬起触发,“onafterpaste”=粘贴之后触发
  19. 阿里云LOGO在线设计入口说明
  20. 轻量而敏捷的工业组态软件UI设计工具-ConPipe Studio 2022

热门文章

  1. Python pandas sort_values()方法的使用
  2. JavaScript面试题及答案
  3. 月亮网摘(2006.08.22)
  4. 移动端开发调试工具——eruda
  5. android 投屏开发框架,Android DLNA投屏-基于CyberGarage开发投屏功能
  6. 【转】如何区分平舌音、翘舌音及前后鼻音
  7. JAVA经典算法40题(1)
  8. 用Java刷算法题的常用数据结构(C++转Java)
  9. 【解决】Linux下搜狗输入法无法显示候选框
  10. 利用ContentProvider和ContentResolver达到QQ换肤以及数据共享查询(暂无内容)