MPEG G-PCC/TMC13总结(一)八叉树编码:八叉树如何实现对点云数据的编码/解码

一.前言

八叉树(Octree)编码是目前GPCC中对几何信息最为通用的一种编码方式,也是trisoup编码的基础。经过八叉树编码,点云的几何信息就会被转换为二进制的占位信息(occupancy bits),实现编码的目的,再结合相应的熵编码技术,进一步降低码流。

二.八叉树编码的过程

GPCC中的八叉树划分,来源于PCL(point cloud library, https://pointclouds.org/),其做法为:首先对点云进行预处理:首先对点云构建一个包含全部输入点云中所有点的最小长方体,称为包围盒。包围盒的原点坐标即为点云中各点坐标在x、y、z三个维度上的最小值组成。接下来对点云的中的点进行坐标转换:以此坐标原点为基准,使点的原始坐标转变为相对坐标原点的相对坐标。然后再对点的几何坐标进行环外量化,这一步量化主要起到缩放的作用。由于量化取整,使得一部分点的几何信息相同,根据参数来决定是否移除这些几何信息重复的点。接下来,按照广度优先遍历的顺序对预处理之后的点云进行八叉树划分:以经过预处理之后的包围盒为根节点,对其八等分,产生八个子立方体作为其子节点,并用八个比特表示其子节点的占用信息,称为空间占用码。如果子立方体中有点,则表示该子节点被占据,则对应占用比特取值为1,否则取值为0。对被占据的子立方体继续进行划分,直到划分得到的叶子节点为1x1x1的单位立方体时停止划分,完成几何八叉树的编码。在八叉树编码的过程中,对产生的空间占用码以及最终的叶子节点中包含的点数(当点云中包含重复点时)进行熵编码,得到输出码流。

在这里插入图片描述

八叉树不断迭代划分的结果就是对点云的几何坐标不断地精细化,其最终效果如下

在这里插入图片描述

三.八叉树解码

根据上一节的描述,八叉树编码的结果是一串二进制占位比特,那在解码端如何恢复几何信息呢?首先我们确定一下解码端的目标与得到的信息:

解码端的目标:需要重建的几何信息,即点云中各点的几何坐标

实际得到的:编码的占位信息即八叉树节点的occupancy,也就是占位比特

再回顾一下编码过程:预处理之后会得到坐标原点、包围盒(也就是根节点)三边边长,其中三边边长都应该取2的整数次幂。在八叉树划分、编码过程中,编码的各层节点的占位信息,由于编码顺序是按照广度优先的方式遍历,且各子节点的索引按xyz方向顺序排列,因此对节点每进行一次划分与占位码编码,即代表着对该节点中的所有点的坐标精确了一位。在这个过程中,点云中的点的坐标实际上是被转换成2进制逐比特编码了。

举个例子:

假如点云中有两个点:其预处理之后的坐标为(0,0,0)与(255,255,255),包围盒三边边长为(256,256,256),当子节点边长为(1,1,1)时即代表划分到了111的体素块,八叉树划分也就随之停止。
在这里插入图片描述

对此点云进行第一层八叉树划分:当前层节点边长为(256,256,256),子节点层节点边长为(128,128,128)由于只有子节点0与7被占据,故八叉树的编码结果为10000001

在这里插入图片描述

继续第二层八叉树划分:只对上一层的子节点0与7进行划分:当前层节点边长为(128,128,128),子节点层节点边长为(64,64,64)。对于节点0,只有子节点0被占据,对于节点7,只有子节点7被占据,因此其划分结果是10000000,00000001
在这里插入图片描述

继续第三层八叉树划分:与第二层类似,当前层节点边长为(64,64,64),子节点层节点边长为(32,32,32)。其划分结果是10000000,00000001

依次类推,直至第8层,当前层节点边长为(2,2,2),子节点层节点边长为(1,1,1),此时已经不能再继续划分了,因为点与点的最小间隔也就是1,此时的被占据的子节点也就是一个被占据的111的立方体就可以代表一个点了,其划分结果是10000000,00000001

这样,两个点的点云坐标经过八叉树编码的二进制码流串(未经过熵编码)为:

在这里插入图片描述

解码端如何恢复?

已知信息为根节点边长,其可以从头信息中解码出来:(256,256,256),下面开始根据二进制码流解码:

第一层:已知当前层节点边长为(256,256,256),子节点层节点边长为(128,128,128),第一层的码流为10000001,可以计算,一个(256,256,256)的根节点的子节点0与子节点7被占据。其中子节点0的坐标为(0+0,0+0,0+0)即(0,0,0),子节点7坐标为(0+128,0+128,0+128)即(128,128,128)
在这里插入图片描述

第二层:已知当前层节点边长为(128,128,128),子节点层节点边长为(64,64,64)第二层的码流为10000000,00000001,可以得知,对于节点0,其子节点0被占据,对于节点7,其子节点7被占据。其中,节点0的子节点0的坐标为(0+0,0+0,0+0),节点7的子节点7的坐标为(128+64,128+64,128+64)即(192,192,192)
在这里插入图片描述

依次类推,当至第八层时,对应的子节点坐标即点坐标:(0+0,0+0,0+0)即(0,0,0),以及(192+32+16+8+4+2+1,192+32+16+8+4+2+1,192+32+16+8+4+2+1)即(255,255,255)。至此实现了对坐标的解码。

四.孤立点编码

八叉树编码的每一次划分,都会使该节点内的每一个点的坐标精确一位。当点云序列比较稠密的时候,这是一种非常划算的编码方式,但是当点云特别稀疏时,比如我们例子里的情况,从第二层开始,一个节点只有一个点,这样的代价是拿8bit去编码3bit,效率反而不如不编码。这时GPCC中更多的是采用另一种编码方式:孤立点(single point)编码,也就是直接编码模式(DCM),直接编码点的剩余坐标。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值