从点云到网格(三)Poisson重建

2024-03-25 00:38

本文主要是介绍从点云到网格(三)Poisson重建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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分析

简单列几点

  • Poisson在边缘处的锐度比VRIP要好。这是因为VRIP在大的边缘处TSDF的累加会有平滑效应,而Poisson依据的是法向量,不会引入额外的平滑。
  • VRIP是局部方法,每次只更新当前深度图对应的TSDF。Poisson是全局方法。
  • 从个人使用经验上看,Poisson对于噪声更加鲁棒一些。点云法向量估计的精度不能太差。
  • 如果重建出奇怪的形状(分层、分块),请查看原始点云是否平滑,是否有噪声,调整生成网格的分辨率以适应点云。

小结

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),未经允许请勿用于商业用途。 COPYRIGHT@CNBLOGS.COM/LUYB 联系方式:luyanbin7 at gmail.com

这篇关于从点云到网格(三)Poisson重建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843323

相关文章

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

”CSS 网格“二维布局系统(补充)——WEB开发系列32

CSS 网格布局是一种二维布局系统,用于网页设计。通过使用网格,你可以将内容以行和列的形式进行排列。此外,网格布局还能够简便地实现一些复杂的布局结构。 一、什么是网格布局? CSS网格布局是一种二维布局系统,它允许我们创建复杂的网页布局,既可以处理行也可以处理列。与传统的布局方法不同,网格布局将网页分成多个可控的区域,这些区域可以任意排列、对齐和调整大小。网格布局使得创建灵活且响应

Python(TensorFlow和PyTorch)两种显微镜成像重建算法模型(显微镜学)

🎯要点 🎯受激发射损耗显微镜算法模型:🖊恢复嘈杂二维和三维图像 | 🖊模型架构:恢复上下文信息和超分辨率图像 | 🖊使用嘈杂和高信噪比的图像训练模型 | 🖊准备半合成训练集 | 🖊优化沙邦尼尔损失和边缘损失 | 🖊使用峰值信噪比、归一化均方误差和多尺度结构相似性指数量化结果 | 🎯训练荧光显微镜模型和对抗网络图形转换模型 🍪语言内容分比 🍇Python图像归一化

css——网格布局

名词解释 div{$}*9+tab键,快捷生成   记首字母gtc  网格布局:display: grid;        grid-template-columns: 100px 100px 100px;        grid-template-rows: 100px 100px 100px; (父元素) <!DOCTYPE html><html lang="en"

JD 1385:重建二叉树

OJ题目:click here~~ 题目分析:给前序遍历序列和中序遍历序列,重构二叉树并输出后序遍历序列 剑指offer 面试题6 AC_CODE int pre[1008] , in[1008] ;struct Node{int x ;Node *left ;Node *right ;};bool buildsubtree(Node*& root , int* spre , in

Data Mesh,数据网格的道与术

周末的时候,看到有群友讨论关于 Data Mesh 的话题。这个名词我在2020年初的时候听到过一次,当时感觉就是一个概念,看的糊里糊涂,没有当回事。最近突然又被推上了话题风口,所以静下心来看了一下相关的论文和介绍。 在讨论 Data Mesh 之前,首先要给大家介绍一下 Service Mesh。 Service Mesh 公认的定义,是用以处理服务与服务之间通信的专用基础设施层。更本质的理

Activity转屏重建之 Activity.onConfigurationChanged

偶尔也会遇到由于转屏引起的一些问题。 有些时候,并不希望由于转屏使得Activity取重建。 再如键盘消失后的重建。 下面以一个demo为例子,小小总结一下用法。 如果想在转屏后,屏幕上立马打印出当前处于什么横竖屏状态 1.都知道有个属性android:configChanges可以用来定义什么情况下可以使得Activity不会restart。 android:configC

Activity生命周期 与 重建

每一个Android应用程序在运行时,对于底层的Linux Kernel而言都是一个单独的进程,但是对于Android系统而言,因为局限于手机画面的大小与使用的考虑,不能把每一个运行中的应用程序窗口都显示出来。   所以通常手机系统的界面一次仅显示一个应用程序窗口,Android使用了Activity的概念来表示界面。   运行中的应用程序分为五大类,分别是:     前景模式

【conda】导出和重建 Conda 环境

目录 1. 导出 Conda 环境1.1 激活环境1.2 导出环境配置1.3 检查和编辑环境配置文件(可选)1.4 共享或重建环境 2. 常见问题及解决方案2.1 导出环境时出现 “PackagesNotFoundError”2.2 导出的 `environment.yml` 文件在其他系统上无法使用2.3 导出的环境文件过大2.4 如何处理 Conda 环境中的 pip 包2.5 在导出或

图像数据到网格数据-3——Cuberille算法

前言   这是本博客网格生成算法系列的第三篇,第一篇里面介绍了最为流行的MarchingCubes算法,第二篇中使用新三角形表来对MC算法进行了简化改进,形成了SMC算法。而这篇将介绍一种新的不同与MC算法思路的新网格生成算法,叫做Cuberille法,这种算法的思想相比MC算法要简单,更加易于实现。   体素立方体模型   根据第一篇的介绍,我们知道MC算法的基本模型是把组成三