简介

泊松重建是Michael Kazhdan等在2006年提出的网格重建方法,其文章题目为“Poisson Surface Reconstruction”。
Poisson-Rec的输入是带有法向量属性的点云数据(也可以有RGB信息),输出是三角网格模型,下面来直观的感受一下泊松重建的输入和输出:

PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码

表面重建流程:

1、构建八叉树:采用的是自适应的空间网格划分的方法(根据点云的密度调整网格的深度),根据采样点集的位置定义八叉树,然后细分八叉树使每个采样点都落在深度为D的叶节点;
2、设置函数空间:对八叉树的每个节点设置空间函数 F,所有节点函数 F 的线性和可以表示向量场 V,基函数F采用了盒滤波的n维卷积;
3、创建向量场:均匀采样的情况下,假设划分的块是常量,通过向量场 V 逼近指示函数的梯度。采用三次条样插值(三线插值);
4、求解泊松方程:方程的解采用拉普拉斯矩阵迭代求出;
5、提取等值面:为得到重构表面,需要选择阈值获得等值面;先估计采样点的位置,然后用其平均值进行等值面提取,然后用 Marching Cubes(移动立方体)算法得到等值面。

算法原理

Possion-Rec是一个非常直观的方法。它的核心思想是点云代表了物体表面的位置,其法向量代表了内外的方向。通过隐式地拟合一个由物体派生的指示函数,可以给出一个平滑的物体表面的估计。

给定一个区域 M 及其边界 ∂M ,指示函数 χM 定义为:

PCL泊松重建python代码 泊松重建什么意思_点集_02


这样,把重构 S = ∂M 的问题转换为重构 χM 的问题。

作者给出了将点云及其法向量和 χM 联系起来的公式,下图非常形象地描述了这二者的联系。

PCL泊松重建python代码 泊松重建什么意思_点集_03


这个指示函数是个分段函数,定义模型内部的值大于0,外部的值小于0,而为0的部分即为等值面,提取出来就是几何目标模型的表面。

基本思路
梯度关系得到采样点和指示函数的积分关系,根据积分关系利用划分块的方法获得点集的向量场,计算指示函数梯度场的逼近,构成泊松方程。根据泊松方程使用矩阵迭代求出近似解,采用移动立方体算法提取等值面,对所测数据点集重构出被测物体的模型,泊松方程在边界处的误差为零,因此得到的模型不存在假的表面框
直接计算梯度场会引起向量场在表面边缘的无穷大值。因此首先用平滑滤波卷积指示函数,然后求平滑函数的梯度场。
高斯散度理论:平滑指示函数的梯度等于平滑表面法向场得到的向量场
由于曲面未知,无法直接计算表面积分,把采样点集划分为小的区域块,通过对所有块的积分求和近似计算。知道向量场V后,可求指示函数。但向量场V不可积,使用最小平方逼近理论求解,应用散度算子得到泊松方程。
泊松表面重建一次性把所有的点都考虑在内,因此对噪声点有很好的弹性。泊松方程允许的层次结构支持局部的基函数,因此对稀疏线性系统的情况有很好的支持。在此基础上描述了多尺度的空间自适应算法,其时间和空间复杂度同重建模型的大小成正比。

从法向量到梯度空间

对于任意点 PCL泊松重建python代码 泊松重建什么意思_点云_04 ,定义PCL泊松重建python代码 泊松重建什么意思_点集_05为向内的表面法向量,PCL泊松重建python代码 泊松重建什么意思_点集_06为一个平滑滤波器,PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_07PCL泊松重建python代码 泊松重建什么意思_点集_08沿p方向的平移。因为 PCL泊松重建python代码 泊松重建什么意思_点云_09 一般意义上是不好求导的,这里用 PCL泊松重建python代码 泊松重建什么意思_八叉树_10 的导数来近似

PCL泊松重建python代码 泊松重建什么意思_点云_11

(1)梯度空间的近似

由于PCL泊松重建python代码 泊松重建什么意思_点集_05的分布是未知的,需要通过观测PCL泊松重建python代码 泊松重建什么意思_八叉树_13来近似。考虑离散点集 PCL泊松重建python代码 泊松重建什么意思_八叉树_14PCL泊松重建python代码 泊松重建什么意思_点云_15被分割为互不相交的区域 PCL泊松重建python代码 泊松重建什么意思_点云_16。(1)可以转化为积分求和,并将每个小积分近似为常函数(可对照上图中的第二副图),用代表点PCL泊松重建python代码 泊松重建什么意思_八叉树_17对应的函数值和PCL泊松重建python代码 泊松重建什么意思_八叉树_18的面积的积分代替:

PCL泊松重建python代码 泊松重建什么意思_八叉树_19

(2)

这里希望平滑滤波器PCL泊松重建python代码 泊松重建什么意思_点集_08能够尽量地窄,不过分平滑数据,同时尽量地宽,使得积分近似能够更准确。高斯滤波器是一种常见的选择。

求解泊松问题

向量空间 PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_21和指示函数 PCL泊松重建python代码 泊松重建什么意思_八叉树_22 满足

PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_23

(3)然而,PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_21向量场通常意义上是没法积分的。为了得到(3)式的最小二乘解,将(3)式两边求导,就得到了拉普拉斯方程:

PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_25

(4)

作者有一个预设,且有一系列数学的证明,证明了指示函数的梯度等于结合表面法线场计算得到的向量场。这也是高斯散度理论。(理论如此,实际是求近似)
倒三角是梯度(希望到这里你还撑的住。)
但是,指示函数不知道,梯度不知道。只能计算出向量场。所以应用散度算子这一媒介。转化成了一个泊松方程。

(倒三角和正三角什么鬼!)其中,

PCL泊松重建python代码 泊松重建什么意思_八叉树_26


是我们想要求解出的函数,这个正三角就是,梯度的散度(也是拉普拉斯算子)

也就是 PCL泊松重建python代码 泊松重建什么意思_八叉树_22 梯度的散度等于向量场的散度,即:

PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_28


解这个泊松方程就能找到指示函数。方程的解采用拉普拉斯矩阵迭代求出梯度与散度补充:

PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_29


3. 散度

PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_30

具体实现

空间划分

作者采用了一种自适应的网格结构octree来划分空间,并且octree上定义了一个函数空间PCL泊松重建python代码 泊松重建什么意思_八叉树_31。下图给出了octree在三维空间对一个物体的划分,物体边缘的网格密度远大于远离物体的网格密度。

PCL泊松重建python代码 泊松重建什么意思_点集_32


空间上的基函数选择

如何选择函数空间PCL泊松重建python代码 泊松重建什么意思_八叉树_31实际上挺有学问的。因为PCL泊松重建python代码 泊松重建什么意思_八叉树_31一旦给定,定义在这个octree上的向量空间PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_21和指示函数PCL泊松重建python代码 泊松重建什么意思_八叉树_22都会通过PCL泊松重建python代码 泊松重建什么意思_八叉树_31的线性组合去近似。这样,求解PCL泊松重建python代码 泊松重建什么意思_八叉树_22就转化为求解PCL泊松重建python代码 泊松重建什么意思_八叉树_31上的参数组合,进而转化为求解一个线性方程组。

给定octree的深度PCL泊松重建python代码 泊松重建什么意思_八叉树_40,作者根据选择了下面的基函数PCL泊松重建python代码 泊松重建什么意思_点集_08

PCL泊松重建python代码 泊松重建什么意思_八叉树_42


PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_43代表n次卷积。当PCL泊松重建python代码 泊松重建什么意思_点云_44趋向于无穷时,PCL泊松重建python代码 泊松重建什么意思_点集_08趋向于高斯函数,它的定义域也越来越大。当PCL泊松重建python代码 泊松重建什么意思_点集_46时,定义域为PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_47

octree上某个节点o对应的函数PCL泊松重建python代码 泊松重建什么意思_八叉树_31定义为:

PCL泊松重建python代码 泊松重建什么意思_八叉树_49


其中PCL泊松重建python代码 泊松重建什么意思_八叉树_50是的PCL泊松重建python代码 泊松重建什么意思_点云_51中心,PCL泊松重建python代码 泊松重建什么意思_点集_52PCL泊松重建python代码 泊松重建什么意思_点云_51的宽度。假设根节点(第0层)的宽度为PCL泊松重建python代码 泊松重建什么意思_点集_54,那么第PCL泊松重建python代码 泊松重建什么意思_点云_55层节点的宽度为PCL泊松重建python代码 泊松重建什么意思_点云_56。这个函数空间和小波空间很像。Poisson求解

(坚持一下,就快讲完了!)

Poisson求解的方法是PCL泊松重建python代码 泊松重建什么意思_八叉树_57投影。定义octree的节点集合为PCL泊松重建python代码 泊松重建什么意思_点云_58。向量空间PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_21可以近似为:

PCL泊松重建python代码 泊松重建什么意思_点云_60


其中,PCL泊松重建python代码 泊松重建什么意思_点云_61PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_62的八个最近邻的叶节点,PCL泊松重建python代码 泊松重建什么意思_八叉树_63是三线性插值的权重

虽然PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_21PCL泊松重建python代码 泊松重建什么意思_八叉树_22都可以在函数空间上表示出来,PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_66PCL泊松重建python代码 泊松重建什么意思_点云_67 却未必有定义。因此将(4)近似为最小化其在PCL泊松重建python代码 泊松重建什么意思_八叉树_31上的投影:

PCL泊松重建python代码 泊松重建什么意思_点集_69



PCL泊松重建python代码 泊松重建什么意思_点集_70


那么求解PCL泊松重建python代码 泊松重建什么意思_八叉树_22即是求解PCL泊松重建python代码 泊松重建什么意思_点集_72

PCL泊松重建python代码 泊松重建什么意思_八叉树_73


PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_74


对上式右边PCL泊松重建python代码 泊松重建什么意思_点集_75求偏导得,

PCL泊松重建python代码 泊松重建什么意思_点集_76


其中,设octree的节点数为PCL泊松重建python代码 泊松重建什么意思_PCL泊松重建python代码_77PCL泊松重建python代码 泊松重建什么意思_点云_78矩阵PCL泊松重建python代码 泊松重建什么意思_点云_79PCL泊松重建python代码 泊松重建什么意思_八叉树_80位置上的值为:

PCL泊松重建python代码 泊松重建什么意思_八叉树_81

表面提取
用Marching Cubes类似的方法。注意 iso(等值面) 的值取自S个划分的平均,作者还讨论了非均匀采样下的算法。