← 返回技术文章
在点云重建中,我们通常有:
目标是:
从这些点和法向量重建一个连续的表面 S。
Poisson Surface Reconstruction (Kazhdan et al., 2006, 2007) 的核心想法是:
将点云的法向信息看作是某个隐函数的梯度场,然后通过求解泊松方程来恢复这个隐函数。
换句话说:
∇χ=v
其中:
我们定义一个函数 χ(x) 表示物体内部外部关系:
χ(x)={1,0,if x 在物体 M 内部if x 在物体 M 外部
这个函数叫做 indicator function(指示函数) 或 characteristic function。
我们知道在表面上,法向量方向与 ∇χ 一致:
n=∥∇χ∥∇χ
因此有:
∇χ≈v
(v 是点云法向插值得到的连续向量场。)
对上式取散度:
∇⋅∇χ=∇⋅v
这就变成 Poisson 方程:
Δχ=∇⋅v
解出 χ(x) 后,我们取等值面(通常是 χ=0.5):
S={x∣χ(x)=τ}
这就是重建出的表面。
| 概念 |
含义 |
| χ(x) |
体素场上表示物体“内外”的隐函数 |
| ∇χ |
指示函数的梯度(偏导)= 法向方向 |
| 表面 |
χ 从 1 变为 0 的过渡区域(梯度不为零处) |
| 泊松方程 |
从梯度场(法向)恢复 χ 的积分方程 |
Poisson Surface Reconstruction 本质上是用 有限元方法(Finite Element Method, FEM) 离散求解一个 Poisson 方程。
这听起来很数学,但其实直观地说就是:
“用一堆局部的小积木(基函数)拼出一个连续函数,并让它在平均意义上满足方程。”
我们要求解的偏微分方程(PDE)为(Poisson方程):
Δχ=∇⋅v
其中 Δ 是拉普拉斯算子(包含二阶导数)。
其中:
- χ(x) 是隐函数;
- v(x) 是由点云法线方向定义的向量场。
计算机不能处理连续函数,只能处理有限维向量,因此必须离散化这个 PDE。
常见的两种离散化思路如下:
| 方法 |
基本思想 |
特点 |
| 有限差分法(FDM) |
在规则格点上用差分近似导数 |
只能用均匀网格,结构固定 |
| 有限元法(FEM) |
用局部基函数拼成连续近似 |
可用不规则、自适应网格(如八叉树) |
有限元法可以看作差分法的更灵活版本——它允许网格大小与形状根据数据密度自适应调整。
设要求解的未知函数为 χ(x)。
我们用一组基函数 {ϕi(x)} 近似它:
χ(x)≈i∑ciϕi(x),
其中:
- ϕi(x) 为局部形函数(shape function);
- ci 为对应系数(待求未知量);
- 每个 ϕi 仅在局部单元上非零,因此称为“分片函数(piecewise function)”。
例如在一维中,每个基函数形如三角形:
/\
/ \
-----/----\-----
i-1 i i+1
在三维中,这些“积木”则对应于立方体、四面体或八叉树节点上的局部基。
Poisson 方程的强形式为:
Δχ=∇⋅v.
直接对每个点要求方程成立(强形式)会遇到问题:
- Δχ 要求函数二阶可导;
- 而有限元中的分片线性函数二阶导数为零。
因此我们转化为“弱形式(weak form)”,即方程在积分意义上成立。
对任意测试函数 ψ(x),要求:
∫ΩψΔχdx=∫Ωψ(∇⋅v)dx
这称为“弱形式”或“变分形式”(Weak / Variational Form)。
应用分部积分(Integration by Parts) 可将左式中的二阶导数转为一阶导数。下面是详细过程。
我们利用下面的分部积分(integration by parts)推导详见附录A
∫ΩψΔχdx=∫∂Ωψ∂n∂χdS−∫Ω∇ψ⋅∇χdx
对左边进行替换,得到:
∫∂Ωψ∂n∂χdS−∫Ω∇ψ⋅∇χdx=∫Ωψ(∇⋅v)dx
进一步整理后,得到:
∫Ω∇ψ⋅∇χdx=−∫Ωψ(∇⋅v)dx+∫∂Ωψ∂n∂χdS
右边第二项就是边界项,假设边界项消失(通常取 Dirichlet 边界或自然边界条件),就得到:
∫Ω∇ψ⋅∇χdx=−∫Ωψ(∇⋅v)dx
这就是 Poisson 方程的弱形式。
这个形式有好处:只含一阶导数,更容易离散。
令 χ=∑jcjϕj,取测试函数 ψ=ϕi,代入公式(6):
∫Ω∇ϕi⋅j∑cj∇ϕjdx=−∫Ωϕi(∇⋅v)dx.
整理为矩阵形式:
j∑Aij(∫Ω∇ϕi⋅∇ϕjdx)cj=bi−∫Ωϕi(∇⋅v)dx,
即:
Ac=b.
其中矩阵 A 对称、正定,因此可通过共轭梯度(CG)或多重网格等高效方法求解。
j∑Aij(∫Ω∇ϕi⋅∇ϕjdx)cj=bi−∫Ωϕi(∇⋅v)dx
-
{ϕi}:全局基(形函数)。每个 ϕi 有局部支撑(只在若干单元/节点非零)。
-
网格 / 细分单元集合:T={K}。每个单元上可以进行局部积分。
-
目标:组装稀疏刚度矩阵 A(Aij=∫Ω∇ϕi⋅∇ϕj) 与右端向量 b(如前述 bi=−∫Ωϕi(∇⋅v) 或等价 ∫Ω∇ϕi⋅v 的形式)。
-
最终解线性系统 Ac=b。
通常做法(FEM 风格):
-
对每个单元 K 计算局部刚度矩阵 AabK=∫K∇ϕa⋅∇ϕbdV(这里 a,b 是单元的局部基索引);
-
把局部矩阵加到全局 A(local→global mapping);
-
对 b 做同样的局部积分与装配。
Aij=K∈T∑∫K∇ϕi⋅∇ϕjdV
只有当 suppϕi 与 suppϕj 在某个单元 K 重叠时该单元才贡献非零,导致 A 稀疏。这个在有原论文中使用basic 样条函数,n=3,支持域是1.5,所以一个Voxel最多有124个neighbor来求积分。
-
对于一个线性三角形/四面体单元,形函数在单元内是一阶多项式,梯度是常数。
-
因此局部矩阵很简单:
AabK=(∇ϕa∣K)⋅(∇ϕb∣K)⋅∣K∣
其中 ∣K∣ 是单元体积(或面积),∇ϕa∣K 是常数矢量(可由单元顶点坐标直接算出)。
如何算梯度(四面体例子):
-
在四面体上,若局部基是“节点为1其余为0”的 hat 函数,梯度可由单元逆雅可比计算(标准 FEM 教材)。
-
计算完每个单元的 AK 后,把它加到全局矩阵的对应 (global_i, global_j)。
-
若 ϕ 是 B-spline/box spline,∇ϕ 在每个支撑子域可能不是常数,但通常有封闭表达或可以按单元用高斯积分求出:
AabK≈q∑wq(∇ϕa(xq)⋅∇ϕb(xq))
xq 为 Gauss 点,wq 含雅可比权重。
如前面所述,有两种常用做法(更稳定的是第二种):
-
在每个单元(或节点)上评估/近似散度 ∇⋅v(差分或在单元上插值后解析求散度)。
-
做单元高斯积分(或把散度视作单元常数):
bi≈−K∑q∑wqϕi(xq)(∇⋅v)(xq)
-
装配进全局 b。
缺点:若 v 是由稀疏点云插值得到且噪声较大,直接求散度不稳定。
利用恒等式(把散度换成 ∇ϕi⋅v 加边界项):
−∫Ωϕi(∇⋅v)dV=∫Ω∇ϕi⋅vdV−∫∂Ωϕi(v⋅n)dS.
通常边界项可忽略或单独处理(域足够大或设边界为零)。于是
bi≈∫Ω∇ϕi⋅vdV.
这一步非常实用:你只需能在给定点评估 v(x)(通过 splatting/RBF/插值),而不必先计算其散度。
局部积分:
bi=K∑∫K∇ϕi(x)⋅v(x)dV≈K∑q∑wq∇ϕi(xq)⋅v(xq)
-
指示函数(indicator function)本身梯度在表面是无限大,无法直接使用。
-
解决方法是用一个 平滑核(如 Gaussian)去卷积指示函数,得到一个光滑的标量场 F(x)。
-
根据数学原理,卷积后梯度可以近似由 点云的法向量分布来表示:
∇F(x)≈某种基于法向量的向量场
-
八叉树的作用是 自适应空间分辨率:点云密度高的地方用更多的节点。
-
每个节点(顶点)对应一个未知系数 ci,表示该位置的函数值。
-
八叉树内部是用基函数的三线性(trilinear)表示,从而可以方便插值, 基函数用 B-spline 表示
-
因为真实表面未知,需要在每个八叉树节点附近 splat 点云 patch:
- 每个点云点(带法向量)会对邻近的节点产生影响,形成 离散向量场。
-
数学上,用 B-spline 基函数的梯度和法向量的内积积分来得到每个节点的贡献:
vo=p∑(np⋅∇Bo(xp))
-
这就是构造右手边 b 的过程。
-
刚度矩阵 A 来自 拉普拉斯算子作用在 B-spline 基函数上:
Aoo′=⟨∇Bo,∇Bo′⟩
-
本质上是 Poisson 方程的离散化:
ΔF=∇⋅V⇒Ac=b
边界项 ∫∂Ωψ∂n∂χdS 表示“流”(或通量)穿过边界对弱等式的贡献:
- 如果你固定了 χ 在边界(Dirichlet),测试函数通常取为零在边界(消去边界项)。
- 如果你指定了法向导数(Neumann)值,则该边界项会包含已知的边界贡献并进入右端项 b。
- 在 Poisson 重建常见做法:把域设大并把 χ 在边界置 0(或用自然边界),实际计算中通常能安全忽略或处理该项。
在 Kazhdan 等人的方法(2006, 2007)中:
- 基函数 ϕi(x) 选用 分片三线性 B-spline;
- 网格结构采用 八叉树(Octree),可自适应细化;
- 向量场 v 来源于输入点云的法线;
- 方程求得的 χ(x) 是隐函数场;
- 最终通过提取等值面 χ=iso 得到三维表面。
这一过程正是一个 有限元 Poisson 方程求解:
FEM 离散 → 解稀疏线性系统 → 取等值面。
| 比较项 |
有限差分 (FDM) |
有限元 (FEM) |
| 网格类型 |
均匀体素格点 |
任意结构(如八叉树) |
| 导数计算 |
直接差分 |
基函数积分 |
| 可变分辨率 |
不支持 |
自适应 refinement |
| 精度 |
低阶 |
更高阶近似可扩展 |
| 内存效率 |
较差 |
仅在局部单元非零 |
| 稳定性 |
易受噪声影响 |
更平滑、鲁棒 |
因此,FEM 更适合稀疏、不规则点云的 Poisson 重建。
Poisson 图像融合(Poisson Image Editing)同样解的是 Poisson 方程:
ΔI=∇⋅v,
只是定义域变成了 二维图像域,边界条件来自已知图像像素。
Poisson Surface Reconstruction 则是在 三维体素域 上进行相同的数学操作。
两者共享完全相同的 PDE 基础,只是应用场景与基函数不同。
你可以把 FEM 想象成:
用乐高积木(基函数)拼出一个连续曲面,
调节每块的高度(系数 ci),
让整体尽量满足 Poisson 方程。
最终,有限元法让 Poisson Surface Reconstruction 具备:
- 数学上严格的 PDE 背景;
- 自适应空间分辨率;
- 高效的稀疏矩阵求解特性;
- 更鲁棒的噪声容忍性。
有限元方法(FEM)通过基函数近似、弱形式求解,使得连续 Poisson 方程可在离散网格上高效求解。
Poisson Surface Reconstruction 正是利用 FEM 思想在三维空间上重建连续隐函数,从而生成高质量的表面。
参考文献:
- Kazhdan, M., Bolitho, M., & Hoppe, H. (2006). Poisson Surface Reconstruction.
- Kazhdan, M. & Hoppe, H. (2013). Screened Poisson Surface Reconstruction.
- Zienkiewicz, O. C., The Finite Element Method: Its Basis and Fundamentals.
- Botsch, M. et al., Polygon Mesh Processing.
1 对任意标量场 ψ(x) 和 χ(x),有下面恒等式(乘积求散度的向量恒等式) 附录C:
∇⋅(ψ∇χ)=∇ψ⋅∇χ+ψΔχ
这是从乘积求导(类似一维的 (fg)′=f′g+fg′)在向量形式下的推广。
把它重排得到:
ψΔχ=∇⋅(ψ∇χ)−∇ψ⋅∇χ
2 对区域积分并用散度定理(Divergence theorem)
把上式在区域 Ω 上积分:
∫ΩψΔχdx=∫Ω∇⋅(ψ∇χ)dx−∫Ω∇ψ⋅∇χdx
利用散度定理(Gauss theorem)附录B把第一个体积分换成边界积分:
∫Ω∇⋅(ψ∇χ)dx=∫∂Ωψ(∇χ⋅n)dS,
其中 ∂Ω 是域的边界,n 是外法向,∇χ⋅n=∂n∂χ(法向导数)。
因此合并得:
∫ΩψΔχdx=∫∂Ωψ∂n∂χdS−∫Ω∇ψ⋅∇χdx
可以看到,分部积分后出现边界项+内积项。
分部积分的意义在于我们把一个二阶方程转换成一阶方程。
对于一个任意的光滑向量场 F:
∫Ω∇⋅FdV=∫∂ΩF⋅ndS
其中:
- Ω:积分域(比如三维空间中的一个体积)
- ∂Ω:这个体积的边界面
- n:边界面上外法向量
- F:任意向量场
左边是一个∇⋅F体积积分(volume integral)
∇⋅F(读作 divergence of F)表示这一点是不是“流的源头或汇点”。
- 如果 ∇⋅F>0:
表示流体从这个点“源源不断流出” —— 有点像喷泉口;
- 如果 ∇⋅F<0:
表示流体“流入”这个点 —— 像吸进去;
- 如果 ∇⋅F=0:
表示进出相等,局部守恒。
右边是一个F⋅n边界面积积分(surface integral)
在边界面上,F⋅n表示在该点上,流体“穿出”表面的量
- 如果 F 与 n 同方向 → 表示流出;
- 如果反方向 → 表示流入;
- 如果垂直 → 表示不穿出。
整个散度定理的意思是:
“体积内的散度积分 = 表面积上通量积分”
直觉解释一句话总结
“所有点内部流出的总量 = 实际从表面流出去的量”
或者说:
“体积里的源汇之和 = 边界上的通量之和”
这就是散度定理。
这个公式是:
∇⋅(ψ∇χ)=∇ψ⋅∇χ+ψΔχ
我们要弄懂每个符号是什么意思,然后一步步推导。
符号说明
| 符号 |
名称 |
含义 |
类比(一维) |
| ψ(x) |
测试函数 |
任意光滑的标量函数 |
ψ(x) |
| χ(x) |
待求函数(隐函数) |
我们要求的场(例如 Poisson 方程的未知量) |
χ(x) |
| ∇ |
梯度算子 (gradient) |
∇=(∂x∂,∂y∂,∂z∂) |
dxd |
| ∇⋅ |
散度算子 (divergence) |
把向量场转成标量场 |
在 1D 中就是dxd |
| ∇χ |
取梯度 |
得到 χ 在各方向的偏导组成的向量 |
χ′(x) |
| Δχ |
拉普拉斯算子 (Laplacian) |
Δχ=∇⋅(∇χ)=∂x2∂2χ+∂y2∂2χ+∂z2∂2χ |
χ′′(x) |
| ∇ψ⋅∇χ |
向量点积 |
各方向偏导乘积之和 |
ψ′(x)χ′(x) |
推导(从最基本定义出发)
我们从三维坐标展开:
∇⋅(ψ∇χ)=∂x∂(ψ∂x∂χ)+∂y∂(ψ∂y∂χ)+∂z∂(ψ∂z∂χ)
用一维乘积法则展开每一项:
∂x∂(ψ∂x∂χ)=∂x∂ψ∂x∂χ+ψ∂x2∂2χ,
同理对 y,z 方向。
把所有加起来:
∇⋅(ψ∇χ)=(∂x∂ψ∂x∂χ+∂y∂ψ∂y∂χ+∂z∂ψ∂z∂χ)+ψ(∂x2∂2χ+∂y2∂2χ+∂z2∂2χ)
用向量符号重新写:
∇⋅(ψ∇χ)=梯度点积项∇ψ⋅∇χ+乘上拉普拉斯项ψΔχ