JPEG编码简单介绍
2015-03-07 10:47
134 查看
用于压缩连续色调静止图像的JPEG(Joint Photographic ExpertsGroup,联合摄影专家组)标准是由摄影专家在ITU、ISO和IEC等其他标准组织的支持下开发出来的。JPEG标准对于多媒体而言是十分重要的,因为用于压缩运动图像的标准MPEG不过是分别对每一帧进行JPEG编码,再加上某些帧间压缩和运动补偿等额外的特征。JPEG定义在10918号国际标准中,它具有4种模式和多选项,但是我们在这里只关心用于24位RGB视频的方法,并且省略了许多细节。
用JPEG对一幅图像进行编码的第一步是块预制。为明确起见,我们假设JPEG输入是一幅640*480的RGB图像,每个像素24位表示,如图7-6a所示,由于使用亮度和色度可以获得更好的压缩效果,所以从RGB值中计算出一个亮度信号和两个色度信号,对于NTSC制式,分别将其记作Y、I、Q,对于PAL制式,分别记作Y/U/V,两种制式的计算公式不同的,下面我们将使用NTSC的符号,但是压缩算法是相同的。
对于Y/I/Q构造不同的矩阵,每个矩阵其元素的取值范围在0-255之间,接下来,在I/Q矩阵中对由4个元素组成的方块进行平均,将矩阵缩小至320*240.这一缩小是有损的,但是眼睛几乎注意不到,因为眼睛对亮度比对色更加敏感,然而这样做的结构是将数据压缩了2倍。现在讲所有3个矩阵的每个元素减去128,从而将0置于取值范围的中间,最后将每个矩阵划分成8*8的块,Y矩阵有4800块,其他两个矩阵有1200块,如图7-6b所示。
JPEG的第二步是分别对7200块中的每一块应用DCT。每一个DCT的输出是一个8*8的DCT系数矩阵。DCT矩阵的(0,0)元素是块的平均值,其他元素表明每一空间频率存在多大的谱功率。对于熟悉傅里叶变换的人来说,DCT则是一种二维的空间傅里叶变换。在理论上,DCT是无损的,但是在实践中由于使用浮点数和超越函数总要引入某些舍入函数,从而导致轻微的信息损失。通过这些元素随着到(0,0)元素距离的增加而迅速衰减,如图7-7b所示。
DCT完成之后,JPEG进入到第三步,称为量化,在量化过程中不重要的DCT系数将被去除,这一变换是通过将8*8DCT矩阵中的每个元素除以取自一张表中的权值而实现的。如果所有权值都是1,那么该变量将不做任何事情。然而,如果权值随着离原点的距离而急剧增加,那么较高的空间频率将迅速衰落。
图7-8给出了这一步的一个例子,在图7-8中,我们可以看到初试DCT矩阵、量化表和通过将每一个DCT元素除以相应量化表元素所获得的结果。量化表中的值不是JPEG标准的一部分,每一应用必须提供自己的量化表,这样叫就给应用以控制自身压缩损失权衡的能力。
第四步通过将每一块的(0,0)值(左上角元素)以它与前一块中相应元素相差的量替换而减小。由于这些元素是各自所在块的平均,他们应该变化的比较缓慢,所以采用差值可以将这些元素中的大部分缩减为较小的值,对于其他元素不计算差值,(0,0)值称为DC分量,其他值称为AC分量。
第五步是将64个元素线性化,并且对线性化得到的列表进行行程编码。从左到右然后从上到下地对块进行扫描不能将零集中在一起,所以采用了Z字形的扫描模式,如图7-9所示,在本例中,Z字形模式最终在矩阵的尾部产生了38个连续的0,这一串0可以缩减为一个计算表明有38个0.
现在我们得到一个代表图像的数字列表,在第六步将采用Huffman编码对列表的数字进行编码以用于存储或传输。
JPEG看来似乎十分复杂,这是因为它确实很复杂。尽管如此,由于它通常可以获得20:1或更好的压缩效果,所以获得广泛的应用,解码一幅图像JPEG需要反过来运行上述算法。JPEG大体上是对称的,解码一幅图像话费的时间与编码一幅图像时间基本相同。
用JPEG对一幅图像进行编码的第一步是块预制。为明确起见,我们假设JPEG输入是一幅640*480的RGB图像,每个像素24位表示,如图7-6a所示,由于使用亮度和色度可以获得更好的压缩效果,所以从RGB值中计算出一个亮度信号和两个色度信号,对于NTSC制式,分别将其记作Y、I、Q,对于PAL制式,分别记作Y/U/V,两种制式的计算公式不同的,下面我们将使用NTSC的符号,但是压缩算法是相同的。
对于Y/I/Q构造不同的矩阵,每个矩阵其元素的取值范围在0-255之间,接下来,在I/Q矩阵中对由4个元素组成的方块进行平均,将矩阵缩小至320*240.这一缩小是有损的,但是眼睛几乎注意不到,因为眼睛对亮度比对色更加敏感,然而这样做的结构是将数据压缩了2倍。现在讲所有3个矩阵的每个元素减去128,从而将0置于取值范围的中间,最后将每个矩阵划分成8*8的块,Y矩阵有4800块,其他两个矩阵有1200块,如图7-6b所示。
JPEG的第二步是分别对7200块中的每一块应用DCT。每一个DCT的输出是一个8*8的DCT系数矩阵。DCT矩阵的(0,0)元素是块的平均值,其他元素表明每一空间频率存在多大的谱功率。对于熟悉傅里叶变换的人来说,DCT则是一种二维的空间傅里叶变换。在理论上,DCT是无损的,但是在实践中由于使用浮点数和超越函数总要引入某些舍入函数,从而导致轻微的信息损失。通过这些元素随着到(0,0)元素距离的增加而迅速衰减,如图7-7b所示。
DCT完成之后,JPEG进入到第三步,称为量化,在量化过程中不重要的DCT系数将被去除,这一变换是通过将8*8DCT矩阵中的每个元素除以取自一张表中的权值而实现的。如果所有权值都是1,那么该变量将不做任何事情。然而,如果权值随着离原点的距离而急剧增加,那么较高的空间频率将迅速衰落。
图7-8给出了这一步的一个例子,在图7-8中,我们可以看到初试DCT矩阵、量化表和通过将每一个DCT元素除以相应量化表元素所获得的结果。量化表中的值不是JPEG标准的一部分,每一应用必须提供自己的量化表,这样叫就给应用以控制自身压缩损失权衡的能力。
第四步通过将每一块的(0,0)值(左上角元素)以它与前一块中相应元素相差的量替换而减小。由于这些元素是各自所在块的平均,他们应该变化的比较缓慢,所以采用差值可以将这些元素中的大部分缩减为较小的值,对于其他元素不计算差值,(0,0)值称为DC分量,其他值称为AC分量。
第五步是将64个元素线性化,并且对线性化得到的列表进行行程编码。从左到右然后从上到下地对块进行扫描不能将零集中在一起,所以采用了Z字形的扫描模式,如图7-9所示,在本例中,Z字形模式最终在矩阵的尾部产生了38个连续的0,这一串0可以缩减为一个计算表明有38个0.
现在我们得到一个代表图像的数字列表,在第六步将采用Huffman编码对列表的数字进行编码以用于存储或传输。
JPEG看来似乎十分复杂,这是因为它确实很复杂。尽管如此,由于它通常可以获得20:1或更好的压缩效果,所以获得广泛的应用,解码一幅图像JPEG需要反过来运行上述算法。JPEG大体上是对称的,解码一幅图像话费的时间与编码一幅图像时间基本相同。
相关文章推荐
- 简单的jpeg编码程序
- base64 编码简单介绍
- 简单jpeg编码程序
- Nio简单介绍,本地操作,通道,缓冲区的简单使用,编码和解码
- UTF - 8 编码格式简单介绍
- 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
- 图像视频编码和FFmpeg(4)-----h264格式简单介绍
- iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用
- 简单的jpeg编码程序
- 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
- 字符编码简单介绍
- 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
- iOS监听模式系列之键值编码KVC、键值监听KVO的简单介绍和应用
- 简单的jpeg编码程序
- 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
- 最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)
- linux共享内存简单介绍以及编码演示
- 地理编码与反地理编码的简单介绍
- 数据库访问简单实现edainfo-model(一)——简要介绍
- 电子词典软件也能跨平台--简单介绍我创造的LAVA