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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值