为一个基本的图像压缩方式,JPEG 已经得到了广泛的运用,但 JPEG 相关的基本原理,却
经常被忽视,或解释得很不确切。这里我们详细讨论一下 JPEG 的编码原理,并结合实例
来给出一个更加感性的认识。JPEG 编码的详细过程有着诸多的信息可以给我们巨大的启
发,我们在这里讨论的就是要对这些信息做一个具体细致的分析,通过我们的讨论,大家
会对 JPEG 编码过程中出现的内容有一个确切的了解,并且能了解到这些内容的来龙去脉。
一、系统架构
本文以一个实际的产品为例,来说明 JPEG 在其中的应用。
本系统为一个嵌入式 Linux 网络播放器,主要的功能为播放家庭网络中的多媒体文件,在
家庭客厅等环境中有着大量的应用,它可以给用户提供更方便快捷的媒体文件的播放方式,
并能充分利用家庭音响系统的巨大功能,而非 PC 环境下有限的外部设备,大大改善了媒
体文件的播放体验。
系统主要的功能包括:
本系统架构如下图:
本系统是基于嵌入式 Linux 的一个应用,使用的是 ucLinux 2.4.22,并使用了
microwindows 作为 GUI 界面,底层使用了 Linux kernel 的 FrameBuer 作为显示输
出。
此系统在两个方面使用到了 JPEG 库:
1、 UI 的显示,即各种人机交互界面,考虑到用户体验,所以大量使用了贴图来美化 UI
2、 JPEG 图片文件的全屏播放,包括用户手中的各种照片等
二、JPEG 概述
JPEG 是 Joint Photographic Experts Group 的缩写,即 ISO 和 IEC 联合图像专家组,
负责静态图像压缩标准的制定,这个专家组开发的算法就被称为 JPEG 算法,并且已经成
为了大家通用的标准,即 JPEG 标准。 JPEG 压缩是有损压缩,但这个损失的部分是人的
视觉不容易察觉到的部分,它充分利用了人眼对计算机色彩中的高频信息部分不敏感的特
点,来大大节省了需要处理的数据信息。
人眼对构成图像的不同频率成分具有不同的敏感度,这个是由人眼的视觉生理特性所决定
的。如人的眼睛含有对亮度敏感的柱状细胞 1.8 亿个,含有对色彩敏感的椎状细胞 0.08
亿个,由于柱状细胞的数量远大于椎状细胞,所以眼睛对亮度的敏感程度要大于对色彩的
敏感程度。
总体来说,一个原始图像信息,要对其进行 JPEG 编码,过程分两大步:
1、 去除视觉上的多余信息,即空间冗余度
2、 去除数据本身的多余信息,即结构(静态)冗余度
1、去除视觉上的多余信息
当你拿到一个原始未经处理的图像,是由各种色彩组成的,即在一个平面上,有各种色彩,
而这个平面是由水平和垂直方向上的很多点组成的。实际上,每个点的色彩,也即计算机
能表示的每个像素点的色彩,能分解成红、绿、蓝,即 RGB 三元色来表示,即这三种颜
色的一定比例的混合就能得到一个实际的色彩值。
所以,实际上,这个平面的图像,可以理解为除了水平 X 和垂直 Y 以外,还有一个色彩值
的 Z 的三维的系统。Z 代表了三元色中各个分支 R/G/B 的混合时所占的具体数值大小,
每个像素的 RGB 的混合值可能都有所不同,各个值有大有小,但临近的两个点的 R/G/B
三个值会比较接近。
由于这个原始图像是由很多个独立的像素点组成的,也就是说它们都是分散的,离散的。
比如有些图像的尺寸为 640X480,就表示水平有 640 个像素点,垂直有 480 个像素点。
从上面的内容,我们可以知道两个相邻的点,会有很多的色彩是很接近的,那么如何能在
最后得到的图片中,尽量少得记录这些不需要的数据,也即达到了压缩的效果。
这个就要涉及到图像信号的频谱特性了。
图像信号的频谱线一般在 0-6MHz 范围内,而且一幅图像内,包含了各种频率的分量。但
包含的大多数为低频频谱线,只在占图像区域比例很低的图像边缘的信号中才含有高频的
谱线。这个是对 JPEG 图像压缩的理论依据。
因此具体的方法就是,在对图像做数字处理时,可根据频谱因素分配比特数:对包含信息
量大的低频谱区域分配较多的比特数,对包含信息量低的高频谱区域分配较少的比特数,
而图像质量并没有可察觉的损伤,达到数据压缩的目的。
将原始图像这个色彩空间域,转换为频谱域,怎么转呢,这个就用到了数学上的离散余弦
变换,即 DCT(Discrete Cosine Transform) 变换。
DCT 是可逆的、离散的正交变换。变换过程本身虽然并不产生压缩作用,但是变换后的频
率系数却非常有利于码率压缩。即这个变换过程得到一个 DCT 变换系数,而对这个系数
可以再进行更进一步的处理,即所谓的量化。经过量化,就能达到数据压缩的作用了。
总体说来,这第一步,对图像进行编码,去除多余的信息,要用到 DCT 变换中的正向
DCT(FDCT),然后再对变换的系数做量化(Quantization),这个过程就是依据的经
验值,来处理人眼视觉系统所不敏感的高频数据,从而极大地减少了需要处理的数据量,
这个是结合数学方法与经验值而做的处理。
2、去除数据本身的多余信息
利用 Human 编码,来将最后的数据用无损的方式做压缩,这个是纯数学上的处理方式。
总体来说,上面的两步即:
如果处理的是彩色图像,JPEG 算法首先将 RGB 分量转化成亮度分量和色差分量,同时丢
失一半的色彩信息(空间分辨率减半)。然后,用 DCT 来进行块变换编码,舍弃高频的
系数,并对余下的系数进行量化以进一步减小数据量。最后,使用 RLE 行程编码和
Human 编码来完成压缩任务。
三、JPEG 原理详细分析
下面将更加详细地介绍这两步中的各个细节。
JPEG 编码中主要涉及到的内容主要包括:
1. Color Model Conversion (色彩模型)
2. DCT (Discrete Cosine Transform 离散余弦变换)
3. 重排列 DCT 结果
4. 量化
5. RLE 编码
6. 范式 Human 编码
7. DC 的编码
1、色彩空间 color space
在图像处理中,为了利用人的视角特性,从而降低数据量,通常把 RGB 空间表示的彩色
图像变换到其他色彩空间。
现在采用的色彩空间变换有三种:YIQ,YUV 和 YCrCb。
每一种色彩空间都产生一种亮度分量信号和两种色度分量信号,而每一种变换使用的参数
都是为了适应某种类型的显示设备。
YUV 不是哪个英文单词的缩写,而只是符号,Y 表示亮度,UV 用来表示色差,U、V 是
构成彩色的两个分量;
YUV 表示法的重要性是它的亮度信号(Y)和色度信号(U、V)是相互独立的,也就是 Y 信号
分量构成的黑白灰度图与用 U、V 信号构成的另外两幅单色图是相互独立的。由于
Y、U、V 是独立的,所以可以对这些单色图分别进行编码。此外,黑白电视能接收彩色电
视信号也就是利用了 YUV 分量之间的独立性。