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

原文网址:http://blog.csdn.net/newchenxf/article/details/51719597
转载请注明出处喔


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

  • 136
    点赞
  • 389
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
DCT域图像边缘的快速提取.pdf MATLAB在数字水印中的应用.pdf MATLAB在数字水印技术研究的应用.pdf 一个面像识别系统的实现.pdf 一种JPEG图像边缘检测算法.pdf 一种人脸识别的新方法.pdf 一种可抵抗MP3压缩的音频水印算法.pdf 一种基于DCT变换的图像信息隐藏算法.pdf 一种基于DCT变换的数字水印技术.pdf 一种基于DCT域的鲁棒水印算法及其Matlab实现.pdf 一种基于DCT的改进D_LDA人脸识别算法.pdf 一种基于DCT的鲁棒性数字水印算法.pdf 一种应用于指纹识别系统的指纹图像压缩算法.pdf 一种彩色图像水印方法的抗攻击性能.pdf 一种简单有效的彩色图像数字水印算法.pdf 压缩域上人脸识别的研究.pdf 基于DCT变换的信息隐藏算法研究.pdf 基于DCT变换的图像数字水印算法.pdf 基于DCT变换的数字图像压缩技术及其Matlab实现.pdf 基于DCT变换的车牌定位算法.pdf 基于DCT和BP神经网络集成的人脸识别.pdf 基于DCT和神经网络的人脸识别.pdf 基于DCT域奇异值分解的图像检索技术.pdf 基于DCTJPEG图像压缩编码算法的MATLAB实现.pdf 基于DCT的PCA及神经网络的人脸识别研究.pdf 基于DCT的人脸特征提取.pdf 基于DCT的图像压缩及其MATLAB实现.pdf 基于DCT频域数字图像水印算法研究.pdf 基于MATLAB的DCT变换JPEG图像压缩中的应用.pdf 基于MATLAB的DCT域图像水印的研究.pdf 基于MATLAB的DCT域数字图像水印技术.pdf 基于MATLAB的DCT域数字水印技术实现.pdf 基于MATLAB的JPEG压缩编码.pdf 基于MATLAB的数字水印技术实现.pdf 基于MATLAB的数字水印算法实现.pdf 基于对角DCT与2DPCA算法的人脸识别.pdf 基于正交余弦变换域概率主成分分析的嵌入隐马尔可夫人脸识别模型.pdf 基于离散余弦变换和支持向量机的人脸识别方法研究.pdf 基于离散余弦变换的人脸画像识别方法.pdf 基于离散余弦变换的人脸识别方法.pdf 基于离散余弦变换的数字图像水印算法及其MATLAB实现.pdf 基于离散余弦变换的车道识别算法.pdf 基于离散余弦变换的音频信息隐藏算法.pdf 基于隐马尔可夫模型_HMM_的人脸表情识别.pdf 数字媒体版权保护和信息保密的新途径_数字水印技术.pdf 用MATLAB数字图像水印.pdf 离散余弦变换域图像数字水印技术.pdf 离散余弦变换DCT)在彩色图像盲水印技术中的应用.pdf

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newchenxf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值