泊松曲面重建

2024-03-25 00:38
文章标签 重建 曲面 泊松

本文主要是介绍泊松曲面重建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

暂写一篇博客记录下看的两篇可视计算入门论文。《Poisson surface reconstruction》《Screened Poisson Surface Reconstruction》

 

1.泊松曲面重建简介

激光扫描设备的发展使得被测物体更多细节的数据获取成为可能。根据采样数据的模型重建,在许多实际应用中具有实际意义,如在汽车、航空等工业领域中, 复杂外形产品的设计仍需要根据手工模型, 采用逆向工程的手段建立产品的数字化模型; 根据测量数据建立人体以及骨骼和器官的计算机模型在医学、定制生产等方面都有重要意义。

关于采样数据的重构有基于组合结构和基于隐函数两类方法。

 基于组合结构的方法, 如 Delaunay  triangulations, alpha shapes 或Voronoi diagrams 这些方法通过建立三角形网格插值所有或大多数点。当存在噪声点时,所产生的表面往往是锯齿状,因此需要平滑或对数据进行处理(refit to the points in subsequent processing)。

隐函数方法则通过定义分段函数, 定义模型内部的值大于零, 模型外部它的值小于零, 然后提取值为零的等值面, 这类方法可以直接地重构逼近表面, 如基于快速傅立叶转换和径向基函数(R BF s ) 的重构方法都属于隐函数重构方法。隐函数方法分为全局方法和局部方法(暂不赘述)。

泊松曲面重建属于隐函数方法实现。泊松表面重建的算法融合了全局和局部方法的优点,采取隐性拟合的方式,通过求解泊松方程来取得点云模型所描述的表面信息代表的隐性方程,通过对该方程进行等值面提取,从而得到具有几何实体信息的表面模型。优点在于,重建出的模型具有水密性的封闭特征,具有良好的几何表面特性和细节特性。

经过屏蔽的泊松表面重建算法,在原有泊松表面重建算法的基础上对输入的点云进行插值约束(引入点集的约束和梯度的约束),将等值面提取的输入方程由原始的泊松方程转化为屏蔽泊松方程。屏蔽序列在稀疏的点集合进行选择;稀疏的约束可被有效处理,且依旧保留相同的有限元离散化,稀疏的结构保持不变,修改后的线性系统可以使用多重网格的方法解决。
为防止屏蔽因子经过尺度变换造成错误信息,加入了相关条件约束。

2.泊松曲面重建的数学基础

泊松曲面重建基于泊松方程。泊松方程是一个比较常见的偏微分方程,在很多领域被应用,如高动态范围图像的调和映射、图像区域的无缝编辑、流体力学、网格编辑等, 多重网格泊松方法已应用于高效GPU计算。

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

整个算法的步骤包括对具有法向量信息的输入点云信息的预处理,对全局问题离散化,对离散化后的子数据求解,求解泊松问题后的等值面提取,以及后期优化处理等。

表面重建过程:
1、定义八叉树。使用八叉树结构存储点集,根据采样点集的位置定义八叉树,然后细分八叉树使每个采样点都落在深度为D的叶节点;

2、设置函数空间:对八叉树的每个节点设置空间函数F,所有节点函数F的线性和可以表示向量场V,基函数F采用了盒滤波的n维卷积;

3、创建向量场:均匀采样的情况下,假设划分的块是常量,通过向量场V逼近指示函数的梯度。采用三次条样插值(三线插值);
4、求解泊松方程:方程的解采用拉普拉斯矩阵迭代求出;
5、提取等值面:为得到重构表面,需要选择阈值获得等值面;先估计采样点的位置,然后用其平均值进行等值面提取,然后用移动立方体算法得到等值面。

 

参考文献:

http://www.cs.jhu.edu/~misha/MyPapers/SGP06.pdf

http://www.cs.jhu.edu/~misha/MyPapers/ToG13.pdf

【链接】基于泊松方程实现点云的表面重构
http://www.cnki.net/kcms/detail/detail.aspx?filename=JYRJ200904076&dbcode=CJFQ&dbname=CJFD2009&v=

【链接】基于泊松方程的三维表面重建算法的研究
http://url.cn/2H4Umu7

论文作者发表的源代码:http://www.cs.jhu.edu/~misha/Code/PoissonRecon/Version6.11/

这篇关于泊松曲面重建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

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

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 在导出或

nurbs曲面和贝塞尔曲面的区别是什么

NURBS曲面和贝塞尔曲面的主要区别如下:   定义与理论基础:   NURBS曲面:全称非均匀有理B样条曲面,是NURBS曲线在二维空间上的扩展。它结合了非均匀性、有理性和B样条的特性,能够更灵活地表示复杂曲面。 贝塞尔曲面:通过Bernstein基函数的张量积为加权系数对控制顶点进行线性组合所构造的参数曲面。它具有良好的连续性和插值性质。   控制点的灵活性与局部性:   N

二叉树的遍历(篇5)由中序和先序序列重建二叉树

让我们考虑下面的遍历: 中序序列:DBEAFC 前序序列:ABDECF 在Preorder序列中,最左侧的元素是树的根。所以我们知道’A’是给定序列的根。通过在Inorder序列中搜索’A’,我们可以发现’A’左侧的所有元素都在左子树中,右侧的元素在右子树中。所以我们现在知道下面的结构。 A/ \/ \D B E F C 我们递归

根据前序和中序重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 #include <iostream>#include <vector>#include <math.h>#include <stdlib.h>