JPEG的编码步骤

来源:互联网 发布:北斗网络同步时钟 编辑:程序博客网 时间:2024/04/25 22:48

JPEG(Joint Photographic Experts Group)是ISO和CCITT为静态图象建立的一个国际数
字图象压缩标准.
定义了基于DCT的失真(Lossy)方式和使用预测器(Predictor)的无失真(Lossless)方式.

在失真方式中, 又分只处理取样比例为8位的基本模式(BaseLine Process)和可以处理取
样比例12位的扩展模式(Extended Process). 使用失真方式,压缩比可调(一般在10-50内
效果最好);使用无失真方式,压缩比大于2.
JPEG使用的几种压缩模式一览:
基于DCT的失真方式 DCT_Based
基本系统 Baseline
顺序编码 Sequential
哈夫曼编码 Huffman
累进编码 Progressie
哈夫曼编码 Huffman
扩展系统 Extended
顺序编码 Sequential
哈夫曼编码 Huffman
算术编码 Arithmetic
累进编码 Progressie
哈夫曼编码 Huffman
算术编码 Arithmetic
阶梯编码 Hierachical
哈夫曼编码 Huffman
算术编码 Arithmetic
无失真编码 Lossless
一般编码 Normal
哈夫曼编码 Huffman
算术编码 Arithmetic
阶梯编码 Hierachical
哈夫曼编码 Huffman
算术编码 Arithmetic
我们现在讨论Baseline系统中的顺序编码模式.
JPEG的编码主要有以下几个步骤:
1.色彩转换 2.部分取样 3.离散余弦变换DCT 4.量化 5.熵编码 6.数据混合
编码的时候,JPEG编码器先将一幅原始图象转换为自己的色彩系统,按照人眼特点对其中
各个色彩分量作不同的取样,经由DCT转换从时域变为频域,接着将变换后的数据量化以丢
弃无用信息,然后用哈夫曼编码或者算术编码对量化后的系数进行编码得到压缩数据,最
后将色彩分量信息,量化表,编码表和各个色彩分量的压缩数据等混合成一个整体数据流
,即形成JPEG文件.
解码的时候,JPEG解码器先从数据流中获取解码所必须的信息(色彩分量信息,量化表和编
码表等),然后将各个色彩分量分别解码,过程和编码的时候刚好相反.
编码和解码的流程图如下:
色彩系统(Color Space) 返回JPEG编解码流程
计算机显示使用的是RGB三色系统,而JPEG文件使用的是 亮度-色调-饱和度 色彩系统,本
节讲的就是它们之间的转换.(为何不直接使用RGB色彩系统,在下一节将会讲到).
间接色彩<--->直接色彩
1.YIQ:
YIQ是北美NTSC电视系统中采用的色彩系统,Y不是指Yellow,而是指颜色的明视度(Lumin
ance),或者称做亮度(Brightness),也可以称做灰度值(Gray Value),I和Q分别是色调和
饱和度.
YIQ与RGB的转换关系如下:
Y=0.299R+0.587G+0.114B  R=Y+0.956I+0.621Q
I=0.596R-0.274G-0.322B  G=Y-0.272I-0.647Q
Q=0.211R-0.523G+0.312B  B=Y-1.106I-1.703Q
2.YUV:
YUV是欧洲PAL电视系统中采用的色彩系统,YUV的含义和YIQ的含义一一对应
YUV与RGB的转换关系如下:
Y=0.299R+0.587G+0.114B  R=Y+1.140V
U=-0.148R-0.289G+0.473B  G=Y-0.395U-0.581V
V=0.615R-0.515G-0.100B  B=Y+2.032U
3.YCbCr:
JPEG的缺省色彩系统,它是从YUV色彩系统中衍生出来的,将U和V做少许调整就是Cb和Cr
YCbCr与RGB的转换关系如下:
Y =0.2990R+0.5870G+0.1140B  R=Y+1.40200(Cr-128)
Cb=-0.1687R-0.3313G+0.5000B+128  G=Y-0.34414(Cb-128)-0.71414(Cr-128)
Cr=0.5000R-0.4187G-0.0813B+128  B=Y+1.77200(Cb-128)
下图表明该类色彩系统与RGB系统的对应关系:  色调
饱和度  亮度
部分取样(SubSampling) 返回JPEG编解码流程
研究表明:人类眼睛对亮度变化的敏感度比对色彩变化的敏感度要高的多.例如在光线不
足的情况下,人眼看到的物体都是黑白的,只有光线足够强的时候,才能感觉到色彩的存在
.从上一节的叙述我们知道,间接色彩可以用亮度,色调和饱和度来表示颜色.如果我们对
于亮度处理比较精细,而对色调和饱和度只做粗略的处理,那么就可以提高压缩比而不会
太影响视觉效果.这也是不用RGB色彩系统的原因.不过也不是绝对,JPEG还支持一种色彩
系统CMYK属于直接色彩,那就不在我们现在讨论的范围里了.
JPEG使用部分数据取样来完成这个过程.用取样因子描述.
用一个例子来说明:
如果一幅图,它的
水平取样因子为2,1,1.则表示在水平方向上亮度、色调和饱和度的取样数据量比例为2:
1:1.
垂直取样因子为2,1,2.则表示再垂直方向上亮度、色调和饱和度的取样数据量比例为2:
1:2.
那么总的取样数据量比例为2*2:1*1:1*2 = 4:2:1.这个比例被称为YUV421.
JPEG规定每种色彩成分取8*8个样值(为何要取8*8见下一节)为一个单位(Unit).按取样比
例的几个色彩成分的单位组合,称为最小编码单位MCU(Minimum Coded Unit)
下图表示一个16*16的图象块是怎样按YUV412被取样为一个MCU的:
在上图中:原图象数据(16*16RGB矩阵)首先被转化为三个色彩成分数据(16*16YUV矩阵),
然后对于Y成分(Component1),数据不变. 对于U成分(Component2),每2*2个数据求平均,
取样为一个数据.对于V成分,每2*1个数据求平均,取样为一个数据,最后得到2*2个Y单位
,1*1个U单位,1*2个V单位.
这4+1+2个单位就是最小编码单位(MCU)
通过部分取样可以看出,原来3*16*16=768个像素数据,变为16*16+8*8+8*16=448个,再未
编码前就有约40%的压缩比.如果用YUV411则有50%的压缩比,用YUV422也有33%.理论上讲
,如果取YUV911,YUV16 11可以达到更高的压缩比,但是这样图象品质就会受到影响,因此
JPEG规定一个MCU里Unit的个数不能大于10
离散余弦变换--DCT(Discrete Consine Transform) 返回JPEG编解码流程
研究表明:人眼对低频数据比对高频数据有更高的敏感度.人们很早就使用这一特点,例如
报纸上印刷照片是由很多黑色小圆点组成,这些小圆点代表高频数据,人眼看上去是一幅
图象,即低频数据.如果我们对图象的高频数据作些修饰(将小圆点变为小方点),人眼是不
容易辨认的(看上去还是原来的图象).一般图象(照片)有很大部分信息熵都在高频区.
DCT的作用即是将一组光强数据(Intensity Data)转换为频率数据(Frequency Data),以
便以后流程对高频数据进行修饰处理.
由于DCT变换的运算量比较大,JPEG将每一个色彩分量的数据分割成8*8的小块,然后对这
个8*8矩阵做DCT
原始图象数据Ixy:  变换后DCT系数Duv:
I00 I01 I02 I03 I04 I05 I06 I07
I10 I11 I12 I13 I14 I15 I16 I17
I20 I21 I22 I23 I24 I25 I26 I27
I30 I31 I32 I33 I34 I35 I36 I37
I40 I41 I42 I43 I44 I45 I46 I47
I50 I51 I52 I53 I54 I55 I56 I57
I60 I61 I62 I63 I64 I65 I66 I67
I70 I71 I72 I73 I74 I75 I76 I77
--FDCT->
<-IDCT-- D00 D01 D02 D03 D04 D05 D06 D07
D10 D11 D12 D13 D14 D15 D16 D17
D20 D21 D22 D23 D24 D25 D26 D27
D30 D31 D32 D33 D34 D35 D36 D37
D40 D41 D42 D43 D44 D45 D46 D47
D50 D51 D52 D53 D54 D55 D56 D57
D60 D61 D62 D63 D64 D65 D66 D67
D70 D71 D72 D73 D74 D75 D76 D77
算法如下:
其中u,v=0时 Cu,Cv=0.70710678(即1/√2) ; u,v为其他值时 Cu,Cv=1.
变换后的系数D00 JPEG称为直流系数(DC),D01-D77称为交流系数(AC).系数矩阵左上为低
频系数,右下为高频系数.用浮点运算可以达到很高的精度,不过常用的还是整数快速算法

量化(Quantization) 返回JPEG编解码流程
DCT变换后的高频数据由量化来进行修饰处理.
将DCT系数按比例缩小,并取最接近的整数值的过程称为量化.将量化后的系数按比例恢复
的过程称为逆量化.
下为示意图:
通过量化,我们可以丢弃一些不重要的图象细节信息,JPEG的主要压缩率集中在这个地方
.量化系数是在图象品质与压缩比之间作一个选择.量化间隔大,丢弃的信息就多,使得压
缩比增大,图象品质降低.反之压缩比减小,图象品质提高.所以选择一个好的量化系数很
重要,JPEG提供的缺省量化表如下:
明视度(Luminance)量化表:  色调(Chrominance)量化表:
16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99
  17 18 24 47 99 99 99 99
18 21 26 66 99 99 99 99
24 26 56 99 99 99 99 99
47 66 99 99 99 99 99 99
99 99 99 99 99 99 99 99
99 99 99 99 99 99 99 99
99 99 99 99 99 99 99 99
99 99 99 99 99 99 99 99
量化系数矩阵与8*8的DCT系数矩阵一一对应.运算的时候直接用DCT系数除以相对应的量
化系数,对得到的数四舍五入取整.可以看出低频区(左上角)的量化系数明显比高频区(右
下角)的量化系数小.用该量化表压缩的图象,统计平均人眼观看质量为4.5分(5分为满分
),压缩比约为20至30
熵编码(Entropy Encoding) 返回JPEG编解码流程
原始图象数据经过上面的步骤,其数据量已经被压缩了很多,熵编码使用统计模型将系数
作最后的压缩.主要有两种方式的编码:Huffman编码和算术编码.由于专利权的缘故,大多
数编码器都采用Huffman编码,但是使用算术编码压缩效果要好5%至10%.
在对量化后的系数矩阵进行编码之前,还有一些预处理要做:
1.Z形排序(Zig-Zag Order):
Z形编码入图所示:
从图中可以看出,JPEG优先对低频区的数据编码.这样做是因为:
低频的系数比高频的系数重要的多;而且低频区的量化系数大大小于高频区的量化系数,
使得量化后高频区大部分数据为0,从低频区开始编码可以用一个结束码(EOB,End Of Bl
ock)表示以后的高频数据全零.
在后面的例子中,我们可以看出这样做的好处.
2.差值脉冲编码调制(Differential Pulse Code Modulation)DPCM:
JPEG对DC系数的编码采取DPCM方式,也就是取该DC系数与前一个DC系数的差值来编码.
在DCT变换公式中可以看出,DC系数实际上是对64个原始系数求和平均(D00=[∑Ixy]/8).
在连续色调图象中,色彩变化不是很剧烈,差值一般比原值小,所以对差值编码所需的数据
量会比原值编码小很多.

数据混合(Data Interleave) 返回JPEG编解码流程
熵编码之后的数据经过混合成为编码比特流(Coding Bit Stream)
一个例子(An Example) 返回JPEG编解码流程
现在我们对一个高斯脉冲的亮度分量用上面所述流程进行编码,首先做FDCT和量化,过程
如下:
高斯脉冲数据:  变换后系数:
139 144 149 153 155 155 155 155
144 151 153 156 159 156 156 156
150 155 160 163 158 156 156 156
159 161 162 160 160 159 159 159
159 160 161 162 162 155 155 155
161 161 161 161 160 157 157 157
162 162 161 163 162 157 157 157
162 162 161 161 163 158 158 158
-128
--->
FDCT 235 -1 -12 -5 2 -1 -2 1
-22 -17 -6 -3 -2 0 0 -1
-10 -9 -1 1 0 0 0 0
-7 -1 0 1 0 0 0 0
0 0 1 1 0 0 0 1
1 0 1 0 0 1 1 -1
-1 0 0 1 0 1 1 0
-2 1 -3 -1 1 1 0 0
量化表:  量化↓
16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99
--> 15 0 -1 0 0 0 0 0
-2 -1 0 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
0 0 0 0 0 0 0 0
我们假设上一个DCT的DC系数为20,则经过预处理(ZigZag,DPCM)后,系数排列为-5,0,-2,
-1,-1,-1,0,0,-1,在这个地方,可以看出后面的系数全部为零,JPEG定义了一个块结束标
记(EOB)来表示后面的数据全是零.
重建过程如下:
量化表:  解码后系数:
16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 69 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 103 77
24 35 55 64 81 104 113 92
49 64 78 87 103 121 120 101
72 92 95 98 112 100 103 99
---> 15 0 -1 0 0 0 0 0
-2 -1 0 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
0 0 0 0 0 0 0 0
重建图象数据:  反量化↓
144 146 149 152 154 156 156 156
148 150 152 154 156 156 156 156
155 156 157 158 158 157 156 155
160 161 161 162 161 159 157 155
163 163 164 163 162 160 158 156
163 164 164 164 162 160 158 157
160 161 162 162 162 161 159 158
158 159 161 161 162 161 159 158
IDCT
<---
+128 240 0 -10 0 0 0 0 0
-24 -12 0 0 0 0 0 0
-14 -13 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
0 0 0 0 0 0 0 0

原创粉丝点击