JPEG 图片压缩算法流程详解薛晓利 JPEG 是 Joint Photographic Exports Group 的英文缩写,中文称之为联合图像专家小组。该小组隶属于 ISO 国际标准化组织, 主要负责定制静态数字图像的编码方法, 即所谓的 JPE G 算法。 JPEG 专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。如下所示: 压缩算法: (1) 有损的离散余弦变换 DCT ( Discrete Cosine Transform ) (2) 无损的预测压缩技术; 熵编码方法: (1) Huffman 编码; (2) 算术编码; 编码模式: (1) 基于 DCT 的顺序模式:编码、解码通过一次扫描完成; (2) 基于 DCT 的渐进模式: 编码、解码需要多次扫描完成, 扫描效果由粗到精, 逐级递增; (3) 无损模式:基于 DPCM ,保证解码后完全精确恢复到原图像采样值; (4) 层次模式:图像在多个空间分辨率中进行编码,可以根据需要只对低分辨率数据做解码,放弃高分辨率信息; 在实际应用中, JPEG 图像编码算法使用的大多是离散余弦变换、 Huffman 编码、顺序编码模式。这样的方式, 被人们称为 JPEG 的基本系统。这里介绍的 JPEG 编码算法的流程, 也是针对基本系统而言。基本系统的 JPEG 压缩编码算法一共分为 11 个步骤:颜色模式转换、采样、分块、离散余弦变换( DCT )、 Zigzag 扫描排序、量化、 DC 系数的差分脉冲调制编码、 DC 系数的中间格式计算、 AC 系数的游程长度编码、 AC 系数的中间格式计算、熵编码。下面,将一一介绍这 11 个步骤的详细原理和计算过程。(1) 颜色模式转换 JPEG 采用的是 YCrCb 颜色空间,而 BMP 采用的是 RGB 颜色空间, 要想对 BMP 图片进行压缩, 首先需要进行颜色空间的转换。 YCrCb 颜色空间中,Y 代表亮度, Cr,Cb 则代表色度和饱和度( 也有人将 Cb,Cr 两者统称为色度) ,三者通常以 Y,U,V 来表示,即用 U代表 Cb ,用 V 代表 Cr。 RGB 和 YCrCb 之间的转换关系如下所示: Y= ++ Cb = --++128 Cr= =-+128 一般来说,C值( 包括 Cb Cr) 应该是一个有符号的数字, 但这里通过加上 128 , 使其变为 8 位的无符号整数,从而方便数据的存储和计算。 R= Y+(Cr-128) G= Y-(Cb-128)-(Cr-128) B= Y+(Cb-128) (2) 采样研究发现, 人眼对亮度变换的敏感度要比对色彩变换的敏感度高出很多。因此, 我们可以认为 Y 分量要比 Cb,Cr 分量重要的多。在 BMP 图片中, RGB 三个分量各采用一个字节进行采样, 也就是我们常听到的 RGB888 的模式;而 JPEG 图片中, 通常采用两种采样方式: YUV411 和 YUV422 ,它们所代表的意义是 Y,Cb,Cr 三个分量的数据取样比例一般是 4:1: 1 或者 4:2:2(4:1:1 含义就是:在 2x2 的单元中, 本应分别有 4个Y,4个U,4个V 值,用 12 个字节进行存储。经过 4:1:1 采样处理后, 每个单元中的值分别有 4个Y、1个U、 1个V ,只要用 6 个字节就可以存储了) 。这样的采样方式, 虽然损失了一定的精度但也在人眼不太察觉到的范围内减小了数据的存储量。当然, JPEG 格式里面也允许将每个点的 U,V 值都记录下来; (3) 分块由于后面的 DCT 变换是是对 8x8 的子块进行处理的, 因此, 在进行 DCT 变换之前必须把源图象数据进行分块。源图象中每点的 3 个分量是交替出现的, 先要把这 3 个分量分开, 存放到 3 张表中去。然后由左及右, 由上到下依次读取 8x8 的子块, 存放在长度为 64 的表中,即可以进行 DCT 变换。注意,编码时,程序从源数据中读取一个 8x8 的数据块后,进行 DCT 变换,量化,编码,然后再读取、处理下一个 8*8 的数据块。 J PEG 编码是以每 8x8 个点为一个单位进行处理的. 所以如果原始图片的长宽不是 8 的倍数, 都需要先补成 8 的倍数, 使其可以进行一块块的处理。将原始图像数据分为 8*8 的数据单元矩阵之后,还必须将每个数值减去 128 ,然后一一带入 DCT 变换公式,即可达到 DCT 变换的目的。图像的数据值必须减去 128 ,是因为 DCT 公式所接受的数字范围是-12 8 到 127 之间。(4) 离
JPEG编码解码流程 来自淘豆网m.daumloan.com转载请标明出处.