泊松重建 | HyperPlane

泊松重建

开源项目地址

PoissonRecon

基本思想

目的是计算3D指示函数(indicator function)X\mathcal{X}X\mathcal{X}是一个泛函,将曲面外的点映射为00,将曲面内的点映射为11

解决问题的关键依据是:模型曲面的有向采样点与模型指示函数之间存在积分的关系。

使用minXXV\min_\mathcal{X} \| \nabla \mathcal{X} - \vec{V} \|,找到合适的函数X\mathcal{X}使得其梯度最贴近由采样点定义的向量场V\vec{V}。在此基础上应用散度,将这个变分问题转换为一个标准泊松问题:

ΔX=X=V\Delta \mathcal{X} = \nabla \cdot \nabla \mathcal{X} = \nabla \cdot \vec{V}

泊松重建方法是一个全局求解的方法,一次性考虑所有的点。

系统概览

输入: 曲面采样集合sSs \in S,其中每一个元素都包含坐标s.ps.p和向内法线s.Ns.\vec{N};并假设这些点都在模型MM的曲面M\partial M上,或者离曲面很近。

输出:模型MM对应的指示函数X\mathcal{X},并提取等值面(isosurface)作为曲面。

挑战:从采样点精确计算X\mathcal{X}

具体思路

由于指示函数成片的都是常数(在模型外全是0,在模型内全是1),梯度场的计算可能导致在曲面边界处存在没有边界的值(unbounded value)。为了拒绝这种情况发生,将指示函数与平滑滤波器卷积并考虑卷积后函数的梯度场。

引理:给定带边界的立体模型MM,令XM\mathcal{X}_M表示MM的指示函数,NM(p)\vec{N}_{\partial M}(p)pMp \in \partial M处的向内曲面法线,F~(q)\tilde{F}(q)为平滑滤波器,并且F~p(q)=F~(qp)\tilde{F}_p(q) = \tilde{F}(q-p)将它转移到点pp处。平滑后指示函数的梯度等于由平滑曲面法线场获得的向量:

(XMF~)(q0)=MF~p(q0)NM(p)dp\nabla (\mathcal{X}_M * \tilde{F})(q_0) = \intop_{\partial M} \tilde{F}_p(q_0) \vec{N}_{\partial M}(p) dp

(原文中有证明)

由于不知道曲面几何,因此不能计算曲面积分;但是输出的有向点集提供了足够的信息去使用离散求和估计积分。

使用点集SSM\partial M划分为独立的块(patch)PsM\mathscr{P}_s \subset \partial M,在独立的块上使用采样点坐标s.ps.p估计在块Ps\mathscr{P}_s上的积分,通过块的面积尺度化(每个块的求和权重):

(XmF~)(q)=sSPsF~p(q)NM(p)dpsSPsF~s.p(q)s.NV(q)\begin{aligned} \nabla (\mathcal{X}_m * \tilde{F})(q) &= \sum_{s \in S} \intop_{\mathscr{P}_s} \tilde{F}_p(q) \vec{N}_{\partial M}(p)dp \\ &\approx \sum_{s \in S} | \mathscr{P}_s | \tilde{F}_{s.p}(q) s.\vec{N} \equiv \vec{V}(q) \end{aligned}

虽然任意的平滑滤波器F~\tilde{F}理论上都可行,但是实际上需要慎重选择,最好能满足以下两个条件:

  1. 足够窄,不至于过平滑(over-smooth)
  2. 足够宽,可以很好的通过由块面积尺度化的在s.ps.p处的值估计Ps\mathscr{P}_s上的积分

因此选择高斯滤波器,其方差与分辨率相关。

求解 X~=V\nabla \tilde{\mathcal{X}} = \vec{V},然而V\vec{V}一般是不可积的,所以解析解一般不存在。为了更好的估计最小二乘解,在这个等式上应用散度算子得到一个泊松方程

ΔX~=V\Delta \tilde{\mathcal{X}} = \nabla \cdot \vec{V}

实现

定义了空间函数在曲面附近有高分辨率,远离曲面有低分辨率(八叉树);向量场V\vec{V}由空间中一些函数的线性和表示;设置并求解泊松方程;提取指数函数等值面。

离散化

必须选择函数空间去离散化这个问题。使用均匀分辨率的结果开销太大,因此使用八叉树(octree)。

使用采样点的位置定义八叉树O\mathscr{O}并且将函数FoF_o与树的每个节点oOo \in \mathscr{O}关联,选择的树和函数需要满足以下条件:

  1. 向量场V\vec{V}可以用FoF_o的线性和精准有效地表示
  2. FoF_o项表示的泊松方程矩阵形式可以被有效求解
  3. 指示函数作为FoF_o和的形式可以在模型曲面附近被精准有效地估计

定义函数空间

给定采样点集SS和最大树深度DD,定义八叉树O\mathscr{O}为满足每个采样点都落到深度DD的叶节点上的最小八叉树。

定义一个函数空间,由一个固定的、单位积分的(unit-intergral)基函数F:R3RF: \mathbb{R}^3 \rightarrow \mathbb{R}的平移和缩放张成。对于每个节点oOo \in \mathscr{O},设FoF_o为以oo为中心且由oo的尺寸拉伸的单位积分“节点函数”:

Fo(q)F(qo.co.w)1o.w3F_o(q) \equiv F \left( \frac{q - o.c}{o.w} \right) \frac{1}{o.w^3}

其中o.co.co.wo.w分别是节点oo的中心和宽。

函数空间FO,FSpan{Fo}\mathscr{F}_{\mathscr{O}, F} \equiv \text{Span}\{ F_o \}有多分辨率结构,类似于传统的小波表示。越好的节点对应越高频的函数,离曲面越近函数表示越精确。

选择基函数

在选择基函数FF中,目的是选择一个函数,使得向量场V\vec{V}可以由节点函数{Fo}\{ F_o \}的线性和精确有效地表示。

如果将每个采样点的坐标替换为包含它的叶节点中心,向量场V\vec{V}可以由{Fo}\{ F_o \}的线性和有效地表示:

F(q)=F~(q2D)F(q) = \tilde{F} \left( \frac{q}{2^D} \right)

这样每一个采样点都贡献了一项(法向量)到对应它的叶子的节点函数的系数。

由于最大树深度DD对应2D2^{-D}的采样宽度,平滑滤波器应该近似为方差在2D2^{-D}阶上的高斯。因此FF一个近似为单位方差的高斯。

为了效率我们通过一个简洁的支持函数近似一个单位方差的高斯,因此有:

  1. 得到的散度和拉普拉斯算子是稀疏的
  2. 估计在点qq处表示为FoF_o线性和的函数,仅仅需要将在qq比较近的节点oOo \in \mathscr{O}上求和。

设置FF为盒滤波器(box filter)与自己的第nn次卷积,得到的基函数FF

F(x,y,z)(B(x)B(y)B(z))n  with  B(t)={1t<0.50otherwiseF(x,y,z) \equiv (B(x)B(y)B(z))^{*n} ~~ \text{with} ~~ B(t) = \begin{cases} 1 & |t| < 0.5 \\ 0 & \text{otherwise} \end{cases}

nn增长的时候,FF更接近高斯并且支持范围更大;在该文的实际实现中使用n=3n=3

向量场定义

为了获得亚节点精度,该方法拒绝将采样点的坐标放在包含它的叶节点中心,而是在8个最邻近节点间使用三线性内插。因此,将指示函数的梯度场近似定义为:

V(q)sSoNgbrD(s)αo,sFo(q)s.N\vec{V}(q) \equiv \sum_{s \in S} \sum_{o \in \text{Ngbr}_D(s)} \alpha_{o,s} F_o(q) s.\vec{N}

其中NgbrD(s)\text{Ngbr}_D(s)是与s.ps.p最近的8个深度D的节点,{αo,s}\{ \alpha_{o,s} \}是三线性内插权重。

这里先假设采样是均匀的(后面有对不均匀采样的说明),假设块Ps\mathscr{P}_s的面积是常数并且V\vec{V}是在一个数乘差别下对平滑指示函数的梯度很好的近似。

泊松求解

在定义了向量场V\vec{V}之后,就可以开始求解函数X~FO,F\tilde{\mathcal{X}} \in \mathscr{F}_{\mathscr{O},F}使得X~\tilde{\mathcal{X}}的梯度更接近V\vec{V},即泊松方程ΔX~=V\Delta \tilde{\mathcal{X}} = \nabla\cdot \vec{V}

求解X~\tilde{\mathcal{X}}的一个挑战是虽然函数X~\tilde{\mathcal{X}}V\vec{V}的坐标函数在空间FO,F\mathscr{F}_{\mathscr{O},F}中,但是函数ΔX~\Delta \tilde{\mathcal{X}}V\nabla \cdot \vec{V}却不是必须的。

求解函数X~\tilde{\mathcal{X}}使得ΔX~\Delta \tilde{\mathcal{X}}在空间FO,F\mathscr{F}_{\mathscr{O},F}上的投影和V\nabla \cdot \vec{V}的投影最近。由于函数FoF_o在一般情况下不是有正交基构造的,之间求解这个问题会变得特别没有效率。将这个问题简化为求解函数X~\tilde{\mathcal{X}}最小化:

oOΔX~V,Fo2=oOΔX~,FoV,Fo2\sum_{o \in \mathscr{O}} \| \langle \Delta \tilde{\mathcal{X}} - \nabla \cdot \vec{V}, F_o \rangle \|^2 = \sum_{o \in \mathscr{O}} \| \langle \Delta \tilde{\mathcal{X}}, F_o \rangle - \langle \nabla \cdot \vec{V}, F_o \rangle \|^2

给定第oo个坐标为vo=V,Fov_o = \langle \nabla \cdot \vec{V}, F_o \rangleO|\mathscr{O}|维向量vv,目标是求解函数X~\tilde{\mathcal{X}}使得X~\tilde{\mathcal{X}}的拉普拉斯在每一个FoF_o上的投影都尽可能接近vv

为了写成矩阵形式,令X~=oxoFo\tilde{\mathcal{X}} = \sum_o x_o F_o,因此是在求解向量xROx \in \mathbb{R}^{|\mathscr{O}|}。然后定义O×O|\mathscr{O}| \times |\mathscr{O}|矩阵LL使得LxLx返回拉普拉斯和每个FoF_o的点积。对于所有的o,oOo, o' \in \mathscr{O}LL(o,o)(o, o')元素为:

Lo,o2Fox2,Fo+2Foy2,Fo+2Foz2,FoL_{o,o'} \equiv \langle \frac{\partial^2 F_o}{\partial x^2}, F_{o'} \rangle + \langle \frac{\partial^2 F_o}{\partial y^2}, F_{o'} \rangle + \langle \frac{\partial^2 F_o}{\partial z^2}, F_{o'} \rangle

求解X~\tilde{\mathcal{X}}等价于

minxROLxv2\min_{x \in \mathbb{R}^{|\mathscr{O}|}} \| Lx - v \|^2

矩阵LL是稀疏且对称的。(稀疏是因为FoF_o是局部的,对称是因为fg=fg\intop f''g = - \intop f'g'

等值面提取

为了获得重建的曲面M~\partial \tilde{M},必须首先选取等值面对应的值并且从计算得到的指示函数中提取对应的等值面。

选择这个值使得提取的曲面近似输入采样点的位置。通过估计采样点处的X~\tilde{\mathcal{X}}并计算平均值用以提取等值面:

M~{qR3X~(q)=γ}  with  γ=1SsSX~(s.p)\partial \tilde{M} \equiv \{ q \in \mathbb{R}^3 | \tilde{\mathcal{X}}(q) = \gamma \} ~~ \text{with} ~~ \gamma = \frac{1}{|S|} \sum_{s \in S} \tilde{\mathcal{X}} (s.p)

这个选择有一个好处是X~\tilde{\mathcal{X}}的尺度缩放不会改变等值面。(向量场定义有提到一个数乘的差别)

非均匀采样

前面的推导是在均匀采样假设下的。

估计局部采样密度

给定深度D^D\hat{D} \le D设置深度估计器为在深度D^\hat{D}处节点函数的和:

WD^(q)sSoNgbrD^(s)αo,sFo(q)W_{\hat{D}}(q) \equiv \sum_{s \in S} \sum_{o \in \text{Ngbr}_{\hat{D}}(s)} \alpha_{o,s}F_o(q)

计算向量场

每一个采样点的贡献和它在曲面上对应的面积是相关的。面积跟采样密度逆相关:

V(q)sS1WD^(s.p)oNgbrD(s)αo,sFo(q)s.N\vec{V}(q) \equiv \sum_{s \in S} \frac{1}{W_{\hat{D}} (s.p)} \sum_{o \in \text{Ngbr}_D(s)} \alpha_{o,s} F_o(q) s.\vec{N}

只适应采样点贡献大小在稀疏采样区域会导致很差的噪声平滑。因此针对局部采样密度增加适应平滑滤波器F~\tilde{F}的宽度。

由于深度更小的节点函数对应更宽的平滑滤波器,定义

V(q)sS1WD^(s.p)oNgbrDepth(s.p)(s)αo,sFo(q)s.N\vec{V}(q) \equiv \sum_{s \in S} \frac{1}{W_{\hat{D}} (s.p)} \sum_{o \in \text{Ngbr}_{\text{Depth}(s.p)}(s)} \alpha_{o,s} F_o(q) s.\vec{N}

在这个定义中,Depth(s.p)\text{Depth}(s.p)表示采样点sSs \in S希望的深度。被定义为在所有采样点上计算平均采样密度WW

Depth(s.p)min(D,D+log4(WD^(s.p)/W))\text{Depth}(s.p) \equiv \min (D, D + \log_4(W_{\hat{D}} (s.p) / W))

平滑滤波器的宽度和相关的曲面块PsP_s的半径相关。

选取提取等值面的值

X~\tilde{\mathcal{X}}在采样点处的加权平均值:

M~{qR3X~(q)=γ}  with  γ=1WD^(s.p)X~(s.p)1WD^(s.p)\partial \tilde{M} \equiv \{ q \in \mathbb{R}^3 | \tilde{\mathcal{X}}(q) = \gamma \} ~~ \text{with} ~~ \gamma = \frac{\sum \frac{1}{W_{\hat{D}}(s.p)} \tilde{\mathcal{X}}(s.p)}{\sum \frac{1}{W_{\hat{D}}(s.p)}}