1 前言

JPEG是joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为”.jpg”或”.jpeg”。
jpg图片可以说是最常见的图片格式了,基本上你的自拍照,要么是png的,要么就是jpeg的了。(有关jpeg和png的区别,请参考我的另一博文【jpeg 与 png 图片格式的区别】)
但它是一种有损压缩。支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。

那么,JPEG是如何压缩的呢?靠的就是传说中的DCT(离散余弦变换)。

下图是JPEG压缩/解压缩的流程图。我想你最大的疑问估计就是DCT了。

2 JPEG压缩流程

2.1 以8x8的图象块为基本单位进行编码

如下图所示。比如一个160x160大小的原始图像,就可以分成20x20个8x8图像块。

每个图像块共64个像素。像素可以用RGB或YUV表示,需要3个byte。所以严格来说,上图3个箭头代表的数据,指的是RGB/YUV的某一个值,比如Y。

2.2 将RGB转换为亮度-色调-饱和度系统(YUV),并重新采样

YUV是什么?它也是一种很不错的图像数据表示方法,特别是在视频领域。
Y:指颜色的明视度、亮度、灰度值;
U:指色调;
V:指饱和度。

YUV是一个统称,其实有很多具体格式,比如YUV420, YUV444, YUV422。
YUV的某些格式,和RGB比起来,其数据量要少很多。
比如YUV420,每个像素需要一个Y,每4个像素需要一个U/V,因此一个8*8图像块,数据量只要8x8x3/2 = 96byte。而RGB需要8x8x3 = 192byte。少了一半的数据量。现在很多视频都是YUV420作为色域。
当然啦,在本次转换,用的是YUV444, 也就是每个像素都有YUV的值。

YUV与RGB可以互相转换。
Y=0.299R+0.587G+0.114B
U=0.148R-0.289G+0.473B
V=0.615R-0.515G-0.1B

2.3 FDCT与IDCT

一个是正变换,一个是逆变换。反正都可以称为离散余弦变换。
根据8*8的二维DCT定义

其中:0<= u, v < 8

a(v) = a(u)
是输入8x8像素的坐标。
是输出的8x8变换结果的坐标。

不要把上式看的有多难,也不要被“离散余弦变换”这个词给吓到,其实他没什么(如果你非要去追究,那就打开“信号与系统”的书复习一下吧,我拦不住你哈),上式其实就是一个运算公式而已。
输入就是8x8的数据矩阵,经过计算,输出还是一个8x8的数据矩阵。
其实上式可以简化为:

并且A和A转置矩阵都是已知的。所以,说白了,就是个矩阵运算。对程序来说,很简单。

称G(0,0),也就是输出8x8矩阵的(0,0)坐标的值,为直流系数,其他为交流系数。
之所以称它为直流系数,是因为当u, v = 0时,cos()结果都为0,所以最后结果就是输入矩阵的8x8的每个数值的和,再乘于a(u) x a(v) x 1/4 = 1/8。

当然了,输入数据其实是有3个的,也就是YUV,因此对每个8x8的原始图像数据,需要做3次DCT。

2.4 量化与反量化

定义:将DCT变换后的临时结果,除以各自量化步长并四舍五入后取整,得到量化系数。
为什么可以量化?!
因为经过DCT后,数据就不同了,左上方都是大数值,右下方都是小数值。比如左上方都是几十几百的,右下方附近,都是个位数,那么,大数值和小数值就可以分别量化。

在术语里,左上方称为低频数据,右下方称为高频数据
你要是不理解,可以这么想,既然G(0,0)都是直流分量了,那频率不就是0?不就是所谓的低频?^^

还是不理解?好吧,那你也可以这么想:
比如cos(ax),a是常数,x是变量。那么,根据频率f = a/2π,a越大,函数的频率越高。
看看DCT公式:

u,v 越大,则越在右下方对吧。当计算某个G(u, v)时,x, y是变量,u, v相当于常数,当u/v越大,则频率越高!
这就是为啥右下方称为高频数据了!

好了,别走偏了,还继续说量化。
JPEG系统分别规定了亮度分量和色度分量的量化表,色度分量相应的量化步长比亮度分量大。

对量化系数的处理和组织
思想:JPEG采用定长和变长相结合的编码方法。
直流系数:通常相邻8*8图象块的DC分量很接近,因此JPEG对量化后的直流分量采用无失真DPCM编码。通常JPEG要保存所需比特数和实际差值。

交流系数:经过量化后,AC分量出现较多的0。JPEG采用对0系数的行程长度编码。而对非0值,则要保存所需数和实际值。
ZIG-ZAG排序:为使连续的0个数增多,采用Z形编码。

你要是不理解,看看下面的例子,就知道为啥ZIG-ZAG可以俘获更多的0了!

3 应用举例

3.1 编码

某个图象的一个8*8方块,的亮度值。

由于一个字节是0~255,为了减小绝对值波动,先把数值移位一下,变成-128~127。

接着,根据DCT变换公式,各种计算,获得临时结果。

根据亮度量化表量化后得到的量化系数矩阵

获得量化结果:

可见,新的数据,很小,很多是0。正如上文所说,这么多0,完全可以用游程编码,大大缩小数据量。

3.2 解码

先游程编码恢复为

然后,根据量化表,恢复

再根据反离散余弦变换的公式:

结果为:

再右移127,恢复原始。

和原始图像的数据相比,基本是一样的,或者近似的!

4 其他

必须再强调的是,JPEG压缩是有损失的,从上面的例子就看出来,输出结果并不是完全等于输入。
此外,JPEG压缩比例是可以控制的,只不过图像质量会变差。比如
压缩率:10

压缩率:50

JPEG压缩比例,就是通过控制量化的多少来控制。比如,上面的量化矩阵Q,如果我把矩阵的每个数都double一下,那是不是会出现更多的0?!说不定都只有G(0, 0)非0,其他都是0,如果这样,那编码时就可以更省空间啦,N个0只要一个游程编码搞定,数据量超小。但也意味着,恢复时,会带来更多的误差,图像质量也会变差了。

参考:
https://en.wikipedia.org/wiki/JPEG#Discrete_cosine_transform

JPEG图像压缩原理与DCT离散余弦变换相关推荐

  1. JPEG压缩原理与DCT离散余弦变换

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

  2. JPEG压缩原理(DCT)

    本文介绍JPEG压缩技术的原理,对于DCT变换.Zig-Zag扫描和Huffman编码,给出一个较为清晰的框架. 1. JPEG压缩的编解码互逆过程: 编码 解码 2. 具体过程:(这里仅以编码为例, ...

  3. 数字图像处理学习笔记(十八)实现图像的离散余弦变换

    实验截图: 自带函数实现的离散余弦变换: 利用公式求出的DCT和IDCT 实验代码: 代码(1): img=imread('erciyuan.jpg'); img=rgb2gray(img); fig ...

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

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

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

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

  6. 理解DCT与DST【二】:离散余弦变换

    本文主要是将先前的博客 离散傅里叶变换DFT.离散余弦变换DCT.离散正弦变换DST,原理与公式推导 从图片修改为 Markdown 脚本,方便读者浏览,同时增加了部分内容.但由于文章字符过多,无法全 ...

  7. dct变换的主要优点有哪些_数字图像处理(三)—— 离散余弦变换

    离散余弦变换(Discrete Cosine Transform)本质上也是离散傅里叶变换(Discrete Fourier Transform),但是只有实数部分.有这样一个性质:如果信号 在给定区 ...

  8. 图像处理 离散余弦变换

    什么是DCT 一维DCT变换 一维DCT变换时二维DCT变换的基础,所以我们先来讨论下一维DCT变换.一维DCT变换共有8种形式,其中最常用的是第二种形式,由于其运算简单.适用范围广.我们在这里只讨论 ...

  9. 频域滤波—离散余弦变换

    离散余弦变换DCT 傅里叶变换的参数是复数,在数据的描述上相当于实数的两倍,若仅用实函数对称延拓成一个实偶函数,则其傅里叶变换也为实偶函数且仅包含余弦项,连续函数和离散函数的余弦变换都是基于这个原理. ...

最新文章

  1. 【教程】【FLEX】#004 反射机制
  2. DiskFileUpload类常用方法
  3. 蓝桥杯2017初赛-外星日历-数论
  4. kvm vnc的使用,鼠标漂移等
  5. 前端学习(1731):前端系列javascript之发布窗口布局下
  6. C/S通信模型与B/S通信模型介绍
  7. Qt文档阅读笔记-RadioButton的基本使用
  8. 17.立体匹配——匹配问题,好区域匹配 测验,窗口大小的影响,遮蔽(Occlusion),顺序约束_2
  9. RubyCritic:一款不错的检测代码质量工具
  10. Latex 之 双栏 末页对齐 -- 导言区加入 \usepackage{flushend}
  11. Android 签名板
  12. Unity性能优化之物理引擎的优化(三)
  13. 微信公众号网页开发步骤
  14. 回首向来萧瑟处 也无风雨也无晴
  15. .ps格式的文件怎么打开?方法:通过GSview打开或将.ps转换成.pdf
  16. 声纹技术(三):声纹识别技术
  17. 树莓派外接can模块,can收发功能测试
  18. erp仓储管理 java,关于java:ERP仓库管理的操作与设计开源软件诞生20
  19. uni-app 99群公告推送功能(一)
  20. 教你用C++做一个简单的用户名以及密码注册系统

热门文章

  1. 外客户为什么要验厂?外贸公司怎么应对验厂?
  2. 为自己搭建一个分布式 IM(即时通讯) 系统
  3. 个性化消费时代,品牌聚焦新趋势
  4. TIA Portal 博图 博途 安装问题汇总
  5. Java杂乱无章-判断为空的编码规范
  6. xmind打不开文件
  7. 如何选择一款优质的商城系统?
  8. 数学归纳法证明哥猜成立
  9. 问题 Z: 尼克与强盗
  10. 渡一教育公开课web前端开发JavaScript精英课学习笔记(三十二)JavaScript旋转方块