java jpeg压缩解码_JPEG图像压缩原理简介

JPEG(发音:[ˈdʒeɪpɛg])是一种针对照片视频而广泛使用的有损压缩标准方法。

这个名称代表 Joint Photographic Experts Group(联合图像专家小组)。联合图像专家小组1992年发布了JPEG的标准而在1994年获得了ISO 10918-1的认定。JPEG与视频音频压缩标准的MPEG(Moving Picture Experts Group)很容易混淆,但两者是不同的组织及标准。

其实JPEG不是一种文件格式,它是由联合图像专家小组推出的一种图像压缩方法(类似于视频中的H.264等编解码标准)。而JPG或者JFIF格式仅仅是一种数据的包装容器(类似于视频中MP4、MOV等封装格式)。

1. 概述

JPEG编码的主要流程是:色彩空间转换 (Color Conversion)、下采样(Downsampling)、 分块 (Dividing Patch) 、离散余弦变换(Discrete cosine transform)、量化(Quantization)、熵编码技术(Entropy coding)。

2. 色彩空间转换(Color Conversion)

我们使用传感器采集到的原始(RAW)图像使用的是RGB色彩空间来表示的。也就是说,按照每一个像素的RGB(Red, Green, Blue)值填充到对应的像素位置。

首先,我们将RGB(红绿蓝)转换为一种称为YCrCb (YUV)的不同色彩空间。

•Y成分表示一个像素的亮度 (luminance) •U成分表示色度(饱和度)(Chrominance)•V成分表示色度(饱和度)

RGB空间到YUV空间转换公式为:

bb43954a19a9a39c28a8ff1e3ca3286a.png

下图为分解开的Y、U、V的示例:

8972777ff7bceb25da58e08df9af98b4.png

3. 采样(Downsampling)

下采样、也就是减少人类视觉系统不敏感的色度(U和V的成分)。虽然减少了颜色数量,但是人眼并不会察觉到图像质量有任何的差异。

JPEG上这种缩减取样的比例可以是4:4:4(无缩减取样),4:2:2(在水平方向2的倍数中取一个,颜色为之前的 1/2),以及最普遍的4:2:0(在水平和垂直方向 2 的倍数中取一个,颜色为之前的 1/4)。

如图:

9a7230860f7b12aaff0fca8cf5ad7b4c.png

4. 分块 (Dividing Patch)

源图像中每点的 3 个分量是交替出现的,先要把这 3 个分量分开,存放到 3 张表中去。然后由左及右,由上到下依次读取 8*8 的子块,存放在长度为 64 的表中,即可以进行DCT变换。如果原始图片的长宽不是 8 的倍数, 都需要先补成 8 的倍数, 使其可以进行一块块的处理。编码时,程序从源数据中读取一个 8*8的数据块后,进行 DCT 变换,量化,编码,然后再读取、处理下一个 8imes8 的数据块。图像的数据值必须减去128,是因为 DCT 公式所接受的数字范围是 -128 到 127 之间。

5、离散余弦变换(Discrete Cosine Transform)

离散余弦变换是一种类似于傅里叶变换的数学工具(不清楚傅里叶变换的同学可以移步:https://www.bilibili.com/video/av19141078来简单了解傅里叶变换).它将信号从时间域转换到频率域

这一步,将视频中的每个成分(Y, U, V)生成三个区域,每一个区域再划分成如瓷砖般排列的一个个的 8*8 子区域,每一子区域使用二维的离散余弦变换(DCT)转换到频率空间。

如果有一个如这样的的 8*8 的8-比特(0~255)子区域:

如图:

aa6f730c987823b24943b83a8dd84b20.png

用矩阵表示为:

2738dc9c741ea3c9334ab55a058837d0.png

原始数据每个值的范围是 [0-255] ,使每个数字减去 128 ,标准化。

4837d6929cf684cdef6d9a3353296064.png

且接着使用离散余弦变换,和舍位取最接近的整数,得到结果为

aeb15a3e705e1a6810e3667d3e68aad5.png

左上角相当大的数值称为DC系数(直流系数);其他 63 个值称为AC系数(交流系数)。

6.量化

利用人眼对低频数据敏感对高频数据不敏感的特性,我们可以将离散余弦变换后的很多更高频率的成分舍位成为接近 0 ,且剩下很多会变成小的正或负数。

JPEG标准中定义了量化表。

a50e2852d84b6676480e9afc6880529e.png
e2f5f76c60e7715f0a9848d7aa3ede5d.png

使用QYQY量化矩阵与前面所得到的DCT系数矩阵逐项相除,得到结果为:

e6bba44502c9942acd8010bb6ecbc6ee.png

7. 熵编码技术(Entropy Coding)

熵编码是一种无损压缩的技术,它使用Z字形(zigzag)将矩阵数据排列。然后将排列后的数据使用哈夫曼编码(哈夫曼编码的资料请自行查找))。

a95e1e51817bd390209b3305d842dbb8.png

对于前者量化的系数所作的Z字体序列会是:

−3, 0,−3, −2, −6,2, −4, 1, −3,1, 1, 5, 1, 2,−1, 1, −1, 2, 0, 0,0, 0, 0, −1, −1, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 0, 0, 0,0, 0, 0,0, 0,0

当剩下的所有系数都是零,对于过早结束的序列,JPEG有一个特别的霍夫曼编码用词。使用这个特殊的编码用词,EOB,该序列变为

−3, 0,−3, −2, −6,2, −4, 1 −3,1, 1, 5, 1, 2,−1, 1, −1, 2, 0, 0,0, 0, 0, −1, −1, EOB

在这一步数据量得到了极大的压缩。

8. 结果

JPEG是一种有损压缩算法。所以不同程度的压缩比例,会呈现出不同的文件大小,以及差异化的可视化呈现。以下,呈现了相关的压缩比例与原始图像的对比。从上到下,呈现了压缩比从小到大的结果。每一个图片中,左边是原始图像,右边是压缩后的图像。对应的文件大小显示在图线的上方。

d0ab8f7d89745533dc5d2c6d3d5de185.png
963585697acadc751aca2bc5cc7dc176.png
d6732f36cd780523469d4d01625f3455.png
b4dd3e01ebc51d43443fb6500d2d5fe5.png
562bcadd127f90bdf8da6d1b2a253184.png

9. 引用

https://ustc-dip.github.io/slice/Chapter8-图像压缩.pdf

https://en.wikipedia.org/wiki/JPEG

https://blog.csdn.net/songdan0201/article/details/51957758

https://taozhaojun.github.io/2016/01/17/camera/

https://compressjpeg.com

https://www.jianshu.com/p/71caefdb1e14


f3c6c7fcb4809e8e34044f44014b4339.png

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

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

相关文章

bootstrap网页模板源码_Go Web 编程--超详细的模板库应用指南

如果你有过Web编程的经验,那么或多或少都听说过或者使用过模板。简而言之,模板是可用于创建动态内容的文本文件。例如,你有一个网站导航栏的模板,其中动态内容的一部分可能是根据当前用户是否登录显示登录还是退出按钮。Go提供了两…

python matpoltlib绘制动态图_使用Python、Geopandas和Matplotlib制作gif动态

原标题:使用Python、Geopandas和Matplotlib制作gif动态 不需要Photoshop:仅使用Python和命令行制作动画图表。作为一种编程语言,Python非常灵活。这使得有时可以在几行代码中进行大量不同的可视化成为可能。但是现在有了很多不同的图表网站和…

dst发育筛查有意义吗_儿童视力筛查,都筛些啥?

感谢眼科小伙伴们的早出晚归辛勤忙碌,感谢幼儿园、学校及小朋友们的积极配合,本学期的校园视力筛查也已进入尾声。相信爸爸妈妈们都已拿到了这样的筛查结果单:(学龄前儿童仅行电脑验光筛查,学龄儿童还需行视力检查&…

java 堆_JAVA学习笔记 07——堆、栈和垃圾回收机制

程序执行的内存分析过程:虚拟机栈(简称:栈)的特点如下:1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)。2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参…

dubbo 自定义路由_Dubbo分层架构概述

本节我们从整体上来看看 Dubbo 的分层架构设计,架构分层是一个比较经典的模式,比如网络中的7层协议,每层执行固定的功能,上层依赖下层提供的功能,下层对上层提供功能,下层的改变对上层不可见,并…

python类方法继承_python类的继承

一、概述 面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类…

添加编译宏_软件开发——编译链接

对于平常的应用程序开发,我们很少需要关注编译和链接过程。我们平常Xcode开发就是集成的的开发环境(IDE),这样的IDE一般都将编译和链接的过程一步完成,通常将这种编译和链接合并在一起的过程称为构建,即使使用命令行来编译一个源代码文件,简单…

shell打开wifi命令_远程执行命令的填坑记录

前言本文主要记录 bash 四种模式的细节,以便于遇到问题时查阅。远程执行出错了最近使用 ansible 比较多,在某次使用 shell 模块远程执行命令的时候老是报 ‘command not found’。但是手动登录到远端机器执行命令是成功的,于是开始思考里面的…

nodejs express use 传值_再也不怕面试官问你express和koa的区别了

前言用了那么多年的express.js,终于有时间来深入学习express,然后顺便再和koa2的实现方式对比一下。老实说,还没看express.js源码之前,一直觉得express.js还是很不错的,无论从api设计,还是使用上都是可以的…

没有工作经验找it_校招和社招有什么区别?没有工作经验,如何找工作?

我们的招聘一般分为社招和校招。社招就是社会上招聘,绝大多数都要有相关的工作经验。而校招则是针对在校大学生的,所以应届毕业生的身份很重要,失去了这个身份,就要进入社招的渠道,面临的压力和要求都要高得多。那么&a…

python输入个人所得税计算_个税起征点上调至5000,用Python算一算少交多少税

原标题:个税起征点上调至5000,用Python算一算少交多少税今天出了一个重磅消息,个税起征点从3500上调到5000啦! 广大IT农民工的生活压力又减轻了一些,有没有 晚上加一个鸡腿,要不要~ 开心归开心,…

hive 行转列和列转行的方法_面试常考!SQL行转列和列转行

关注上方“数据挖掘工程师”,选择星标,关键时间,第一时间送达!行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 的运算符PIVOT来实现。用传统的…

.net core 装了没生效_王者荣耀:辅助装出现惊天bug?辅助光环对自己无效?

大家好,我是老刘备。今天说的这个bug我已经发现许久,从新版本以来就一直在出现,起初我以为是辅助装的光环改动了,但是最近和我的小伙伴开黑之后也遇到这个bug,才发现不是如此。本期我就来带大家一起看看。辅助光环技我…

python sns绘制回归线_Python数分实战:员工流失情况预测

在很久之前,我有写一个Excel数据分析的实战项目,不晓得大家还记不记得,感兴趣的童鞋可以回看:A九姑娘:Excel数分实战:员工流失率分析​zhuanlan.zhihu.com本次的项目数据依旧是这个,但是我们这次…

go var 一个整数_Go语言学习基础-值、变量、常量

Hello world第一个程序是打印经典的“hello world”信息。保存为hello-world.go文件,在命令行中使用go run命令运行程序。若要构建为二进制文件,则使用go build来实现,然后直接执行二进制文件。结果:$ go run hello-world.gohello…

怎么取消自动格式化_iPhone自动扣费怎么取消?App Store、微信、支付宝关闭自动扣费教程...

经常有网友反馈,自己的手机每月会被不知不觉的被扣钱,但又不知道如何关闭,烦恼不已。其实,现在很多视频、音乐、购物等APP都有会员充值功能,其中不少还包含“自动续费”功能,一旦开启会员,今后就…

c# selenium chrome 文件下载_Selenium 框架原理以及环境安装

Selenium 框架原理图片来自转载 蓝色的图Selenium Language Binding就是我们平时使用的编码语言,包括java、python、C#等。可以看到这些语言并没有直接与Browser Drivers进行通信,而是通过了JSON WireProtocol,这就是webdriver协议 &#xff…

怎么打包图片_怎么将许多张照片打包发到邮箱?

怎么将许多张照片打包发到邮箱?所谓的打包,就是需要你把大量照片文件变成一个压缩文件,类似于放到一个文件夹内,也可以理解为把多张纸质照片装订成一个相册,而在装订过程中需要相应工具才能完成。使用压缩包发送文件&a…

dram sram利用 利用_使用量子力学技术的新型超低功耗存储器或将取代DRAM和Flash...

雷锋网按:业界普遍认为未来从数据中将能挖掘出最大的价值,但要挖掘数据的价值除了需要很强的计算能力之外,数据的存储也非常关键。目前,新型存储器也是领先的企业非常关注的一个方向,兰开斯特大学(Lancaster Universit…

mac地址转换_mac电脑格式转化工具

软件下载【软件名称】:Permute【系统支持】:MAC电脑【位数支持】:32位/64位软件下载地址:链接:https://pan.baidu.com/s/1OAEpnvmkQgqd9MMq3Rucow提取码:tgt7注:阿狸提供用户下载的所有内容均来…