Possion重建是Kazhdan等2006年提出的网格重建方法[1]。Possion重建的输入是点云及其法向量,输出是三维网格。Poisson有公开的源代码[2]。PCL中也有Poisson的实现。
Possion重建是一个非常直观的方法。它的核心思想是点云代表了物体表面的位置,其法向量代表了内外的方向。通过隐式地拟合一个由物体派生的指示函数,可以给出一个平滑的物体表面的估计。
给定一个区域MM及其边界∂M∂M,指示函数χMχM定义为
这样,把重构S=∂MS=∂M的问题转换为重构χMχM的问题。作者给出了将点云及其法向量和χMχM联系起来的公式。作者论文中的图1非常形象地描述了这二者的联系。
对于任意点p∈∂Mp∈∂M,定义N⃗ ∂M(p)N→∂M(p)为向内的表面法向量,F~(q)F~(q)为一个平滑滤波器,F~p(q)=F~(q−p)F~p(q)=F~(q−p)为F~F~沿pp方向的平移。因为χMχM一般意义上是不好求导的,这里用χM∗F~χM∗F~的导数来近似。
从法向量到梯度空间
梯度空间的近似
由于N⃗ ∂MN→∂M的分布是未知的,需要通过观测值P={(pi,ni)}P={(pi,ni)}来近似。考虑离散点集ΩΩ,∂M∂M被分割为互不相交的区域℘s,s∈Ω℘s,s∈Ω。(1)(1)可以转化为积分求和,并将每个小积分近似为常函数,用代表点s.ps.p对应的函数值和℘s℘s的面积的乘积代替。
这里希望平滑滤波器F~F~能够尽量地窄,不过分平滑数据,同时尽量地宽,使得积分近似能够更准确。高斯滤波器是一种常见的选择。
求解Possion问题
向量空间V⃗ V→和指示函数χ~χ~满足
∇χ~=V⃗ (3)(3)∇χ~=V→
然而,V⃗ V→通常意义上是没法积分的(为什么?)。为了得到(3)(3)式的最小二乘解,将(3)(3)式两边求导,就得到了拉普拉斯方程
Δχ~=∇⋅V⃗ (4)(4)Δχ~=∇⋅V→
拉普拉斯方程在数学上有很详细的研究。
空间划分
为了解一个偏微分方程问题,首先要将其离散化。最简单的方法是将空间划分为均匀网格。这种划分非常占内存空间,而且只有边界附近的值才是我们关心的,大量的空间被浪费了。作者采用了一种自适应的网格结构octree来划分空间,并且octree上定义了一个函数空间FoFo。下图给出了octree在三维空间对一个物体的划分。物体边缘的网格密度远大于远离物体的网格密度。
http://http.developer.nvidia.com/GPUGems2/elementLinks/37_octree_03.jpg
空间上的基函数选择
如何选择函数空间FoFo实际上挺有学问的。因为FoFo一旦给定,定义在这个octree上的向量空间V⃗ V→和指示函数χχ都会通过FoFo的线性组合去近似。这样,求解χχ就转化为求解FoFo上的参数组合,进而转化为求解一个线性方程组。
给定octree的深度DD,作者根据选择了下面的基函数FF。
∗n∗n代表nn次卷积。当nn趋向于无穷时,FF趋向于高斯函数,它的定义域也越来越大。当n=3n=3时,定义域为[−1.5,1.5]3[−1.5,1.5]3。
octree上某个节点oo对应的函数FoFo定义为
Fo(q)≡F(q−o.co.w)1(o.w)3Fo(q)≡F(q−o.co.w)1(o.w)3
其中o.co.c是的oo中心,o.wo.w是oo的宽度。假设根节点(第0层)的宽度为WW,那么第dd层节点的宽度为W2dW2d。这个函数空间和小波空间很像。
Possion求解
Possion求解方法是L2投影(L2 projection)[3]。定义octree的节点集合为OO。向量空间V⃗ V→可以近似为
V⃗ (q)≡Σs∈ΩΣo∈Ng(s)αo,sFo(q)s.n⃗ V→(q)≡Σs∈ΩΣo∈Ng(s)αo,sFo(q)s.n→
其中Ng(s)Ng(s)是ss的八个最近邻的叶节点,αo,sαo,s是三线性插值的权重。
虽然V⃗ V→和χ~χ~都可以在函数空间上表示出来,Δχ~Δχ~和∇⋅V⃗ ∇⋅V→却未必有定义。因此将(4)(4)近似为最小化其在FoFo上的投影
Σo∥〈Δχ~−∇⋅V⃗ ,Fo〉∥2=Σo∥〈Δχ~,Fo〉−〈∇⋅V⃗ ,Fo〉∥2Σo‖〈Δχ~−∇⋅V→,Fo〉‖2=Σo‖〈Δχ~,Fo〉−〈∇⋅V→,Fo〉‖2
令χ~=ΣoxoFoχ~=ΣoxoFo,那么求解χ~χ~即是求解xoxo。
〈Δχ~,Fo′〉=Σoxo〈ΔFo,Fo′〉〈Δχ~,Fo′〉=Σoxo〈ΔFo,Fo′〉
Σo∥〈Δχ~,Fo〉−〈∇⋅V⃗ ,Fo〉∥2=Σo′∥Σoxo〈ΔFo,Fo′〉−〈∇⋅V⃗ ,Fo′〉∥2Σo‖〈Δχ~,Fo〉−〈∇⋅V→,Fo〉‖2=Σo′‖Σoxo〈ΔFo,Fo′〉−〈∇⋅V→,Fo′〉‖2
上式右边对x={xo}x={xo}求偏导,转化为
minx∥Lx−v∥2minx‖Lx−v‖2
其中,设octree的节点数为NN,N×NN×N矩阵LL在(o,o′)(o,o′)位置上的值为
Lo,o′≡〈∂2Fo∂x2,Fo′〉+〈∂2Fo∂y2,Fo′〉+〈∂2Fo∂z2,Fo′〉Lo,o′≡〈∂2Fo∂x2,Fo′〉+〈∂2Fo∂y2,Fo′〉+〈∂2Fo∂z2,Fo′〉
表面提取
用Marching Cubes类似的方法。注意iso的值取自SS个划分的平均。
作者还讨论了非均匀采样下的算法,在此就不赘述。
简单列几点
Poisson是个好方法。
[1]. Kazhdan, Michael, Matthew Bolitho, and Hugues Hoppe. "Poisson surface reconstruction." Proceedings of the fourth Eurographics symposium on Geometry processing. Vol. 7. 2006.
[2]. http://www.cs.jhu.edu/~misha/Code/PoissonRecon/Version8.0/
[3]. http://www.featflow.de/en/software/featflow2/tutorial/tutorial_l2proj.html
转载请注明作者和出处(http://www.cnblogs.com/luyb),未经允许请勿用于商业用途。 [email protected]/LUYB 联系方式:luyanbin7 at gmail.com