编解码比特流的方法和装置

申请号 CN201180072369.8 申请日 2011-07-18 公开(公告)号 CN103814396B 公开(公告)日 2017-03-08
申请人 汤姆逊许可公司; 发明人 江文斐; 蔡康颖; 陈志波;
摘要 在3D网格编码时,通过基于空间树的方法来压缩几何数据。从用于编码3D 网格模型 的基于空间树的方法的树结构的遍历产生的比特流具有对称的特殊冗余,利用它来进一步改进网格模型压缩。一种编码比特流的方法,包括以下步骤:定义(51)二进制码元的至少第一和第二码元组,S1是S2的子集;确定(52)该比特流内的第一区段J1,J2)、第二区段(K1)和第三区段(N1,N2,N3),其中第一区段具有Th1个或更多个连续S1码元,第二区段具有Th2个或更多个连续S2码元;编码54)该比特流,其中,使用不同的代码来编码54A,54B,54C)第一区段、第二区段和第三区段;并且编码(55)指示该比特流中第一、第二和第三区段之间的边界 位置 的值(C1)。
权利要求

1.一种编码比特流的方法,所述方法包括以下步骤:
至少定义(51)二进制码元的第一码元组和第二码元组,其中第一码元组(S1)是第二码元组(S2)的子集;
确定(52)该比特流内的两个或者更多个第一区段(J1,J2),零个或者更多个第二区段(K1)和两个或者更多个第三区段(N1,N2,N3),其中每个第一区段至少具有第一预定义数量(Th1)个连续的第一码元组(S1)的码元,每个第二区段至少具有第二预定义数量(Th2)个连续的第二码元组的码元,并且其中比特流的剩余部分是第三区段(N1,N2,N3);
确定(53)该比特流中仅仅包括所述第一区段和所述第三区段的至少一个的部分(H2);
编码(54)该比特流,其中使用第一代码编码(54A)所述第一区段,使用第二代码编码(54B)所述第二区段,使用第三代码编码(54C)所述第三区段;以及
编码(55)用于指示该比特流中的第一、第二和第三区段之间的边界位置的值(C1),其中在仅仅包括所述第一区段和所述第三区段的至少一个所述部分(H2)中,如果所述部分(H2)中所包括的第三区段具有预定义的长度,则隐含地编码所述部分(H2)中所包括的第一区段(J1,J2)和相邻的第三区段之间的边界位置。
2.根据权利要求1的方法,其中第一码元组(S1)包括具有一个比特被设置为1和剩余比特被设置为0的二进制码元,第二码元组(S2)包括具有一个或两个比特被设置为1和剩余比特为0的二进制码元。
3.根据权利要求1的方法,其中该比特流表示3D网格模型的遍历八叉树表示。
4.根据权利要求1的方法,其中编码(54)包括使用基于第一码元集(Smb1)的第一代码的第一编码(54A),使用基于第二码元集(Smb2)的第二代码的第二编码(54B)和使用基于第三码元集(Smb3)的第三代码的第三编码(54C),并且其中同时执行第一、第二和第三编码(54A,54B,54C)的至少一部分。
5.根据权利要求1的方法,其中在比特流的开始处编码解码器控制信息,该解码器控制信息包括用于指示比特流的第一、第二和第三区段之间的边界位置的所述值(C1)。
6.根据权利要求1的方法,其中该比特流中的第一、第二和第三区段的边界位置或者长度被编码为值序列(cmax,…,c0),其中对于比特流的第一部分(H1)和对于第二部分(H2)的第一区段,如果不跳过边界,则以单调顺序编码表示边界位置的值,并且其中所述部分(H2)中所包括的第一区段(J1,J2)和相邻的第三区段之间的边界位置的所述隐含编码包括交换所述第一区段的下界和上界的边界顺序,其中第一部分(H1)包括所述零个或者更多个第二区段(K1)和所述第三区段的至少一个,第二部分(H2)包括所述两个或者更多个第一区段(J1,J2)和所述第三区段的至少一个。
7.根据权利要求1的方法,其中,所述比特流的包括在所述部分(H2)中的第三区段的所述预定义的长度是1。
8.一种解码比特流的方法,包括以下步骤:
从比特流的开始处解码(61)包括第一、第二和第三区段的长度的控制信息(C1);
根据所述控制信息确定(62)该比特流内的至少两个或者更多个第一区段(J1,J2),零个或者更多个第二区段(K1)和两个或者更多个第三区段(N1,N2,N3),其中每个第一区段具有连续的第一码元组(S1)的码元,每个第二区段具有连续的第二码元组(S2)的码元,并且第三区段具有第三码元组(S3)的码元,其中所述零个或者更多个第二区段(K1)和所述第三区段的至少一个处于该比特流的连续第一部分(H1)中,并且所述至少两个或者更多个第一区段(J1,J2)和所述第三区段的至少一个处于该比特流的连续的第二部分(H2)中;
基于第一码元组(S1),使用第一码元解码器将所述至少两个或者更多个第一区段(J1,J2)的连续码元解码(64A)为固定长度的码元;
如果确定至少一个第二区段(K1),基于第二码元组(S2)使用第二码元解码器将所述零个或者更多个第二区段(K1)的连续码元解码(64B)为固定长度的码元,其中第二码元组(S2)包括第一码元组(S1)的所述码元和附加码元;以及
基于第三码元组(S3),使用第三码元解码器将所述两个或者更多个第三区段(N1,N2,N3)的码元解码(64C)为固定长度的码元;以及
根据所述控制信息以相继的顺序提供(66)解码后的该比特流中的第一、第二和第三区段的码元。
9.根据权利要求8的方法,其中第一码元组包括具有一个比特被设置为1和剩余比特为
0的二进制码元,第二码元组包括具有一个或两个比特被设置为1和剩余比特为0的二进制码元。
10.根据权利要求8的方法,其中该比特流表示3D网格模型的遍历八叉树表示。
11.根据权利要求8的方法,其中从该比特流的开始处解码(61)控制信息(C1)的步骤包括:解码指示比特流中的第一、第二和第三区段的边界位置的值序列(cmax,…,c0),其中表示比特流的第一部分(H1)的边界位置的值具有单调的顺序,并且其中表示比特流的第二部分(H2)的第一区段(J1,J2)的边界位置的值具有单调的顺序,该方法还包括步骤:
检测(66B)表示具有交换的单调顺序的比特流的第二部分(H2)中的边界位置的至少一对值(c3,c4);以及
根据所述值之一在边界位置插入(66C)具有根据所述至少一对值(c3,c4)之间的差的长度的所述第三区段之一。
12.根据权利要求8所述的方法,其中至少部分地同时执行:解码(64A)至少两个或者更多个第一区段(J1,J2),在确定至少一个第二区段(K1)的情况下,解码(64B)所述零个或者更多个第二区段(K1),以及解码(64C)所述两个或者更多个第三区段(N1,N2,N3),并且其中提供(66)解码后的比特流的第一、第二和第三区段的码元的步骤包括重新排序(66A)所述第一、第二和第三区段。
13.一种编码比特流的装置(700),包括:
定义模(751),至少定义二进制码元的第一码元组和第二码元组,其中第一码元组(S1)是第二码元组(S2)的子集;
第一确定模块(752),确定该比特流内的两个或者更多个第一区段(J1,J2),零个或者更多个第二区段(K1)和两个或者更多个第三区段(N1,N2,N3),其中每个第一区段至少具有第一预定义数量(Th1)个连续的第一码元组(S1)的码元,每个第二区段至少具有第二预定义数量(Th2)个连续的第二码元组的码元,并且其中比特流的剩余部分是第三区段(N1,N2,N3);
第二确定模块(753),确定该比特流中仅仅包括所述第一区段和所述第三区段的至少一个的部分(H2);
第一编码模块(754),编码该比特流,其中使用第一代码在第一子编码器(754A)中编码所述第一区段,使用第二代码在第二子编码器(754B)中编码所述第二区段,使用第三代码在第三子编码器(754C)中编码所述第三区段;
第二编码模块(755),编码用于指示该比特流中的第一、第二和第三区段之间的边界位置的值(C1),其中在仅仅包括所述第一区段和所述第三区段的至少一个的所述部分(H2)中,如果所述部分(H2)中所包括的第三区段具有预定义的长度,则隐含地编码所述部分(H2)中所包括的第一区段(J1,J2)和相邻的第三区段之间的边界位置。
14.一种解码比特流的装置(800),包括:
第一解码模块(861),从比特流的开始处解码控制信息(C1);
第一确定模块(862),根据所述控制信息确定该比特流内的至少两个或者更多个第一区段(J1,J2),零个或者更多个第二区段(K1)和两个或者更多个第三区段(N1,N2,N3),其中每个第一区段具有连续的第一码元组(S1)的码元,每个第二区段具有连续的第二码元组(S2)的码元,并且第三区段具有第三码元组(S3)的码元,其中所述零个或者更多个第二区段(K1)和所述第三区段的至少一个处于该比特流的连续第一部分(H1)中,并且所述至少两个或者更多个第一区段(J1,J2)和所述第三区段的至少一个处于该比特流的连续的第二部分(H2)中;
第二解码模块(864)包括:
第一解码子模块(864A),基于第一码元组(S1),使用第一码元解码器将所述至少两个或者更多个第一区段(J1,J2)的连续码元解码为固定长度的码元;
第二解码子模块(864B),在确定了至少一个第二区段(K1)的情况下,使用第二码元解码器将所述零个或者更多个第二区段(K1)的连续码元解码为固定长度的码元;
第三解码子模块(864C),基于第三码元组(S3),使用第三码元解码器将所述两个或者更多个第三区段(N1,N2,N3)的码元解码为固定长度的码元;以及
重构和输出模块(866),根据所述控制信息以相继的顺序提供解码后的比特流中的第一、第二和第三区段的码元。
15.根据权利要求14的装置,其中用于从比特流的开始处解码控制信息(C1)的解码模块(861)执行对指示比特流中的第一、第二和第三区段的边界位置的值序列(cmax,…,c0)的解码,其中表示比特流的第一部分(H1)的边界位置的值具有单调的顺序,并且其中表示比特流的第二部分(H2)的第一区段(J1,J2)的边界位置的值具有单调的顺序,并且其中所述解码模块(861)还包括:
检测模块(866B),检测表示具有交换的单调顺序的比特流的第二部分(H2)中的边界位置的至少一对值(c3,c4);以及
插入模块(866C),根据所述值之一在边界位置插入具有根据所述至少一对值(c3,c4)之间的差的长度的所述第三区段之一。

说明书全文

编解码比特流的方法和装置

技术领域

[0001] 本发明涉及一种树结构的自适应熵编码的方法,以及一种对应的装置。此外,本发明涉及一种树结构的自适应熵解码的方法,以及一种对应的装置。

背景技术

[0002] 熵编码已经被研究了数十年。基本上,存在三种类型的熵编码方法:类似于霍夫曼编码的变长编码(VLC)、算术编码,以及类似于Lempel-Ziv压缩或者Lempel-Ziv-Welch压缩的基于字典的压缩。VLC编码使用整数个比特来表示每个码元。霍夫曼编码是被最广泛使用的VLC方法。它向具有较大概率的码元分配较少的比特,而向具有较小概率的码元分配更多的比特。然而,如果每个码元的概率不是1/2的整数幂,则霍夫曼编码可能不是最优的。相反,算术编码可以向每个码元分配少量比特,使得它可以更好地接近一组数据的熵。霍夫曼编码和算术编码已经被广泛地用于现有的图像/视频压缩标准,例如,JPEG,MPEG-2,H.264/AVC。Lempel-Ziv(LZ)或者Lempel-Ziv-Welch(LZW)利用基于表格的压缩模型,其中对于重复的数据串替换表格条目。对于多数LZ方法,从较早输入的数据中动态地生成该表格。该算法被设计地更快地实现,但是通常不是最优的,这是因为它仅仅执行数据的有限的分析。这种类别的算法已经在GIF,Zip,PNG和一些其它标准中采用。
[0003] 在3D网格编码中,通常通过基于空间树的方法,例如基于kd树[OG00]或者基于八叉树[PK05]来压缩几何数据。这些算法通过一些空间树来组织输入空间点。然后,它们遍历树结构并且记录必要的信息用于稍后恢复输入点。在构建空间树的同时,单元(cell)被递归地细分,直到每个非空的单元小到仅仅包含一个顶点并且使得足以精确地重构顶点位置。初始地,围绕3D模型的所有点构造边界框。在开始时,所有3D点的整个边界框被视为是单个单元。由于可以从对应单元的边界框中恢复顶点位置,基于空间树的算法包括它们可以实现多分辨率压缩并且与单分辨率压缩算法相同的压缩率。
[0004] 利用每次迭代,[OG00]将一个单元细分为两个子单元,并且编码两个子单元之一中的多个顶点,如图1所示。如果父单元包含p个顶点,则可以利用算术编码器使用log2(p+1)个比特来编码子单元之一中的多个顶点。
[0005] 另一方面,[PK05]在每次迭代中将一个非空单元细分为八个子单元。对于每个八叉树单元细分,几何编码器对数量T(1≤T≤8)个非空子单元和KT=C8T个可能组合中的非空子单元的配置进行编码。当直截了当地编码数据时,T取3个比特并且非空子单元配置取log2KT个比特。为了提高编码效率,[PK05]对每个子单元估计不为空的伪概率。根据概率降序来适应子单元的遍历顺序。为了容易说明,在图2中示出了导致四叉树子单元的2D示例,以及产生的编码字。通过箭头来表示遍历顺序。
[0006] 然而,总是期望改进压缩以便实现更高的压缩率。具体地,期望在没有数据损失的情况下实现这一点,即,一种允许全质量解压缩、导致(准)无损再现的方法。

发明内容

[0007] 本发明是基于对以下事实的认识:如果比特流从用于编码3D网格模型的基于空间树的树结构的遍历方法中产生,则该比特流系统地具有特殊的冗余,并且可以利用这一点来进一步改进网格模型的压缩。具体地,可以对基于树的方法,诸如例如,对基于四叉树或基于八叉树方法,实现更高的压缩效率,其中每个单元细分产生不止两个子单元。
[0008] 因此,本发明提供了至少一种编码比特流的方法、一种解码所编码的比特流的方法、一种编码比特流的装置,和一种解码所编码的比特流的装置。
[0009] 基本地,一种编码比特流的方法,包括以下步骤:定义二进制码元的至少第一和第二码元组,S1是S2的子集;确定该比特流内的第一区段、第二区段和第三区段,其中第一区段具有Th1个或更多个连续S1码元,第二区段K具有Th2个或更多个连续S2码元;编码该比特流,其中,使用不同的代码来编码第一区段、第二区段和第三区段;并且编码指示该比特流中第一、第二和第三区段之间的边界位置的值。
[0010] 在一个实施例中,一种编码比特流的方法包括以下步骤:
[0011] 定义二进制码元的至少第一和第二码元组,其中第一码元组是第二码元组的子集;
[0012] 确定该比特流内的两个或者更多个第一区段,零个或者多个第二区段和两个或者更多个第三区段,其中每个第一区段具有第一码元组的至少Th1个连续码元,每个第二区段具有第二码元组的至少Th2个连续码元(但不是第一码元组的至少Th1个连续码元),并且其中比特流的剩余部分是第三区段;
[0013] 确定该比特流中仅仅包括第一和第三区段的部分;
[0014] 编码比特流,其中使用第一代码编码所述第一区段,使用第二代码编码所述第二区段(如果存在),使用第三代码编码所述第三区段;其中还编码用于指示该比特流中的第一、第二和第三区段之间的边界位置的值,其中在仅仅包括第一和第三区段的所述部分中,如果第三区段具有预定义的长度,跳过对第一区段和相邻的第三区段之间的边界位置的编码,并且如果第三区段具有与预定义的长度不同的长度,进行隐含地编码。
[0015] 即,比特流的每个第三区段不具有第一码元组的至少Th1个连续码元和第二码元组的至少Th2个连续码元。典型地,比特流的第三区段是非常短的并且仅仅包括非常少的码元,通常是仅仅一个码元。
[0016] 对第二部分中的第一区段和相邻的第三区段之间的边界位置进行不同类型的隐含编码是可能的,例如,通过交换两个相邻边界位置(其可以被确定,因为边界位置具有单调的递增或者递减顺序),或者通过可以是单独的或者附接到另一边界位置值的换码序列(escape sequence),或者通过被不同存储的码元。
[0017] 在一个实施例中,被跳过的边界位置(即,跳过对其进行的编码)是该比特流的所述部分内的第三区段的左侧(或者初始的,或者开放的)边界。在另一个实施例中,被跳过的边界位置是该比特流的所述部分内的第三区段的右边(或者最终的,或者闭合)边界。
[0018] 在一个方面中,一种编码比特流的方法包括以下步骤:
[0019] 定义二进制码元的至少第一和第二码元组,其中第一码元组比第二码元组包括较少的码元,并且第一码元组的码元也被包括在第二码元组中;
[0020] 确定该比特流内的两个或者更多个第一区段、零个或者多个第二区段和两个或者更多个第三区段,其中每个第一区段至少具有第一码元组的定义的第一最小数量个连续码元,每个第二区段至少具有第二码元组的定义的第二最小数量个连续码元,两个或者更多个第三区段包括比特流的剩余部分;
[0021] 将比特流分割为至少连续的第一部分和连续的第二部分,其中第一部分包括所述第三区段和所述零个或者多个第二区段中的至少一个,第二部分包括所述第一区段和所述至少两个第二区段中的至少一个;
[0022] 编码比特流,其中在第一编码器中使用第一代码编码所述一个或多个第一区段,在第二编码器中使用第二代码编码所述一个或多个第二区段,在第三编码器中使用第三代码编码所述一个或多个第三区段;以及
[0023] 编码比特流中的第一、第二和第三区段的长度(或者相应地边界位置),其中至少在第二部分中,如果该长度是预定义的长度(即,边界位置具有距离预定义的相邻边界位置的预定义距离),那么跳过编码第一区段的长度(或者边界位置的至少之一)。
[0024] 换句话说,构建比特流的第二部分使得它不包括任何第三区段。在一个实施例中,它是比特流的最终部分。在一个实施例中,在确定各个区段时,累计相等类型的相邻区段,使得流中的相邻区段总是具有不同的类型。
[0025] 在一个方面,一种编码比特流的装置包括一个或者多个处理部件,包括:
[0026] 处理部件,定义二进制码元的至少第一和第二码元组,其中第一码元组是第二码元组的子集;
[0027] 处理部件,确定该比特流内的两个或者更多个第一区段,零个或者多个第二区段和两个或者更多个第三区段,其中每个第一区段至少具有第一码元组的Th1个连续码元,每个第二区段至少具有第二码元组的Th2个连续码元(不是第一码元组的至少Th1个连续码元),并且其中比特流的剩余部分是第三区段;
[0028] 处理部件,确定该比特流中仅仅包括第一和第三区段的部分;
[0029] 编码部件,编码比特流,其中使用第一代码在第一编码器中编码所述第一区段,使用第二代码在第二编码器中编码所述第二区段(如果存在),使用第三代码在第三编码器中编码所述第三区段;以及
[0030] 边界/长度编码部件,编码用于指示该比特流中的第一、第二和第三区段之间的边界位置(或者第一、第二和第三区段的长度)的值,其中在仅仅包括第一和第三区段的所述部分中,如果第三区段具有预定义的长度(即,边界位置具有距离预定义的相邻边界位置的预定义的距离),跳过对第一区段和相邻的第三区段之间的边界位置的编码。
[0031] 一种计算机可读介质,具有使得计算机执行如上指定的方法的可执行指令。
[0032] 在从属权利要求、以下说明书附图中公开了本发明的有利实施例。

附图说明

[0033] 参照附图来描述本发明的示范性实施例,在附图中:
[0034] 图1示出了2D情形下kd-树几何编码的原理;
[0035] 图2示出了2D情形下四叉树几何编码的原理;
[0036] 图3示出了比特流的基本结构;
[0037] 图4示出了表示3D网格模型的示范性比特流;
[0038] 图5示出了编码方法的流程图
[0039] 图6示出了解码方法的流程图;
[0040] 图7示出了将比特流分解为第一、第二和第三区段的示范性方法。
[0041] 图8示出了与基于四叉树的2D几何编码比较的基于八叉树3D几何编码的原理;
[0042] 图9示出了各种示范性比特流的结构;
[0043] 图10示出了示范性的比特流的首部的结构;
[0044] 图11示出了编码比特流的装置700的框图;以及
[0045] 图12示出了解码比特流的装置700的框图。

具体实施方式

[0046] 以下实施例是基于3D网格模型的八叉树表示。本发明可以适应于其它数据集或者应用,如以下进一步定义的。3D网格编码方案的八叉树表示的基本方法在[OG00]中是已知的,并且在此文中参照图2进行了解释。尽管图2示出了2D情形下四叉树几何编码的原理,但其可以容易地适应于3D模型,如以下关于图8示出的。对于编码,当前的父单元被分解为以预定义的顺序遍历的四个子单元,并且每个子单元的单个比特指示是否在该子单元内存在点。例如在图2a)中,示出了遍历两个父单元1,2的子单元,(非空的子单元被涂上灰色)。由于遍历的第一和第三子单元10,12是非空的(即包含一个或多个点),这上用1表示,通过第一序列1010编码第一父单元1的子单元10,11,12,13。第二和第四子单元11,13是空的(即,不包含点),这用零编码。图2b)示出了使用不同遍历的相同的单元和作为结果的编码。
[0047] 图8示出了八叉树方案的父单元和子单元。在八叉树方案中,父单元被分解为八个子单元80,…,86(左下单元82后面的隐藏的一个子单元未被示出)。一种可能的遍历顺序可以是左右、上下和前后,产生单元的遍历序列80-81-82-83-84-85-(左下单元82后面的隐藏的单元)-86。相应地,在八叉树的情形下,非空子单元配置由覆盖空子单元和非空子单元的所有255种可能组合的8比特二进制表示。不需要单独编码多个非空子单元。表格1是非空子单元配置序列的示例。
[0048] 11111111
[0049] 01100110
[0050] 00111011
[0051] 11001100
[0052] …
[0053] 00010000
[0054] 00000010
[0055] 00000010
[0056] 10000000
[0057] 00000001
[0058] 表格1:子单元配置序列
[0059] 尽管以上详细地进行了描述,对于本发明而言,父单元内的子单元的遍历顺序不是非常相关。在原理上,对于本发明而言,基本上可以等效地使用任何遍历顺序。
[0060] 可以通过常规的算术编码来有效地压缩8比特码元,但是结果不如看上去那么好(即,效率)。本发明提供了一种具有提高的效率的编码方法,以及一种对应的解码方法。
[0061] 在表格2中示出了在典型的复杂3D模型(m1007)中最频繁出现的码元的分布概率。如可见的,在二进制表示中仅仅具有1个“1”的码元以压倒性的概率出现。几何解释是在若干次细分之后,顶点很少共享一个单元。根据本发明,定义其元素是任何可能的码元的码元集S0={1,2,3,…,255}。此外,定义其元素是2的整数幂的另一码元集S1={1,2,4,8,16,
32,64,128},即频繁出现的码元。已经观察到经常存在S1中包含的码元的长游程(run)。因此,概率模型被简化为仅包含S1码元的子序列中的8码元模型。
[0062]Symbol p Symbol p Symbol p Symbol p Symbol p
00000100 0.1280 00000101 0.0034 10100000 0.0020 00001010 10-3 01000100 10-3
00000010 0.1275 00001001 0.0030 00000011 0.0015 00001011 10-3 01100010 10-3
00001000 0.1167 01100000 0.0025 00010001 0.0015 00001111 10-3 01101000 10-3
10000000 0.1162 10000010 0.0025 00010010 0.0015 00011000 10-3 10111011 10-3
01000000 0.1128 10001000 0.0025 00101000 0.0015 00011100 10-3 11001100 10-3
00010000 0.1118 00000110 0.0020 00110000 0.0015 00100110 10-3 11010000 10-3
00000001 0.1108 00001100 0.0020 01010000 0.0015 00111011 10-3 11111111 10-3
00100000 0.1098 00100010 0.0020 11000000 0.0015 01000010 10-3 00000111 5·10-4[0063] 表格2:3D模型中一些八叉树码元的分布概率p
[0064] 图3示出了比特流的基本结构。该比特流具有两个第一区段J1,J2(即,第一类型J的区段),一个第二区段K1(即,第二类型K的区段)和三个第三区段N1,N2,N3(即,第三类型N的区段)。每个第一区段至少具有第一码元组S1的预定义的第一数量Th1的连续码元,每个第二区段至少具有第二码元组的预定义的第二数量Th2的连续码元,比特流的剩余部分是第三区段N1,N2,N3。也就是说,第三区段N1,N2,N3可以具有可能出现在比特流中的任何码元,但没有符合第一区段的资格的足够(即,小于预定义的第一数量Th1)的第一码元组S1的连续码元,并且没有符合第二区段的资格的足够(即,小于预定义的第二数量Th2)的第二码元组的连续码元。当然,尽管第一码元组S1是第二码元组S2的子集,符合第一区段J资格的连续码元的子序列被编码为第一区段J,并且不编码为第二区段K。原因在于第一区段可以比第二区段以更高的效率来编码。此外,第一区段J和第二区段K可以比第三区段N以更高的效率来编码,使得符合第二区段K的资格的子序列将被编码为第二区段。
[0065] 用于Th1的合适的数值(例如对于3D网格模型)在10-100的范围中,但是分别依赖于被遍历的树的输入序列、或者深度和结构的性质,可能会更高。用于Th2的合适的数值(例如对于3D网格模型)在20-200的范围中,但是分别依赖于被遍历的树的输入序列、或者深度和结构的性质,可能会更高。示范性的值是Th1=50,Th2=70。针对3D网格模型的压缩,并且具体地是针对3D网格模型中的重复的结构检测而获得的实例位置的压缩,对这些值进行优化。在将它们应用于其它应用时可以对它们进行调整。由此,尽管在一个实施例中,树的叶节点是3D网格模型的点,但是在另一实施例中,树的叶节点是多连通3D网格模型中重复结构的实例位置。
[0066] 当对子序列进行分割时,耗费几个字节来指示边界。通过利用S1或S2模型来替换S0模型的压缩改进来补偿该成本。由于S2模型比S1模型具有多得多的码元,通过利用S2替换S0模型获得的增益要少。由此,Th2应比Th1更大以便更高效。然而,对于Th2=Th1或者Th2
[0067] 还是如图3所示,在比特流的开始处编码解码器控制信息。解码器控制信息包括指示比特流的第一、第二和第三区段之间的边界位置的值C1。
[0068] 下面,给出一个示例。考虑以下码元序列:
[0069] 0212301230011323000111011011001011100001。
[0070] 存在16个零,16个“1”,4个“2”和4个“3”。所以码元序列的熵为:-16*log2(16/40)-16*log2(16/40)-4*log2(4/40)-4*log2(4/40)≈68.88。这是直接算术编码能够做得最好的。
[0071] 然而,如果将码元序列分解为两个子序列,则可以实现进一步的压缩。该第一子序列0212301230011323包括所有可能类型的码元并且以16个码元结束。它的四种码元类型均匀分布,具有熵:
[0072] -4*log2(4/16)-4*log2(4/16)-4*log2(4/16)-4*log2(4/16)=32。
[0073] 第二子序列000111011011001011100001仅仅包含两种类型的码元,即16个“0”和16个“1”,并且具有熵:
[0074] -16*log2(16/32)-16*log2(16/32)=32。
[0075] 总的熵是32+32=64。因此,可以进行进一步的改进,只要合适地给出分解点,如以下定义的。分解点表示的成本对大量码元压缩来说是微不足道的开销,并且也可以通过本发明进行优化。
[0076] 根据本发明的自适应熵编码方法,例如用于八叉树编码,如下进行工作。如上提到的,大多数八叉树码元在二进制表示中仅仅具有一个“1”。两个码元集被定义为S0={1,2,3,…,255}和S1={1,2,4,8,16,32,64,128},即,S1是二进制表示中仅仅具有1个“1”的码元。如果独立地对S1码元进行编码,这将减少熵但是带来指定这些码元的位置的比特的开销。本发明基本上仅仅通过检测和编码S1码元的长游程来优化熵减少和开销。
[0077] 为了进一步改进压缩,定义另一码元集S2={3,5,9,17,33,65,129,6,10,18,34,66,130,12,20,36,68,132,24,40,72,136,48,80,144,96,160,192,1,2,4,8,16,32,64,
128},其元素是在二进制表示中具有至多两个(即,一个或两个)“1”的码元。编码在S2中包含的码元组也在某些情况下改进了压缩。由此,本发明采用两个或者三个算术编解码器来独立地编码和/或解码不同码元集内的码元。在一个实施例中,两个或者三个算术编解码器同时操作,或者至少在部分时间重叠。由此,加速了整个编码和/或解码过程。
[0078] 原理上,可以以任何方式来确定比特流的不同区段和区段的类型J,K,N。以下关于图7描述了用于确定比特流的不同区段的一个示范性方法,其示出了将比特流分解为第一、第二和第三区段的示范性方法。
[0079] 在图7中,在从任何电子存储装置接收到或者读取到码元的输入序列时,从开始处扫描码元,并且找到包含超过Th1个连续S2码元的所有子序列,其中Th1是已经如上定义的预定义的阈值。通过L1,L2,…Ln表示这些子序列而通过N1,N2,…Nn表示剩余的。这导致如图7的第一行示出的结构。
[0080] 然后,在前一步骤中找到的每个L类型的子序列中搜索包含超过Th1个连续S1码元的子序列。通过J1,J2,…Jm表示它们。通过K1,K2,…Kn表示将Ji从Li中移除而获得的子序列(参见图7的第2行)。将包含少于Th2个码元的Kj放回Ni,其中Th2是如上所述的用于S2码元的预定义的阈值(参见图7的第3行)。以此方式,将码元序列分割为三种类型J,K和N的多个子序列(在此也被称为区段或者片段)。每个第一类型的区段J具有至少Th1个连续S1码元(第一码元组),每个第二类型的区段K具有至少Th2个连续S2码元(第二码元组),输入比特流的剩余部分是具有少于Th1个连续S1码元和具有少于Th2个连续S2码元的第三区段N1,N2,N3。该比特流可以在逻辑上被分割为两个连续的部分,即,至少包括K类型的所有区段的第一连续部分H1和仅包括J和N类型的区段的第二部分H2。为了编码空间树,一般使用以遍历树结构的叶节点而结束的遍历顺序。例如对于3D网格模型,叶节点对应于模型的一个单个点。由此,流(以及由此的第二部分H2)总是以J类型子序列结束。
[0081] 在图4中示出了示范性的作为结果的片段(没有首部),其中c1…c6是子序列的边界的位置指示符。解码工作如下。关于边界,在一个实施例中,编码从比特流的结尾开始,这是由于结尾总是已知的。在一个实施例中,在首部中以相反的顺序c6…c1编码/解码位置指示符(参见图10,图4中未示出),这是由于最后一个c6首先用于解码。最终的区段总是J类型(即,只有一个比特被设置为1),这是由于J类型值对应于空间树的叶节点。由此,比特流的最终区段J3是以码元#100开始并且以该流的最后一个码元结束的J类型的区段。码元来自于第一码元集S1,这是由于它是J类型的子序列。
[0082] 在首部中编码有关该流的结构的信息。如图10中所示,可以在首部中编码用于指示该流中是否存在任何K序列的单个比特91(例如,初始比特91被设置为“1”意味着存在K序列)。在一个实施例中,如果存在K序列,接着的代码字92(例如四个比特)指示最后的K序列在该流中的位置。如下所述,该信息与解码相关。代码字92可以是指示第一部分H1和第二部分H2之间的边界的序列号(使得在图4的示例中,代码字92可以具有值“4”用于指示当从结尾开始时c2是第四个编码的边界位置,参见以下,或者可以具有值“5”用于指示当从结尾开始时c2是第五个解码的边界位置,或者可以具有值“2”用于指示c2,或者它可以是在最后的K序列K1的位置范围内的任何值,例如50,或者类似的)。由此,该代码字92也指示以最后的K序列结尾的该比特流的第一部分H1的最后区段。
[0083] 在一个实施例中,以下第二代码字93指示编码的边界位置的数量。注意到,第一和第二代码字92,93经历转换可能在比特流中位于不同的位置(例如,交换)。然后,其后跟随具有表示边界位置的值cmax,…,c0的区段94(例如,每个12个比特,依赖于可能的流的长度),并且然后是实际的比特流95。在一个实施例中,隐含地,第一部分H1包括仅仅一个N类型的区段和一个K类型区段。在该情形下,指示比特流的第一部分H1的最后区段的代码字92不是必需的。
[0084] 由此,首部信息中的信息揭示了下一子序列(以相反顺序)N3仍然在第二部分H2中,并且由此必须是N类型的,这是由于第二部分H2具有交替的J类型和N类型区段并且以J类型区段结尾。在该示例中,确定N3子序列是非常短的,即仅仅一个码元,在该实施例中,这是N个子序列的默认长度。由此,由于前一个边界位置是c6=100,下一边界位置是c5=99,即,N3子序列是[99,100]。然后,确定下一区段(以相反顺序)J2在第二部分H2中,并且必须是J类型。它的下界是c4=72。然后,确定下一区段(以相反顺序)N2在第二部分H2中,并且必须是N类型。它的下界是c3=70。然后,确定下一区段(以相反顺序)J1在第二部分H2中,并且因此必须是J类型。它的下界是c2=50。在此,可以确定c2是作为第一部分H1和第二部分H2之间的边界的第四个编码的边界位置值。然后,确定下一区段(以相反顺序)K1具有下界是c1=30,并且因此是根据第一部分指示符92的第一部分H1的最终区段。由此,它必须是K类型。
[0085] 也就是说,在本示范性实施例中,边界位置的初步编码是[100,99,72,70,50,30],并且第二部分H2将在第五解码边界位置开始,即,在c2=50处开始。为了获得提供附加的比特节约的边界位置的最终编码,如下进一步细化边界位置的初步编码。
[0086] 至少N类型区段的长度与例如1的默认长度值进行比较。确定N类型区段具有等于默认长度的长度,并且响应于该确定,跳过N类型区段的下界的编码。由此,可以节约一个边界值的编码。为了指示具有不同于默认长度的不同长度的N类型区段,在首部中交换相邻的(例如下一个)J类型区段的边界位置。也就是说,尽管通常以单调顺序来编码边界位置(减小的cmax,…,c0或增加的c0,…,cmax),参见图10,并且由此它们的值以单调顺序递增或者递减,但如果相邻的N区段具有默认长度,就交换J类型区段的两个边界位置。
[0087] 即,在本示范性实施例中,边界位置的编码将是[100,70,72,50,30]。第二部分H2将在第四个编码边界位置c2=50(或者对应是第五个解码边界位置c2=50,见以下)开始。
[0088] 由于交换后的边界位置在可以根据它们在解码期间的值来检测,所以在比特流的第二部分H2中不存在用于指示N类型序列的边界位置的比特。在除了一般的3D网格模型的数据结构的一个实施例中,也可以在比特流的第一部分H1中使用类似的编码方法。
[0089] 在以上示范性实施例中,边界位置的解码如下(比较图10):首先,从存在至少一个K序列的流的第一比特91中进行解码。然后,在一个实施例中,解码指示最后的K序列之后的具有例如值4的边界位置c2的指示符92。然后,在一个实施例中,将表示编码后的边界位置的数量的值93解码为5。然后,下一(number_of_boundary_positions)*12比特被解码作为边界位置值,即[100,70,72,50,30]。在一个实施例中,根据指示符92,第四个编码边界位置值之前的边界位置值(是50)处于第二部分H2中。由此,如果值不是单调递减(在本示例中),则省略指示1比特N区段的边界值。由此,解码器检测到第三值(即,72)高于第二值(即,70),并且因此在(previous_boundary_positions-1)处,即100-1=99处,插入隐含的边界位置,并且进一步将交换后的边界位置交换回它们正确的顺序。因此,解码可以取得解码后的位置序列以便以[100,99,72,70,…]开始。在本示例中,后续的边界位置是单调的。因此,解码的位置序列是[100,99,72,70,50,30]。
[0090] 用于指示最后K区段并且由此指示比特流的第一部分H1的指示92可以用于确定各区段的类型,即,在一个实施例中,根据作为例如5的指示92的事实,解码器确定第五个值(即,50)是比特流的第一部分H1和第二部分H2之间的边界。因此,解码器分别确定前四个值(100,99,72,70)是J类型区段和N类型区段之间的边界位置,第五边界位置(50)处于J类型和K类型区段之间或者处于H1和H2之间,并且剩余的边界位置(在本情形下仅仅是30)处于K类型和N类型区段之间。
[0091] 图5示出了根据本发明的一个实施例的编码方法的流程图。在一个实施例中,用于编码比特流的方法包括以下步骤:第一步骤包括定义51二进制码元的至少第一和第二码元组,其中第一码元组S1是第二码元组S2的子集。
[0092] 第二步骤包括确定52该比特流内的两个或者更多个第一区段J1,J2,零个或者多个第二区段K1和两个或者更多个第三区段N1,N2,N3,其中每个第一区段J至少具有第一码元组S1的预定义的第一数量Th1的连续码元,每个第二区段K至少具有第二码元组的预定义的第二数量Th2的连续码元,并且其中比特流的剩余部分由第三区段N1,N2,N3组成。
[0093] 第三步骤包括确定53该比特流中仅仅包括第一和第三区段J1,J2,N2的至少一个连续部分H2。
[0094] 第四步骤包括编码54比特流,其中使用第一代码编码54A所述第一区段,使用第二代码编码54B所述第二区段,使用第三代码编码54C所述第三区段。
[0095] 第五步骤包括编码55用于指示该比特流中的第一、第二和第三区段之间的边界位置的值C1,其中在仅仅包括第一和第三区段的所述连续部分H2中,如果第三区段N2的长度LN2是预定义的长度,跳过对第一区段J1,J2和相邻的第三区段N2(即,与第一区段J1,J2相邻)之间的边界位置的编码,并且如果其与预定义的长度不同,隐含地编码第三区段N2的长度LN2。该预定义的长度必须是正的(即,非零),优选地是1。然而,依赖于数据结构的特性特征,它可以是另一值,例如2。
[0096] 该预定义的长度可以是隐式预定义的或者是显式预定义的,例如,作为解码器控制信息编码的参数。
[0097] 在一个实施例中,预定义的长度隐式地被预定义为1。对于用于编码3D网格模型的基于空间树的树结构方法的遍历产生的比特流的编码,该实施例尤其有利。
[0098] 在一个实施例中,用于编码比特流的方法包括步骤:
[0099] 定义二进制码元的至少第一和第二码元组S1,S2,其中第一码元组S1比第二码元组S2包括更少的码元,并且第一码元组的码元也被包括在第二码元组中;
[0100] 确定该比特流内的两个或者更多个第一区段J1,J2,其中每个第一区段J1,J2至少具有第一码元组S1的定义的第一最小数量Th1个连续码元,零个或者多个第二区段K1,其中,每个第二区段至少具有第二码元组S2的定义的第二最小数量Th2个连续码元,和两个或者更多个包括比特流的剩余区段的第三区段N1,N2,N3(其中累计相等类型的相邻区段,使得流具有交替的不同类型的相邻区段);
[0101] 将比特流分割为至少连续的第一部分H1和连续的第二部分H2,其中第一部分包括所述第三区段N1和所述零个或者多个第二区段K1中的至少一个,第二部分包括所述第一区段N2和所述至少两个第二区段J1,J2中的至少一个;
[0102] 编码比特流,其中使用第一编码器Enc1编码所述一个或多个第一区段J1,J2,使用第二编码器Enc2编码所述一个或多个第二区段K1,使用第三编码器Enc3编码所述一个或多个第三区段N1,N2,N3;以及
[0103] 编码比特流中的第一、第二和第三区段的长度,其中至少在第二部分H2中,如果该长度是1,跳过编码第一区段N2,N3的长度LN2,LN3。
[0104] 下面描述编码方法的进一步的有利实施例。
[0105] 在一个实施例中,第一码元组(S1)包括具有一个比特被设置为1和剩余比特被设置为0的二进制码元,第二码元组(S2)包括具有一个或两个比特被设置为1和剩余比特为0的二进制码元。
[0106] 在一个实施例中,比特流表示空间数据结构,具体是3D网格模型的遍历八叉树表示。
[0107] 在一个实施例中,编码步骤54包括使用基于第一码元集S1的第一代码的第一编码步骤54A,使用基于第二码元集S2的第二代码的第二编码步骤54B和使用基于第三码元集S3的第三代码的第三编码步骤54C。在一个实施例中,同时执行第一、第二和第三编码54A,54B,54C的至少一部分。
[0108] 在一个实施例中,在比特流的开始处编码解码器控制信息,该解码器控制信息包括用于指示比特流的第一、第二和第三区段之间的边界位置的所述值C1。
[0109] 在一个实施例中,比特流中的第一、第二和第三区段的边界位置或者长度被编码为值序列cmax,…,c0,其中对于比特流的第一部分H1和对于第二部分H2的第一区段,如果不跳过边界,则以单调顺序编码表示边界位置的值,并且其中第一区段J1,J2和相邻的第三区段N2之间的边界位置的所述隐含编码包括交换所述第一区段J1的边界顺序(即,下界和上界)。在一个实施例中,所述比特流的第三区段N2的所述预定义的长度LN2是1。
[0110] 图6示出了根据本发明的一个实施例的解码方法的流程图。解码比特流的该方法包括以下步骤。
[0111] 第一步骤包括从比特流的开始处解码61控制信息C1。
[0112] 第二步骤包括根据所述控制信息确定62该比特流内的至少两个或者更多个第一区段J1,J2,零个或者多个第二区段K1和两个或者更多个第三区段N1,N2,N3,其中每个第一区段J1,J2具有第一码元组S1的连续码元,每个第二区段K1具有第二码元组S2的连续码元,并且第三区段具有第三码元组S3的码元,其中所述第三区段N1和所述零个或者多个第二区段K1中的至少一个处于比特流的连续第一部分H1中,并且所述第一区段N2和所述至少两个第二区段J1,J2中的至少一个处于该比特流的连续的第二部分H2中。
[0113] 第三步骤包括解码64所述连续码元,并且具有至少以下三个子步骤。
[0114] 第一子步骤包括使用第一码元解码器(基于第一码元组S1)将所述至少两个或者更多个第一区段J1,J2的连续码元解码64A为固定长度的码元。
[0115] 第二子步骤包括:如果确定了至少一个第二区段K1,则使用第二码元解码器(基于第二码元组S2)将所述零个或者多个第二区段K1的连续码元解码64B为固定长度的码元。第二码元组S2包括第一码元组S1的所述码元和附加码元。
[0116] 第三子步骤包括:使用第三码元解码器(基于第三码元组S3)将所述两个或者更多个第三区段N1,N2,N3的码元解码64C为固定长度的码元,其中第三码元组S3仅仅包括未被包括在第二码元组S2中的码元。
[0117] 最后,第四步骤66包括:根据所述控制信息以相继的顺序重新排序并且提供解码后的比特流中的第一、第二和第三区段的码元。
[0118] 以下描述解码方法的进一步的有利实施例。
[0119] 在一个实施例中,第一码元组包括具有一个比特被设置为1和剩余比特为0的二进制码元,第二码元组包括具有一个或两个比特被设置为1和剩余比特为0的二进制码元。
[0120] 在一个实施例中,比特流表示3D网格模型的遍历八叉树表示。
[0121] 在一个实施例中,从比特流的开始处解码61控制信息C1的步骤包括:解码指示比特流中的第一、第二和第三区段的边界位置的值序列cmax,…,c0,其中表示比特流的第一部分H1的边界位置的值具有单调的顺序,并且其中表示比特流的第二部分H2的第一区段J1,J2的边界位置的值具有单调的顺序。
[0122] 在一个实施例中,解码方法还包括步骤:检测66B表示具有交换的单调顺序的比特流的第二部分H2中的边界位置的至少一对值c3,c4,并且根据所述值之一在边界位置插入66C具有根据所述至少一对值c3,c4之间的差的长度的所述第一区段N2,N3之一。
[0123] 在一个实施例中,至少部分地同时执行(至少部分时间重叠):解码64A至少两个或者更多个第一区段J1,J2,在确定至少一个第二区段K1的情况下解码64B所述零个或者多个第二区段K1,以及解码64C所述两个或者更多个第三区段N1,N2,N3。
[0124] 在一个实施例中,提供66解码后的比特流的第一、第二和第三区段的码元的步骤包括重新排序66A所述第一、第二和第三区段。
[0125] 在一个实施例中,控制信息C1至少包括第一、第二和第三区段的长度。可以以边界位置的形式来表达该长度。
[0126] 图11示出了根据本发明的一个实施例的编码比特流的装置700的框图。在该实施例中,编码比特流的装置包括以下模。每个模块可以被实施为单独的硬件块。第一模块751是码元定义模块,定义二进制码元的至少第一和第二码元组,其中第一码元组S1是第二码元组S2的子集。
[0127] 第二模块752是确定模块,确定该比特流内的两个或者更多个第一区段J1,J2,零个或者多个第二区段K1和两个或者更多个第三区段N1,N2,N3,其中每个第一区段J至少具有第一码元组S1的预定义的第一数量Th1的连续码元,每个第二区段K至少具有第二码元组的预定义的第二数量Th2的连续码元,并且其中比特流的剩余部分由第三区段N1,N2,N3组成。
[0128] 第三模块753是确定模块,确定该比特流中仅仅包括第一和第三区段J1,J2,N2的至少一个连续部分H2。
[0129] 第四模块754是编码模块,用于编码比特流,其中使用第一代码编码754A所述第一区段,使用第二代码编码754B所述第二区段,使用第三代码编码754C所述第三区段。
[0130] 第五模块755是编码模块,编码用于指示该比特流中的第一、第二和第三区段之间的边界位置的值C1,其中在仅仅包括第一和第三区段的所述连续部分H2中,如果第三区段N2的长度LN2是预定义的长度,跳过对第一区段J1,J2和相邻的第三区段N2(即,与第一区段J1,J2相邻)之间的边界位置的编码,并且如果其与预定义的长度不同,隐含地编码第三区段N2的长度LN2。该预定义的长度必须是正的(即,非零),优选地是1。然而,依赖于数据结构的特性特征,它可以是另一值,例如2。该预定义的长度可以是隐式预定义的或者是显式预定义的,例如,作为解码器控制信息编码的参数。
[0131] 图12示出了根据本发明的一个实施例的解码比特流的装置800的框图。在该实施例中,解码比特流的装置包括以下模块。每个模块可以被实施为单独的硬件块。第一模块861是解码模块,从比特流的开始处解码61控制信息C1。
[0132] 第二模块862是确定模块,用于根据所述控制信息确定62该比特流内的至少两个或者更多个第一区段J1,J2,零个或者多个第二区段K1和两个或者更多个第三区段N1,N2,N3,其中每个第一区段J1,J2具有第一码元组S1的连续码元,每个第二区段K1具有第二码元组S2的连续码元,并且第三区段具有第三码元组S3的码元,其中所述第三区段N1和所述零个或者多个第二区段K1中的至少一个处于比特流的连续第一部分H1中,并且所述第一区段N2和所述至少两个第二区段J1,J2中的至少一个处于该比特流的连续的第二部分H2中。
[0133] 第三模块864是解码模块,用于解码所述连续码元,并且具有至少以下三个子模块。
[0134] 第一子模块864A是第一解码模块,用于使用第一码元解码器(基于第一码元组S1)将所述至少两个或者更多个第一区段J1,J2的连续码元解码为固定长度的码元。
[0135] 第二子模块864B是第二解码模块,如果确定了至少一个第二区段K1,则使用第二码元解码器(基于第二码元组S2)将所述零个或者多个第二区段K1的连续码元解码为固定长度的码元。第二码元组S2包括第一码元组S1的所述码元和附加码元。
[0136] 第三子模块864C是第三解码模块,用于使用第三码元解码器(基于第三码元组S3)将所述两个或者更多个第三区段N1,N2,N3的码元解码为固定长度的码元,其中第三码元组S3仅仅包括未被包括在所述第二码元组S2中的码元。
[0137] 第四模块866是重构和输出模块,用于根据所述控制信息以相继的顺序重新排序并且提供解码后的比特流中的第一、第二和第三区段的码元,即,该模块将比特流的各个区段重构为解码的比特流。
[0138] 在用于解码的装置的一个实施例中,其中用于从比特流的开始处解码控制信息C1的解码模块861执行对指示比特流中的第一、第二和第三区段的边界位置的值序列(cmax,…,c0)的解码,其中表示比特流的第一部分H1的边界位置的值具有单调的顺序,并且其中表示比特流的第二部分H2的第一区段J1,J2的边界位置的值具有单调的顺序,并且其中所述解码模块861还包括:检测模块866B,用于检测表示具有交换的单调顺序的比特流的第二部分H2中的边界位置的至少一对值(c3,c4,参见以上和图4);以及插入模块866C,用于根据所述值之一在边界位置插入具有根据所述至少一对值(c3,c4)之间的差的长度的所述第一区段N2,N3之一。
[0139] 如上所述,图8示出了与基于四叉树的2D几何编码比较的基于八叉树的3D几何编码的原理。
[0140] 图9示出了各种示范性比特流的结构。在图9a)示出的第一结构中,比特流的第一部分H1包括两个K类型区段并且相应地也包括两个N类型区段(由于初始区段一般是N类型,对应于八叉树结构的根)。比特流的第二部分H2包括两个J类型区段并且相应地也包括一个N类型区段(即,N类型区段的数量是J类型区段的数量减去1)。
[0141] 在图9b)示出的第二结构中,比特流的第一部分H1包括两个K类型区段和仅仅一个N类型区段(对应于仅仅具有Th2个非空子单元的父单元的少见情形,使得初始区段是K类型)。根据本发明的原理也可以处理该情形。在该情形下,最后的K类型区段是K2区段,并且根据边界位置的数量,解码器可以确定初始序列必须是K类型。该比特流的第二部分H2包括两个J类型区段,并且和相应的一个N类型区段。
[0142] 在图9c)所示的第三结构中,比特流的第一部分H1包括一个K类型区段以及相应的一个N类型区段。如果第一部分仅仅包括单个区段,其可以根据第一部分中的边界位置的数量来编码/解码,如上所述,可能需要附加的指示来指示其是K类型还是N类型。比特流的第二部分H2包括6个J类型区段,和相应的5个N类型区段(J类型区段的数量减去1)。
[0143] 在图9d)所示的第四结构中,比特流的第一部分H1包括两个K类型区段以及相应的两个N类型区段。比特流的第二部分H2包括6个J类型区段,以及相应的5个N类型区段(J类型区段的数量减去1)。
[0144] 图10示出了比特流的示范性首标的结构,并且已经在上面进行了描述。为了简单,上述的实施例将K类型子序列的数量限制为1。比特流的开始处的4比特二进制92可以用于指示K类型的最后的子序列。由于解码从比特流的结尾开始,因此这将是解码的第一K类型子序列。例如,当不存在符合K的资格的子序列时,二进制92是“0000”,并且第一部分H1仅仅包括N类型区段。
[0145] 本发明提供了一种用于高效地压缩数据的方法,所述数据可以被分割为具有基本上不同统计分布的多个段。通过将最合适的统计模型应用于每个部分,实现更高的压缩。具体地,所发明的方法在3D顶点的位置的八叉树压缩时工作地非常好。
[0146] 该编码的一个优点在于,其将自身调整到数据的不同段的特征。最好的概率模型被自动选择并且应用到不同段的算术编码(或者其它熵压缩),形成了最优的压缩。与已知方法相比,本发明的另一优点在于,通过减少的索引数量来指定段界限。具体地,在八叉树压缩的一个实施例中,八叉树的码元被分割为通过255码元概率模型、36码元概率模型或者8码元概率模型编码的少数几个段。对于大量的3D模型(具体是复杂的或者中等复杂的3D模型)的八叉树数据来优化这些模型。本发明的又一优点在于,具有以上初始的概率模型的三种(或者更多)熵编解码器可以独立地运行以便压缩对应的数据。
[0147] 以下评论与具体实施例有关。
[0148] 在一个实施例中(如图4中),在编码之前反转边界指示符的顺序,即,从cy到c1。观察到多数Nis(i>2)仅仅具有一个元素,编码这种一个码元子序列的两个边界指示符太浪费了。由此,例如如果N3仅仅具有一个码元,则仅仅编码上界,如果已经编码了c6,则c5不需要编码。当N3具有多个码元,则编码C5和C6二者。但是与普通顺序不同,在C6之前编码C5。然后,将命令解码器考虑N3作为多码元子序列。由此,不是所有的边界指示符都是必需的。假设存在要编码的x个边界位置指示符,x被编码为4比特二进制,并且必需的边界指示符被编码为12比特二进制。例如,在图4的示例中,被写入到比特流中的值是[5:100,70,72,50,30]。分别利用三个(或者两个)算术编码器来编码Nis,Kis,Jis中的码元。根据表格1的概率模型来确定N和K的初始概率模型,而J的初始概率被设置为均匀分布。基于各种几何数据的八叉树码元的统计来优化上述模型。组合三个算术编码器的结果并且将其写入到比特流中。除了普通码元之外,前两个算术编码器可能还具有一个端码元,其将通过不同编码器编码的子流分开。
[0149] 在一个实施例中,解码具有以下步骤以便对比特流进行解压缩:读取一个比特以决定子序列K1(如果存在)的位置;读取4比特二进制并且将其解码为十进制值x,x是比特流中边界指示符的数量;读取x个12比特二进制并且将它们解码为十进制值,cx到c1;根据解码的边界指示符构建码元序列的片段结构。以图4作为示例,x=5并且解码的cis是[100,70,72,50,30]。由于结尾的子序列总是J,因此cx必须是其下界位置。因此,我们具有J3=[100,∞],“∞”意味着上界依赖于解码后的码元的数量。
[0150] 此外,解码的步骤是,在获得最后的J子序列之后,逐个地构建前一个。如果ci>ci-1(普通单调情形),前一个子序列仅仅具有一个码元,并且插入新的值[ci-1]作为前一个的之前子序列的上界。在该示例中,获得[100]和[70,99]。
[0151] 如果ci
[0152] 利用已经预定义了初始的概率模型的三个或者两个算术解码器来解压缩码元。当出现一个子流的端码元时,新的解码器开始工作。然后,获得被置于子序列的合适位置的三串或者两串解码后的码元。应注意,如本领域技术人员清楚的,尽管连同八叉树压缩示出,但可以构建与八叉树压缩不同的其它类型的编码,所有这些在本发明的精神和范围内是可想到的。此外,应注意,如本领域技术人员清楚的,尽管连同特定的第一和第二码元集S1,S2示出,但可以构建其它类型的码元集,和/或附加码元集层级(例如,1个,2个或3个比特被设置为1的码元集S3),所有这些在本发明的精神和范围内是可想到的。如果要被编码的数据在不同段具有显著不同的统计分布,这尤其是正确的。
[0153] 尽管已经示出、描述和指出了在应用到本发明的优选实施例时,本发明的基本的新颖的特征,但也应理解,本领域技术人员可以在所描述的装置和方法、在所公开的设备的形式和细节以及它们的操作中做出各种省略和替换以及改变,而不脱离本发明的精神。尽管关于3D网格模型已经公开了本发明,本领域技术人员将认识到在此描述的方法和设备可以应用于使用四叉树、八叉树或者相当的类似方法的任何数据压缩方法或装置,具体地(但不限于)几何编码。示例是空间点(即,具有空间坐标的点),例如映射图上的点、任何3维结构上的点,或者类似的。由于空间点通过它们的2D或者3D坐标表示,并且树结构编码各点之间的关系,并且实际上是编码的树,本发明可以用于编码任何表示特征在于n维坐标(包括n=1,2,3,4等等)的叶元素之间的关系的类似树的结构,并且具体是模型自适应的熵编码。明确地意图在于,以基本相同的方式执行基本相同的功能来实现相同结果的这些要素的所有组合在本发明的范围内。从描述的一个实施例到另一个实施例的元素的替换也完全想要的和可想到的。
[0154] 应理解,已经单纯通过示例方式描述了本发明,并且可以在不脱离本发明的范围的情况下做出对细节的修改
[0155] 说明书和和权利要求书以及附图(如果合适)中公开的每个特征可以单独地或者以任何合适的组合来提供。各特征在合适的情况下可以以硬件、软件或者二者的组合来实施。在权利要求书中出现的参考标记仅仅是例示性的并且不对权利要求的范围具有限制效果。
QQ群二维码
意见反馈