Coder
分类: C/C++
2011-03-17 12:36:21
3.1.87 MCU行:在扫描中的每一个成分里,包含一行的采样值或一个块行的数量最少的MCU序列。
3.1.88 最小编码单元MCU:编码的最小数据组。
3.1.109 重新启动间隔:一个扫描内作为一个独立的序列处理的MCU的个数(整数)。
4.8 多颜色成分控制
4.3和4.4小节概述了编码和解码过程的主要部分 – 那些为了实现压缩而在采样值上进行的操作。还有另外一个主要的部分 – 由多种颜色成分的图像数据来创建压缩数据的处理次序的控制程序,以及确保适当的表集合被应用于图像里适当的数据单元的程序。(对于无损过程一个数据单元是一个样品,对于基于DCT的过程,一个数据单元是一个8 × 8 小块的采样值。)
4.8.1 交叉存储的多颜色成分
图11显示了一个例子,该例子说明了一个编码过程在进行编码时是如何在多个源图像色彩成分间及多个表数据集合间进行选择的。例子中的源图像由三种颜色成分A、B和C组成,有两个表规范集合。(这个简化的视图不在量化表和熵编码表之间作区分。)
在顺序模式中,如果编码器在开始压缩颜色成分B之前,就压缩了颜色成分A的所有图像数据单元,然后在C之前压缩了B成分的所有图像数据单元,则编码是非交替的。如果编码器压缩一个A的数据单元,一个B的数据单元,一个C的数据单元,然后回到A,等等,则编码是交替的。这些备选方案,都在图12中示出了,所示的例子其所有的三个颜色具有相同尺寸:X列Y行,每一个都有总数为n个的数据单元。
这些控制程序也能处理源图像色彩成分具有不同尺寸的情况。图13给出了一个例子,这个例子里,其中的两种颜色成分,B和C,相对于颜色成分A,只具有一半的水平采样值的个数。在这个例子中,A成分的两个数据单元和来自于B及C成分的各一个数据单元是交替的。对于那些图像色彩成分具有复杂关系的情况,比如不同的水平和垂直尺寸,也能以同样的方式处理。(参见附录A。)
笔者注:在这个地方,有一个问题,就是采样因子较大的分量,它的DU是如何与采样因子较小的分量对应的。比如对于Y分量的水平和垂直采样因子均为2,而U和V分量其水平和垂直采样因子均为1的情况,因为一个MCU是完整的描述了一个64X64的像素矩阵色彩信息的,包括YUV三个分量的。假如某图的第一个MCU中包含的四个Y分量的DU分别为A0_0,A0_1,A1_0,A1_1,包含的一个U、V分量的DU分别为B0_0,C0_0,它们共同来描述最左上角的一个16X16像素的小方块的完整的信息,则最左上角的8X8像素小方块的完整色彩信息由A0_0、B0_0和C0_0来描述,右侧紧挨着它的8X8像素小方块的完整色彩信息为A0_1、B0_0和C0_0,下侧紧挨着的为A1_0、B0_0和C0_0,而右下侧的为A1_1、B0_0和C0_0,依次类推。比如对于图13的例子,A1、B1、C1描述一个8X8像素小方块,A2、B1、C1描述右侧紧挨着的8X8像素小方块。
4.8.2 最小编码单元
与多颜色成分交替的概念相关的是最小编码单元(MCU)。如果压缩图像数据是非交替的,则MCU被定义为一个数据单元。例如,在图12中,非交替的情况的MCU是一个单独的数据单元。如果压缩数据是交替的,则MCU包含每一个颜色成分的一个或多个数据单元。对于图12中的交替的情况,(第一个)MCU由三个交替的数据单元A1、B1和C1组成。在图13所示的例子中,(第一个)MCU由四个数据单元A1、A2、B1和C1组成。
A.2 源图像数据单元编码的次序
扫描头(参见B.2.3)详述了源图像数据单元被编码的次序,以及在压缩图像数据中的放置次序。对于一个给定的扫描,如果扫描头参数Ns = 1,则扫描内只有一个源色彩成分数据 – 由参数Cs1描述的成分。根据定义,该数据是非交替的。如果Ns > 1,则扫描中会有从Cs1至CsNs描述的Ns种颜色成分的数据。该数据应该总是交替的。扫描中颜色成分出现的次序取决于帧头中描述的次序。
数据单元的次序,及最小编码单元(MCU)的构建定义如下。
A.2.1 最小编码单元(MCU)
对于非交替式的数据,MCU是一个数据单元。对于交替的数据,MCU是一个由扫描中色彩成分的采样因子定义的数据单元序列。
A.2.2 非交替式的次序(Ns = = 1)
当Ns = 1(Ns是一个扫描中成分的个数)时,一个扫描中数据单元的次序应为从左至右,从上到下,如图A.2所示。这个次序适用于所有Ns = 1的情况,而与H1和V1的值无关。
当Ns > 1时,每一个扫描成分Csi被分隔成Hk个水平数据单元,Vk个垂直数据单元的矩形的阵列。下标k标明,Hk和Vk来自于帧头的成分规范中Ck = Csi的位置。每一个Hk列Vk行的矩形,数据单元从左到右,从上到下排序。而每一成分的阵列同样以从左到右和从上到下的次序排列。
如图A.3中所示的例子,MCU1的组成为,首先是取自于Cs1区域的最左上角的那些数据单元,接着是取自于Cs2的相应区域的数据单元,然后是Cs3和Cs4.MCU2以同样的次序从四个成分里MCU1的右侧的下一个区域取数据。
A.2.4 不完整的MCU的补足
对于基于DCT的过程,数据单元是一个块。如果xi不是8的整数倍,则编码过程应该扩展列的数目来补足最右侧的采样块。如果成分是交替的,若需要,则编码过程应该扩展一个或多个额外块的采样,以此来使块的个数是Hi的整数倍。相似的,如果yi不是8的整数倍,则编码过程应该扩展行的个数来补足最下面的块行。如果成分是交替的,若需要,则编码过程应该扩展一个或多个块行的行数,以使块行的个数是Vi的整数倍。
注意 – 建议采用复制每一成分的最右侧的列和最底层的行方式来补足那些不完整的MCU。
对于无损过程,数据单元是一个样值。如果成分是交替的,若需要,则编码过程应该扩展样值的数量,以使列数是Hi的整数倍。相似地,若需要,编码过程应该扩展行数,以使行数为Vi的整数倍。
由编码过程添加的用于补足那些不完整的MCU的所有样值应该由解码过程来移除。