分层熵编码及解码

申请号 CN201180073045.6 申请日 2011-08-25 公开(公告)号 CN103858433B 公开(公告)日 2017-08-15
申请人 汤姆逊许可公司; 发明人 江文斐; 蔡康颖; 胡平;
摘要 特定实现接收3D网格的几何数据,并利用八叉树表示该几何数据。特定实现将八叉树划分成三个部分,其中分层 熵编码 与八叉树的中部相对应的符号。为了将八叉树划分成三个部分,使用不同 阈值 。取决于与 节点 相联系的符号是否是S1符号,使节点的 子节点 包括在八叉树的中部或上部中。在分层熵编码中,首先使用符号集S2={S1,X}将非‑S1符号编码成预定符号X,然后使用符号集S0编码非S1‑符号本身,以及使用符号集S2编码S1符号。另一种实现定义相应分层熵解码。进一步的实现重构八叉树,并从八叉树表示中恢复3D网格的几何数据。
权利要求

1.一种分层熵编码方法,包含:
确定符号的序列中的符号不属于第一符号集(830);
使用第一符号集和预定符号的统计模型编码预定符号以便表示所确定符号(840);以及
使用第二符号集的统计模型编码所确定符号(850),
其中第二符号集是第一符号集的超集,以及预定符号不属于第二符号集。
2.如权利要求1所述的方法,进一步包含:
使用第二符号集的统计模型编码符号的第二序列(740);以及
使用第三符号集的统计模型编码符号的第三序列(760)。
3.如权利要求2所述的方法,其中第三符号集与第一符号集相同。
4.如权利要求2所述的方法,进一步包含:
接收3D网格的几何数据(710);
使用树形数据结构来表示该几何数据(720);以及
将该树形数据结构划分(730)成三个部分,其中符号的第一序列对应于该树形数据结构的中部,符号的第二序列对应于该树形数据结构的上部,以及符号的第三序列对应于该树形数据结构的底部。
5.如权利要求4所述的方法,其中划分树形数据结构包含如下之一:
如果第二符号不属于第一符号集,则在树形数据结构的上部包括节点子节点,该节点与第二符号相联系(960);以及
如果第二符号属于第一符号集,则在树形数据结构的中部包括节点的子节点(950)。
6.如权利要求4所述的方法,其中划分树形数据结构使用至少一个阈值
7.一种分层熵解码方法,包含:
使用第一符号集和预定符号的统计模型从位流中解码符号(1220);
确定该符号是预定符号(1230);以及
使用第二符号集的统计模型从位流中解码与所确定符号相对应的第二符号(1250),其中第二符号集是第一符号集的超集,以及预定符号不属于第二符号集。
8.如权利要求7所述的方法,进一步包含:
使用第二符号集的统计模型和第三符号集的统计模型之一从位流中解码另一个符号(1120)。
9.如权利要求8所述的方法,其中第三符号集与第一符号集相同。
10.如权利要求8所述的方法,进一步包含:
使用所解码符号重构(1130)树形数据结构,所解码符号包括第二符号和另一个符号;
以及
从该树形数据结构中恢复(1150)3D网格的几何数据。
11.如权利要求10所述的方法,其中重构树形数据结构包含:
如果与节点相联系的第三符号属于第一符号集,则使用第一符号集和预定符号的统计模型解码与节点的子节点相联系的符号;以及
如果第三符号不属于第一符号集,则使用第二符号集的统计模型解码与节点的子节点相联系的符号。
12.如权利要求10所述的方法,其中重构树形数据结构使用至少一个阈值。
13.一种编码装置,包含:
将树形数据结构划分成三个部分的处理器,其中符号的第一序列对应于该树形数据结构的中部,符号的第二序列对应于该树形数据结构的上部,以及符号的第三序列对应于该树形数据结构的底部;
确定符号的第一序列中的符号不属于第一符号集的控制器
使用第一符号集和预定符号的统计模型编码预定符号以便表示所确定符号的第一熵编码引擎;以及
使用第二符号集的统计模型编码符号和符号的第二序列的第二熵编码器,其中第二符号集是第一符号集的超集,以及预定符号不属于第二符号集。
14.如权利要求13所述的装置,其中如果第三符号不属于第一符号集,则在树形数据结构的上部包括节点的子节点,如果第三符号属于第一符号集,则在树形数据结构的中部包括节点的子节点,该节点与第三符号相联系。
15.如权利要求13所述的装置,进一步包含:
接收3D网格的输入端;以及
形成树形数据结构以便表示3D网格的几何数据的生成器。
16.如权利要求13所述的装置,其中该处理器使用至少一个阈值来划分树形数据结构。
17.一种解码装置,包含:
使用第一符号集和预定符号的统计模型从位流中解码符号的第一熵解码引擎;
确定该符号是预定符号的控制器;
使用第二符号集的统计模型从位流中解码第二符号的第二熵解码引擎,其中第二符号集是第一符号集的超集;以及
使用所解码符号重构树形数据结构的处理器,所解码符号包括第二符号。
18.如权利要求17所述的装置,其中如果第三符号属于第一符号集,则第一熵解码引擎用于解码与节点的子节点相联系的符号,如果第三符号不属于第一符号集,则第二熵解码引擎用于解码与节点的子节点相联系的符号,该节点与第三符号相联系。
19.如权利要求17所述的装置,其中重构树形数据结构来表示3D网格的几何数据。
20.如权利要求17所述的装置,其中重构树形数据结构使用至少一个阈值。
21.一种上面存储着使一个或多个处理器集体执行如下步骤的指令的处理器可读介质:
使用第一符号集和预定符号的统计模型从位流中解码符号;
确定该符号是预定符号;以及
使用第二符号集的统计模型从位流中解码与所确定符号相对应的第二符号,其中第二符号集是第一符号集的超集,以及预定符号不属于第二符号集。

说明书全文

分层熵编码及解码

技术领域

[0001] 本发明涉及熵编码及解码,尤其涉及在符号的序列的不同部分中利用不同统计量为该序列熵编码及解码。

背景技术

[0002] 符号的序列可以通过熵编码来压缩,其中该符号选自字母表或符号集。熵编码引擎根据统计模型,即,符号的概率分布为符号指定码字。一般说来,用较少的位熵编码较常用的符号,用较多的位熵编码较不频繁出现的符号。
[0003] 熵编码已经研究了几十年。基本上,存在三种类型的熵编码方法:像霍夫曼(Huffman)编码那样的可变长度编码(VLC)、算术编码、和像Lempel-Ziv(LZ)压缩或Lempel-Ziv-Welch(LZW)压缩那样的基于字典压缩。
[0004] VLC代码使用整数个位来表示每个符号。霍夫曼编码是最广泛使用的VLC方法。它将较少的位指定给概率较大的符号,而将较多的位指定给概率较小的符号。当每个符号的
概率是1/2的整数幂时,霍夫曼编码是最佳的。算术编码可以将分数个位分配给每个符号,以便可以更紧密地接近熵。霍夫曼编码和算术编码已广泛用在现有图像/视频压缩标准,例如,JPEG、MPEG-2、H.264/AVC中。LZ或LZW利用基于表格的压缩模型,其中用表项替代数据的重复字符串。对于大多数LZ方法,从较早的输入数据中动态地生成表格。基于字典的算法已经应用在,例如,GIF、Zip、PNG标准中。

发明内容

[0005] 按照一个总的方面,如果确定符号的序列中的一个符号不属于第一符号集,则使用第一符号集和预定符号的统计模型编码预定符号以便表示所确定符号,并使用第二符号
集的统计模型编码所确定符号。
[0006] 按照另一个总的方面,接收3D网格的几何数据并使用树形数据结构来表示该几何数据。将该树形数据结构划分成三个部分,其中符号的第一序列对应于该树形数据结构的
中部,符号的第二序列对应于该树形数据结构的上部,以及符号的第三序列对应于该树形
数据结构的底部。如果确定符号的第一序列中的一个符号不属于第一符号集,则使用第一
符号集和预定符号的统计模型编码预定符号以便表示所确定符号,并使用第二符号集的统
计模型编码所确定符号,其中第二符号集是第一符号集的超集,以及预定符号集不属于第
二符号集。当划分树形数据结构时,如果第二符号不属于第一符号集,则在树形数据结构的上部包括节点子节点,该节点与第二符号相联系,而如果第二符号属于第一符号集,则在树形数据结构的中部包括节点的子节点。
[0007] 按照另一个总的方面,使用第一符号集和预定符号的统计模型从位流中解码一个符号。如果确定该符号是预定符号,则使用第二符号集的统计模型从位流中解码与所确定
符号相对应的第二符号。
[0008] 按照另一个总的方面,使用第一符号集和预定符号的统计模型从位流中解码一个符号。如果确定该符号是预定符号,则使用第二符号集的统计模型从位流中解码与该符号
相对应的第二符号,其中第二符号集是第一符号集的超集,以及预定符号集不属于第二符
号集。使用第二符号集的统计模型和第一符号集的统计模型之一从位流中解码另一个符
号。使用所解码符号重构树形数据结构,所解码符号包括第二符号和另一个符号。当重构树形数据结构时,如果与节点相联系的第三符号属于第一符号集,则使用第一符号集和预定
符号的统计模型解码与节点的子节点相联系的符号,而如果第三符号不属于第一符号集,
则使用第二符号集的统计模型解码与节点的子节点相联系的符号。然后从树形数据结构中
恢复3D网格的几何数据。
[0009] 在附图和下面的描述中展示了一种或多种实现的细节。即使以一种特定方式描述,也应当清楚,这些实现可以以各种方式配置或具体化。例如,一种实现可以作为方法来执行,或具体化成像,例如,配置成执行一组操作的装置或存储执行一组操作的指令的装置那样的装置,或以信号形式具体化。其它方面和特征将从结合附图和权利要求书考虑的如
下详细描述中明显看出。

附图说明

[0010] 图1是在2D情况下基于k-d树的几何编码的原理的图形表示;
[0011] 图2和3是在2D情况下基于四叉树的几何编码的原理的图形表示;
[0012] 图4是细胞划分的图形表示;
[0013] 图5是示范性八叉树的图形表示;
[0014] 图6是描绘依照本原理的实施例,生成符号的子序列的例子的图形表示;
[0015] 图7是描绘依照本原理的实施例,压缩3D网格的几何数据的例子的流程图
[0016] 图8是描绘依照本原理的实施例的分层熵编码的例子的流程图;
[0017] 图9是描绘依照本原理的实施例,划分树形数据结构的例子的流程图;
[0018] 图10是依照本原理的实施例的所生成位流的格式的图形表示;
[0019] 图11是描绘依照本原理的实施例,熵编码位流和恢复3D网格的几何数据的例子的流程图;
[0020] 图12是描绘依照本原理的实施例的分层熵解码的例子的流程图;
[0021] 图13是描绘依照本原理的实施例,重构树形数据结构的例子的流程图;
[0022] 图14是描绘重构树形数据结构的例子的图形表示;
[0023] 图15是描绘可以用在一种或多种实现上的编码器的例子的框图
[0024] 图16是描绘可以用在一种或多种实现上的解码器的例子的框图;
[0025] 图17是描绘可以用在一种或多种实现上的数据处理系统的一个例子的框图;以及
[0026] 图18是描绘可以用在一种或多种实现上的数据处理系统的另一个例子的框图。

具体实施方式

[0027] 基于空间树的做法可以用于压缩像密封3D模型的随机点位置顶点位置那样的几何数据。它们通过八叉树或k-d树来组织输入空间点。遍历该树并存储树恢复所需的信
息。
[0028] 最初,围绕3D模型的所有点构建边界框。所有3D点的边界框一开始被认为是单个细胞。为了构建空间树,递归地细分一个细胞,直到每个非空细胞足够小以至于只包含一个顶点和使顶点位置能够得到足够精确重构。由于可以从相应细胞的中心坐标中恢复顶点位
置,所以基于空间树的算法可以利用与单分辨率压缩算法相同的压缩比实现多分辨率压
缩。
[0029] 在基于k-d树的做法中,如图1所示,将一个细胞细分成两个子细胞,在每次迭代中编码两个子细胞之一中顶点的数量。如果母细胞包含p个顶点,则可以由算术编码器使用log2(p+1)个位编码子细胞之一中顶点的数量。
[0030] 另一方面,基于八叉树的做法在每次迭代中将非空细胞细分成8个子细胞。为了易于例示起见,在图2和图3中示出了描述四叉树的2D例子。遍历次序用箭头表示。为了编码,将当前母细胞分解成以预定次序遍历的四个子细胞,每个子细胞用单个位指示在子细胞内
是否存在一个点。例如,在图2中,如箭头所示遍历两个母细胞1和2的子细胞,非空子细胞被涂成灰色。第一母细胞1的子细胞210、211、212和213用第一序列“1010”表示。由于遍历的第一和第三子细胞210、212非空(即,包含一个或多个点),所以用“1”指示它们。第二和第四子细胞211、213是空的(即,不包含点),所以用“0”指示它们。图3示出了使用不同遍历的相同细胞以及最后所得的序列。
[0031] 图4示出了八叉树方案的母细胞和子细胞。在八叉树方案中,将母细胞分解成八个子细胞40,...,46(左下细胞42后面的一个隐藏子细胞未显示出来)。可能遍历次序可以是左右、上下和前后,导致细胞40-41-42-43-44-45-(左下角细胞42后面的隐藏子细胞)-46的遍历序列。相应地,在八叉树情况下,用8-位二进制表示非空子细胞配置,覆盖空和非空子细胞的所有255种可能组合。不需要分开编码非空子细胞的数量。表1是序列的例子。
[0032] 11111111
[0033] 01100110
[0034] 00111011
[0035] 11001100
[0036] 00010000
[0037] 00000010
[0038] 00000010
[0039] 10000000
[0040] 00000001
[0041] 表1.示范性序列
[0042] 注意,母细胞内子细胞的特定遍历次序对于本实施例而言不是非常相关的。原则上,可以将任何遍历次序用于本实施例。在下文中,将用于表示子细胞配置的位串表示成符号。在表1的例子中,将8个位用于每个符号。在其它实现中,符号中的位数可以不同。例如,对于四叉树,将4-位串用于表示子细胞配置,因此,图2的例子中符号的位数是4。
[0043] 图5示出了八叉树结构的例子。每个代码与一个符号相联系,每个层对应于树表示的某种精度。初始细胞被划分成八个细胞。子细胞1、2、5、6和7包含较多顶点,子细胞3、4和8是空的,导致8-位符号11001110(510)表示层0上的子细胞配置。进一步划分每个非空子细胞,相应子细胞配置表示在层2中。可以继续细分,直到每个非空细胞只包含一个顶点。
[0044] 使用八叉树的宽度优先遍历,可以将3D网格的顶点位置组织成符号的序列。对于图5中的例子,符号的序列变成:11001110、11000000、10010100、00100110、00001000和
00001000。
[0045]符号 p 符号 p 符号 p 符号 p 符号 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[0046] 表2.示范性概率分布
[0047] 在图2中以概率的降序示出了复杂3D模型中最常出现符号的概率分布。从表2中可以看出,在二进制表示中只有一个“1”的符号以占优概率(>93%)出现。几何解释可能是,几次细分之后顶点几乎不共享一个细胞。也就是说,只有一个“1”的符号在八叉树的底层占优,其它符号更常出现在顶层中。
[0048] 按照本实施例,我们定义两个符号集:包括所有可能符号的全符号集S0={1,2,3,...,255}、和只包括含有“1”的符号,即,最常出现符号的符号集S1={1,2,4,8,16,32,64,
128}。注意,为了易于表示起见,将8-位二进制串写成十进制数。一个符号如果属于符号集S1,就称为S1符号,否则就称为非-S1符号。
[0049] 为了从八叉树的统计性质中受益,发明名称为“A model-adaptive entropy coding method for octree compression(用于八叉树压缩的模型自适应熵编码方法)”的共同拥有PCT申请第PCT/CN2011/077279号提出了将用八叉树表示的序列划分成自适应地
用S0或S1编码的几个子序列。将子序列边界的索引编码成补充信息。由于补充信息的额外
开销(例如,每个索引2个字节),一般用符号集S1编码相继S1符号的大子序列。
[0050] 当S1符号和非-S1符号两者出现在序列的部分中时,其中S1具有高得多的概率,由于额外开销,将这样的部分划分成几个子序列是不够的。另一方面,由于非-S1符号以低概率出现,所以利用符号集S0编码这样的部分也是不够的。
[0051] 本原理提供了在序列的不同部分中利用可变统计量有效压缩符号的序列的分层熵编码/解码方法和装置。如下实施例主要基于3D网格模型的八叉树表示。但是,本原理可以适用于如下进一步定义的其它数据集或应用。
[0052] 图6是例示如何可以将符号的序列划分成三个子序列,以及如何将三个不同符号集用于编码的例子。在本实现中,使用符号集熵编码符号的序列意味着将符号集的统计模
型,即,符号集的每个符号的概率用于熵编码。通常,使用具体符号集的大数据集训练概率。
因此,出现在两个不同符号集中的符号可能对应于两个符号集中的不同概率。对于表2的例子,符号“10000000”出现在S0和S1两者中,在S0中Prob('10000000')=0.1162,而在S1中Prob('10000000')=0.1245。
[0053] 为了易于例示起见,取代八叉树,将二进制树610用在图6中。这种二进制树中的每个节点与2-位符号相联系。当符号是“11”时,含有两个子节点;当符号是“10”时,只含有左子节点;以及当符号是“01”时,只含有右子节点。符号集S0包含所有三个可能符号。在本例中,符号集S1包含符号“01”和“10”,两者在位串中只有一个“1”。因此,在本例中,符号集S0对应于八叉树的全符号集,S1对应于符号集{1,2,4,8,16,32,64,128}。
[0054] 在二进制树610中,符号“10”和“01”在底层占优,“11”在上层具有较高概率。二进制树610被划分成三个部分,每个部分对应于符号的子序列。树的上部P0对应于子序列620,中部P2对应于子序列630,以及底部P1对应于子序列640。符号集S0的所有符号存在于子序列620和630之中,“11”在620中比在630中出现得更频繁。在本例中,只有符号“01”和“10”出现在子序列640中。可能的是,在P1中也可以包括“11”,但概率低得多。
[0055] 使用符号集S0熵编码子序列620,使用S1熵编码子序列640。按照本发明的原理,利用分层熵编码机制编码子序列630。
[0056] 图7例示了压缩3D网格的几何数据的示范性方法700。在本方法中,用八叉树表示几何数据。首先将八叉树划分成三个部分:P0、P1和P2,并定义三个符号集:S0、S1和S2。利用适当统计模型充分压缩树的每个部分。在本例中,S1是S0的子集,S2是S1和预定符号“X”的并集,即,S2={S1,'X'}。在其它实施例中,S0和S1可以包含其它符号,S2与S1可以有其它关系。通过熵编码每个部分形成三种位流。然后通过将三种位流与其它信息,例如,补充信息组合形成一种位流以便能够适当解码。
[0057] 方法700包括将控制传递给功能710的开始块705。在方块710中接收3D网格的几何数据,并在方块720中生成八叉树来表示几何数据。该八叉树可以被认为与接收的几何数据相对应的符号的完整序列。在方块730中,将八叉树划分成三个部分:上部P0、底部P1和中部P2。每个部分对应于一个子序列。因此,符号的完整序列被划分成三个子序列。
[0058] 然后熵编码子序列。在方块740中使用符号集S0熵编码与上部相对应的子序列;在方块750中使用分层熵编码来熵编码与中部相对应的子序列;以及在方块760中使用符号集
S1以及它的统计模型熵编码底部。在方块770中生成首标信息。在方块780中将子流和首标
信息组合和编译成位流。然后将控制传递给结束块799。
[0059] 在方法700中,在中部和底部的符号的子序列之前编码上部的符号的子序列。也可以使用其它次序的编码。
[0060] 在图8中描绘了可以用在方块750中、编码符号的输入序列以输出位流的示范性分层熵编码方法作为方法800。在一个例子中,符号的序列对应于八叉树的中部的子序列。在另一个实施例中,可以从其它源,例如,用四叉树表示的一组2D坐标中生成符号的序列。
[0061] 方法800包括将控制传递给功能块810的开始块805。在方块810中接收符号的序列作为输入。在方块820中,从符号的序列中读取一个符号。在方块830中确定该符号是否属于符号集S1。如果该符号不属于S1,则首先在方块840中使用符号集S2({S2=S1,'X'})熵编码预定符号'X',然后在方块850中熵编码该符号本身,但使用符号集S0 。如果该符
号属于S1,则在方块860中使用符号集S2({S1,'X'})熵编码它。在方块870中检验序列中的所有符号是否都得到编码。如果所有符号都得到编码,则将控制传递给结束块899;否则,返回到方块820。
[0062] 除了符号集S1之外,符号集S2还包括预定符号'X'。当使用较小符号集S1和附加符号来取代完全符号集S0时,可以更有效地编码八叉树的中部中的S1个符号。首先将每个非-S1符号表示成'X'并熵编码成'X',接着熵编码符号本身。也就是说,可以将符号'X'当作非-S1符号的集合。因此,图8中描述的熵编码方法以及它的相应解码方法被称为分层熵编码/
解码。
[0063] 虽然上面的讨论主要集中在压缩3D网格的几何数据上,但这样的分层熵编码/解码方法也可以应用于在序列的不同部分中具有不同统计量的数据的任何序列。尤其,一些
部分可以利用预定义符号集来编码,其它部分可以将预定符号引入预定义符号中来编码。
这种方法的优点在于只需少数几个符号集,因此,减少了指示切换符号集的时间的额外开
销。另外,将小符号集(即,小预定义符号集和预定符号来取代完全符号集)用于频繁出现符号可以提高压缩效率。
[0064] 按照本原理,最好是适当划分八叉树以便能够有效编码几何数据。在一个实施例中,原理是使底部P1尽可能大,并限制非-S1符号出现在中部P2和底部P1中。
[0065] 划分P1和P2
[0066] 由于符号集S2包含比符号集S1多一个的符号'X',所以中部P2的压缩效率低于P1的压缩效率。因此,想要的是可以通过S1有效编码的大P1,以达到高编码效率。为了使P1尽可能大,在P1中也允许非-S1符号。
[0067] 在通过符号集S1压缩S1个符号的同时,利用符号集S0压缩非-S1符号。为了指示非-S1符号的地点,将层索引和非-S1符号层内的位置写入位流中。由于符号和它们的地点
两者都需要编码,所以非-S1符号的编码是昂贵的。因此,应该限制P1中非-S1符号的数量。
[0068] 为了达到P1的大小与P1中非-S1符号的数量之间的平衡,使用基于阈值的方法。在这种方法中,我们将通过八叉树的宽度优先遍历获得的符号序列定义成SEQ_BF。然后我们
可以从SEQ_BF的末端开始搜索非-S1,当找到非-S1符号以及这个非-S1符号与以前找到的
非-S1符号之间的距离小于th1时停止搜索。这个非-S1符号下面的所有层是P1的部分。将底部P1的顶层的索引写入位流中以指示如何划分八叉树来获取P1。
[0069] 划分P0和P2
[0070] 另一个阈值用于将上部P0与中部P2分开。为了确定该划分,我们首先从头开始逐层扫描SEQ_BF,使包含大于th0%的非-S1符号的每层包括在初始上部P0中,其中th0是预定
义阈值。当到达包含小于th0%的非-S1符号的层时停止扫描。扫描停止的层以及在其上面的层形成初始上部P0。除了底部P1和初始P0之外的层形成初始中部P2。注意,初始P2中的一些层也可能包含大于th0%的非-S1符号。
[0071] 将与S1符号相联系的节点定义成S1节点,否则,定义成非-S1节点。将上部P0的终止节点(即,树叶)的集合定义成P0的下边界。例如,初始P0的下边界是初始P0中的节点的最低层。然后使用P0的下边界递归地细化P0和P2的分开:非-S1节点的子节点包括在P0中,S1节点的子节点包括在P2中。注意,从底部P1开始的符号不应该变成P0或P2的一部分。
[0072] 转到图9,描述如何将P0与P2分开的例子被一般性地显示成方法900。方法900从将控制传递给功能块910的方块905开始。在方块910中接收树形数据结构作为输入。在本例
中,树形数据结构对应于除了底部P1之外的八叉树。为了划分,也可以输入像图6中的二进制树那样的其它树形数据结构。在方块920中使用阈值th0形成初始上部P0和初始中部P2。
在方块930中从P0的下边界中读取一个节点。在方块940中检验该节点是否是S1节点。如果
该节点是S1节点,则在方块950中使它的子节点包括在中部P2中;否则,在方块960中使它的子节点包括在上部P0中。然后在方块970中更新上部P0、中部P2、和P0的下边界。在方块980中检验在P0的下边界中是否存在非-S1节点。如果存在非-S1节点,则使控制返回到方块
930;否则,将控制传递给结束块999。
[0073] 如前所讨论,S1节点通常由八叉树中大于90%的节点组成。因此,在极端情况下,可以利用符号集S2编码除了底部P1之外的所有节点,无需在P0与P2之间分开。但是,这可能导致大量的'X',使编码不怎么有效。一般说来,由于非-S1节点更频繁得多地出现在八叉树的上层中,所以分出P0并利用符号集S0编码P0更有效。
[0074] 关于预定义阈值,可以通过要编码的顶点位置的类型确定它们。在一个例子中,将th0=15和th1=50用于稀疏点位置的压缩。在另一个例子中,将th0=10和th1=200用于从某些3D模型中获得的密封顶点。
[0075] 在前例中,符号集S2是符号集S1和'X'的并集,也就是说,S2仅比S1多包含一个符号。在其它实施例中,S2可以采取其它形式。例如,当某些非-S1符号以高概率出现在P2中时,它们可以包括在S2中。在一个实施例中,在二进制表示中含有两个“1”的符号比含有更多“1”的那些更频繁出现,因此,这些符号也包括在S2中。因此,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,X},它包含8+28+1=37个符号。
[0076] 在八叉树被划分成三个部分之后,压缩相应子序列。将符号集S0、S1和S2的初始统计模型提供给编解码器作为输入。在编码和解码过程期间,为了更好的压缩效率,进一步更新统计模型。
[0077] 将大量顶点数据用于训练统计模型。分别为P0、P1和P2构建三个数据集以便为相应符号集收集统计量。注意,在S2的统计建模过程期间将P2中的所有非-S1符号当作'X'。
[0078] 在本实施例中,生成三种子流:子流1、2和3。取决于如何组织子流,子流可以对应于子序列或利用特定符号集的熵编码引擎。在其它实施例中,例如,当为子序列和符号集的每种组合生成单独位流时,子流的数量可以大于三种。
[0079] 在我们的实施例中,将算术编码用于熵编码。也可以使用其它熵编码方法,例如,霍夫曼编码和基于字典的压缩。
[0080] 为了使接收侧能够适当解码子流,除了子流之外,还将补充信息写入位流中。图10A例示了示范性位流格式。示范性位流由首标1010、子流1(1020)、子流2(1030)、和子流3(1040)组成。在图10B中进一步例示了首标1010。首标中的补充信息的格式使用P1的顶层的索引(“layer_index”,1050)提供有关如何将底部P1与中部P2分开的信息。为了指示底部P1中非-S1符号的地点,该首标提供了后面接着其地点(“location_non_S1i”,1070和1075)的P1中非-S1符号的数量(“No_non_S1”,1060)。该首标还提供了子流1的长度(“len_
substream1”,1080)和子流2的长度(“len_substream2”,1090)。
[0081] 在图11中,示出了解码生成的位流和重构八叉树的示范性方法1100。该八叉树随着熵解码过程而构建。除了在解码预定符号'X'时之外,在解码符号之后构建八叉树中的节点。上部P0中的符号使用符号集S0来解码。中部P2中的符号首先使用符号集S2来解码。当解码'X'时,使用S0解码附加符号以便重构节点,也就是说,没有节点被构建成与'X'相对应。
底部P1中的非-S1符号使用符号集S0来解码,它们的地点从首标中获知。其它符号,即,P1中的S1符号使用符号集S1来解码。
[0082] 方法1100从将控制传递给功能块1110的开始块1105开始。在方块1110中接收位流。在方块1120中从位流中解码一个符号。在方块1130中,当解码非'X'符号时重构八叉树的节点。在方块1140中检验八叉树是否完全得到重构,即,八叉树构建是否不再请求更多符号。如果该树未完成,则使控制返回到方块1120。否则,在方块1150中恢复3D网格的几何数据,并将控制传递给结束方块1199。
[0083] 在图12中描绘了解码输入位流以便输出解码序列的示范性分层熵解码方法1200。方法1200从将控制传递给接收位流的功能块1210的开始块1205开始。在方块1220中,使用
S2={S1,'X}的统计模型从位流中解码一个符号。在方块1230中检验解码的符号是否是预定符号'X'。如果解码的符号不是预定符号'X',即,它是S1符号,则将控制传递给方块1270。否则,在方块1250中使用S0从位流中解码另一个符号。
[0084] 在方块1270中检验是否应该终止熵解码过程。在一个实施例中,当八叉树的中部完全得到构建时,结束熵解码过程。在其它实施例中,可以检验熵解码器是否到达终止符
号。如果应该终止熵解码过程,则将控制传递给结束方块1299。否则,使控制返回到方块
1220。
[0085] 图13例示了重构该树的上部的示范性方法1300。与树划分一致,将宽度优先遍历用于重构该八叉树。每当构建P0中的层时,计算非-S1符号的百分比。当从树根开始逐层扫描时,非-S1符号的百分比小于th0%的第一层及其上面的层形成初始上层P0。注意,这与如图9所述如何形成初始上部P0和P2一致。
[0086] 方法1300从将控制传递给形成初始上部P0的功能块1301的开始块1305开始。在方块1320中从位流中读取一个符号,并在方块1330中使用该符号在树中重构节点。在方块
1340中检验该符号是否属于符号集S1。如果属于S1,则将控制传递给方块1360。否则,在方块1350中将该节点的子节点标记为P0节点。在方块1360中检验是否存在任何没有重构的标
记P0节点。如果不再有重构的P0节点,则将控制传递给结束方块1399。否则,使控制返回到方块1320。
[0087] 在重构了P0之后,作为方法1400,在如图14所示的一个示范性实施例中重构P2。从P0中的终止节点的符号开始,继续重构该树。由于节点1410的符号“10”代表它只有左子节点,所以重构P2中的第一符号作为节点1410的左子节点1440。类似地,重构P2中的下两个符号作为节点1420的左子节点1450和节点1430的右子节点1460。在完成了P2中的第一层之后,重构该树的其余层。
[0088] 给定P1的顶层索引,可以知道完成P2的构建的时间。在完成了P2之后重构P1。
[0089] 图6在减少的维度中通过例子例示了本原理的操作。为了更易于理解起见,图6描述了如何将二进制树所代表的符号划分成三个子序列以及如何将相应符号集用于熵编码。
为了简单起见,在这个实施例中,P1不包含任何非-S1符号;以及在形成P0时不考虑阈值
th0。在下文中,详细描述这种二进制树的编码和解码过程。
[0090] 编码过程
[0091] 首先我们从末端开始通过宽度优先遍历访问节点,并定位包含最后非-S1节点的层(670)。这个层下面(直线650下面)的所有节点是P1的部分。P1的顶层索引通过固定长度编码压缩。通过P1中的节点的宽度优先遍历形成的子序列640利用符号集S1压缩成子流3。
[0092] 将八叉树中的其余节点进一步划分成P0和P2。为了简单起见,在将P0与P2分开中不考虑阈值th0,也就是说,不强制要求顶部几个层必须包括在P0中。然后我们从根部开始通过宽度优先遍历访问节点。当到达具有非-S1符号的节点时,使它的子节点及其符号包括在P0中;否则,使节点本身包括在P0中,但使它的子节点包括在P2中。当八叉树中的所有节点都得到处理时停止遍历。注意,从P1开始的节点不应该包括在P0或P2中。将通过宽度优先遍历P0获得的子序列620压缩成子流1。
[0093] 通过P2中的节点的宽度优先遍历形成另一个子序列630。将来自P2的符号编码成子流2。
[0094] 在图6的例子中,划分的和重排序的子序列如下:
[0095] P0的子序列:11,11,11,10,10,11,01,01,01;
[0096] P2的子序列:01,01,01,10,11,01,01,01;以及
[0097] P1的子序列:10,10,10,10,01,01,01,01,01,01,10,10。
[0098] 利用传统熵编码将来自P0和P1的子序列分别编码成子序列1和3。对于来自P2的子序列,不同地编码S1符号和非-S1符号。在本例中,在P2中只有一个非-S1符号('11',670)。
为了编码这个符号,首先使用S2={S1,'X'}编码'X'。然后使用S0编码该符号本身('11')。其余S1符号使用S2来编码。因此,为P2编码一个附加符号。
[0099] 在本例中,将子序列的编码结果组织成子流。因此,按如下分别将P0、P2和P1的符号编码成子流1、2和3:
[0100] 子流1中的符号:11,11,11,10,10,11,01,01,01;
[0101] 子流2中的符号:01,01,01,10,'X',11,01,01,01;
[0102] 子流3中的字符:10,10,10,10,01,01,01,01,01,01,10,10。
[0103] 解码过程
[0104] 首先我们解码指示P1的顶层索引的layer_index。按照本原理,我们解码来自子流1的符号,并通过宽度优先遍历重构该树的上部。当到达S1节点时,跳过其子节点的重构。当重构了所有P0节点时终止遍历。
[0105] 接着,我们解码来自子流2的符号并通过宽度优先遍历继续重构该树。当获得符号'X'时,我们利用符号集S0解码附加符号作为节点的实际符号。当P0和P2中的层数达到
layer_index所指的数量时终止遍历。
[0106] 接着,我们解码来自子流3的符号并通过宽度优先遍历继续重构该树。
[0107] 图15描绘了可以用于形成描述在图10中的位流的示范性编码器的框图。编码器1500的输入包括符号的序列和P1顶层的层索引。熵编码引擎1(1510)使用S2={S1,'X'}编码符号。熵编码引擎2(1520)使用符号集S0编码,以及熵编码引擎3(1530)使用符号集S1编码。
[0108] 所有熵编码引擎都从各自初始统计模型开始。如上所讨论,初始统计模型可以从大数据集开始训练。随着熵编码引擎将编码继续下去,通常更新统计模型以便更好捕获输
入数据的统计性质。在示范性编码器中讨论了三种单独熵编码引擎。在实际实现中,可以将这些引擎实现成在各种统计模型之间切换的单种引擎。
[0109] 首标信息生成器1540为位流提供补充信息。它编码P1顶层的层索引以及子流1和2的长度。当在底部P1中存在非-S1符号时,也将它们的地点编码到首标中。解码序列所需的其它信息也应该包括在首标中。用于划分八叉树,例如,th0和th1的阈值可自适应于3D网
格,并且可以随位流而变。为了使编码器和解码器同步,需要将这样的自适应阈值嵌入首标中。
[0110] 编码器1500还包括执行像确定哪种熵编码引擎用于符号那样的功能的控制器(1550)。编码位和首标信息由位流组装器1560,例如,按照描述在图10中的格式打包到输出位流中。尽管在图15中未明确示出各种元件之间的互连的细节,但本领域的普通技术人员
明白所需互连。
[0111] 图16描绘了与图15的编码器1500相对应的示范性解码器的框图,其可以用于解码描述在图10中的位流。注意,该解码器通常与编码器互逆。熵解码引擎1(1610)使用符号集S2({S1,'X'})解码熵编码引擎1编码的符号。熵解码引擎2(1620)使用符号集S0解码熵编码引擎2编码的符号。熵解码引擎3(1630)使用符号集S1及其相关统计模型解码熵编码引擎3编码的符号。首标信息分析器1640解码补充信息。
[0112] 解码器1600还包括执行像确定哪种熵解码引擎用于解码符号那样的功能的控制器(1650)。解码器1600提供符号的序列以及其它信息,例如,子流的长度作为它的输出。并且,本领域的普通技术人员明白解码器的元件之间的所需互连。
[0113] 现在参照图17,所示的是可以应用上述的特征和原理的数据发送系统或装置1700。数据发送系统或装置1700可以是,例如,使用像,例如,卫星、电缆、电话线或地面广播那样多种介质的任何一种发送信号的首端或发送系统。数据发送系统或装置1700还或可替
代地可以用于,例如,为存储设备提供信号。该发送可以在互联网或一些其它网络上提供。
数据发送系统或装置1700能够生成和输送,例如,视频内容和像,例如,3D网格模型那样的其它内容。
[0114] 数据发送系统或装置1700接收来自处理器1701的经处理数据和其它信息。在一种实现中,处理器1701处理3D网格模型的几何数据以生成符号的序列。处理器1701也可以向
1700提供指示,例如,如何将树形数据结构划分成三个部分的元数据、自适应阈值、和部分P1中非-S1符号的地点。
[0115] 数据发送系统或装置1700包括编码器1702和能够发送编码信号的发送器1704。编码器1702接收来自处理器1701的数据信息。编码器1702生成编码信号。编码器1702的熵编
码引擎可以是,例如,霍夫曼编码或算术编码。
[0116] 编码器1702可以包括子模块,其包括,例如,接收各种信息段并将其组装成结构化格式加以存储或发送的组装单元。各种信息段可以包括,例如,编码或未编码视频、和像,例如,子流长度指示符、和语法元素那样的编码或未编码元素。在一些实现中,编码器1702包括处理器1701,因此进行处理器1701的操作。
[0117] 发送器1704接收来自编码器1702的编码信号,并且在一种或多种输出信号中发送编码信号。发送器1704可以,例如,适用于发送含有一种或多种位流的节目信号,该一种或多种位流代表编码画面和/或与之相关的信息。典型的发送器执行像例如提供纠错编码、在信号中交织数据、在信号中将能量随机化、和使用调制器1706将信号调制在一种或多种载
波上的一种或多种那样的功能。发送器1704可以包括天线(未示出)或与其交接。进一步,发送器1704的实现可以局限于调制器1706。
[0118] 数据发送系统或装置1700还可通信地与存储单元1708耦合。在一种实现中,存储单元1708与编码器1702耦合,存储来自编码器1702的编码位流。在另一种实现中,存储单元
1708与发送器1704耦合,存储来自发送器1704的位流。来自发送器1704的位流可以包括,例如,经过发送器1704进一步处理的一种或多种编码位流。存储单元1708在不同实现中是标
准DVD、蓝光盘、硬盘驱动器或一些其它存储设备的一种或多种。
[0119] 现在参照图18,所示的是可以应用上述的特征和原理的数据接收系统或装置1800。数据接收系统或装置1800可以配置成在像,例如,存储设备、卫星、电缆、电话线或地面广播那样的多种介质上接收信号。该信号可以在互联网或一些其它网络上接收。
[0120] 数据接收系统或装置1800可以是,例如,蜂窝式电话、计算机、机顶盒、电视机、或接收编码视频和提供,例如,解码视频信号加以显示(例如,向用户显示)、加以处理、或加以存储的其它设备。因此,数据接收系统或装置1800可以将它的输出提供给,例如,电视机的屏幕、计算机监视器、计算机(加以存储、处理、或显示)、或一些其它存储、处理、或显示设备。
[0121] 数据接收系统或装置1800能够接收和处理数据信息,该数据信息可以包括,例如,3D网格模型。数据接收系统或装置1800包括接收像,例如,描述在本申请的实现中的信号那样的编码信号的接收器1802。接收器1802可以接收,例如,提供3D网格模型和/或纹理图像的一种或多种的信号、或从图17的数据发送系统1700输出的信号。
[0122] 接收器1802可以,例如,适用于接收含有代表编码画面的多种位流的节目信号。典型的接收器执行像,例如,接收调制和编码数据信号,使用解调器1804从一种或多种载波中解调数据信号,去随机化信号中的能量,解交织信号中的数据,和纠错解码信号的一种或多种那样的功能。接收器1802可以包括天线(未示出)或与之交接。接收器1802的实现可以局限于解调器1804。
[0123] 数据接收系统或装置1800包括解码器1806。接收器1802向解码器1806提供接收的信号。接收器1802提供给解码器1806的信号可以包括一种或多种编码位流。解码器1806输
出像,例如,包括视频信息的解码视频信号那样的解码信号。解码器1806可以是,例如,描述在图16中的解码器1600。
[0124] 数据接收系统或装置1800还可通信地与存储单元1807耦合。在一种实现中,存储单元1807与接收器1802耦合,接收器1802存取来自存储单元1807的位流。在另一种实现中,存储单元1807与解码器1806耦合,解码器1806存取来自存储单元1807的位流。从存储单元
1807中存取的位流在不同实现中包括一种或多种编码位流。存储单元1807在不同实现中是
标准DVD、蓝光盘、硬盘驱动器或一些其它存储设备的一种或多种。
[0125] 在一种实现中将来自解码器1806的输出数据提供给处理器1808。处理器1808在一种实现中是配置成进行3D网格模型重构的处理器。在一些实现中,解码器1806包括处理器
1808,因此进行处理器1808的操作。在其它实现中,处理器1808是像,例如,机顶盒或电视机那样的下游设备的一部分。
[0126] 因此,我们提供了具有特定特征和方面的一种或多种实现。尤其,我们提供了与熵编码和解码有关的几种实现。分层熵编码和解码可以允许像,例如,压缩3D网格的几何数据、随机2D坐标、和具有可变统计量的任何数据源的多种应用。但是,可以设想出这些实现的变体和另外应用,它们都在我们的公开之内,以及所述实现的特征和方面可以适用于其
它实现。
[0127] 描述在本申请中的几种实现和特征可以用在MPEG3DGC标准及其扩展标准的背景下。另外,这些实现和特征可以用在另一种标准(现有或将来)的背景下,或用在不牵涉标准的背景下。
[0128] 提到本原理的“一个实施例”、“实施例”、“一种实现”或“实现”以及它们的其它变体意味着结合该实施例所述的特定特征、结构、特性等包括在本原理的至少一个实施例中。因此,在说明书各处出现的短语“在一个实施例中”、“在实施例中”、“在一种实现中”或“在实现中”以及任何其它变体的出现不一定都指代相同的实施例。
[0129] 另外,本申请或其权利要求书可能提及“确定”各种信息段。确定信息可以包括,例如,估计信息,计算信息,预测信息或从存储器中检索信息的一种或多种。
[0130] 要认识到的是,例如,在“A/B”、“A和/或B”和“A和B的至少一个”的情况中,如上“/”、“和/或”和“至少一个”的任何一种的使用意欲包括只对第一所列选项(A)的选择、只对第二所列选项(B)的选择、或者对两个选项(A和B)的选择。作为进一步的例子,在“A、B和/或C”、“A、B和C的至少一个”和“A、B或C的至少一个”的情况中,这样的措辞意欲包括只对第一所列选项(A)的选择、只对第二所列选项(B)的选择、只对第三所列选项(C)的选择、只对第一和第二所列选项(A和B)的选择、只对第一和第三所列选项(A和C)的选择、只对第二和第三所列选项(B和C)的选择、或者对全部三个选项(A和B和C)的选择。如本领域和相关领域普通技术人员容易认识到,这可以被扩展用于很多列出的项目。
[0131] 另外,许多实现可以在编码器(例如,编码器1702)、解码器(例如,解码器1806)、处理来自解码器的输出的后处理器(例如,处理器2108)、或向编码器提供输入的预处理器(例如,处理器1701)的一个或多个中实现。并且,通过本公开可以设想出其它实现。
[0132] 本文所述的实现可以以,例如,方法或进程、装置、软件程序、数据流、或信号的形式实现。即使只在单种实现形式的背景下讨论(例如,只作为方法来讨论),所讨论的特征的实现也可以以其它形式(例如,装置或程序)实现。装置可以以,例如,适当硬件、软件、或固件的形式实现。方法可以在,例如,像例如处理器那样的装置中实现,处理器一般指处理设备,包括,例如,计算机、微处理器、集成电路、或可编程逻辑设备。处理器还包括像,例如,计算机、蜂窝式电话、便携式/个人数据助理(“PDA”)、和有助于在最终用户之间传送信息的其它设备那样的通信设备。
[0133] 本文所述的各种进程和特征的实现可以在多种不同装备或应用,尤其,例如,与数据编码、数据解码、3D建模、3D重构、和3D计算机图形的其它处理相联系的装备或应用中实施。这样装备的例子包括编码器、解码器、处理来自解码器的输出的后处理器、向编码器提供输入的预处理器、视频编码器、视频解码器、视频编解码器、万维网服务器、机顶盒、膝上型电脑、个人计算机、蜂窝式电话、PDA、游戏控制台、和其它通信设备。应当清楚,该装备可以是移动的,甚至可以安装在移动工具中。
[0134] 另外,这些方法可以通过由处理器执行的指令来实现,这样的指令(和/或由实现产生的数据值)可以存储在像,例如,集成电路、软件载体或像,例如,硬盘、致密盘(“CD”)、光盘(像,例如,往往称为数字多功能盘或数字视频盘的DVD那样)、随机存取存储器
(“RAM”)、或只读存储器(“ROM”)那样的其它存储设备那样的处理器可读介质上。这些指令可以形成有形体现在处理器可读介质上的应用程序。这些指令可以在,例如,硬件、固件、软件或它们的组合体中。这些指令可以在,例如,操作系统、单独应用程序、或两者的组合体中找到。因此,可以将处理器表征成,例如,配置成执行进程的设备和包括含有执行进程的指令的处理器可读介质(像存储设备那样)的设备两者。并且,除了指令之外或取代指令,处理器可读介质可以存储由实现产生的数据值。
[0135] 对于本领域的普通技术人员来说,显而易见,这些实现可以产生格式化成传送可以,例如,存储或发送的信息的多种信号。该信息可以包括,例如,执行方法的指令、或由所述实现之一产生的数据。例如,可以将信号格式化成传送写入或读取所述实施例的语法的
规则作为数据,或传送所述实施例写入的实际语法值作为数据。这样的信号可以格式化成,例如,电磁波(例如,使用频谱的射频部分)或基带信号。格式化可以包括,例如,编码数据流和将编码数据流调制在载波上。信号传送的信息可以是,例如,模拟或数字信息。众所周知,可以在多种不同有线或无线链路上发送信号。可以将信号存储在处理器可读介质上。
[0136] 本文描述了许多实现。不过应该明白,可以作出各种修改。例如,可以组合、补充、修改、或除去不同实现的一些元素以形成其它实现。另外,本领域的普通技术人员应该明白,可以用其它结构和进程取代本文公开的那些,所得实现以至少基本相同的方式执行至
少基本相同的功能,以获得与公开的实现至少基本相同的结果。于是,这些和其它实现可以通过本申请设想出来。
QQ群二维码
意见反馈