孔洞修补研究总结

本人最近需要研究三维模型的孔洞修补算法,故上网看了一些大神写的资料,现汇总如下:

 

重建骨骼比较典型的方法有:用径向基函数从不完整的扫描数据生成连续网格;基于CT等值面数据生成曲面;用傅里叶级数拟合CT图像提取边缘轮廓曲线;基于形状的利用数学形态学算子进行骨架提取的插值算法。

 

所谓网格曲面孔洞修补问题指的是:寻找一个合理的算法在现有的不完整几何与拓扑信息的情况下,利用网格孔洞周边已有三角网格,创建一个尽可能忠实于原物体或场景的局部网格模型,由此达到对网格曲面孔洞的修补.

 

常用的孔洞修补算法可以分为体素方法、基于三角剖分的方法、基于隐式曲面拟合的方法,在基于体素的方法中,首先将一个网格模型变换成由离散体积(即体素)表示的模型,然后在体积空间中应用不同的方法修补空洞.采用的方法有有向距离函数差分或体素滤波,以及在此基础上使用多种偏微分方程进行优化的方法,消除重建三维结构中因采样问题产生的孔洞。基于体素方法存在两方面的问题,首先,它针对的是点云数据,不能直接应用于Mesh模型;其次它是一种物理方法,通常只能够修复重建物体表面的小孔洞,并容易带来几何形变。在基于三角剖分的方法中,首先对孔洞直接进行三角剖分得到初始网格,然后对初始网格进行优化.基于隐式曲面拟合的方法是网格孔洞修补算法中最为常见的方法,该方法首先孔洞边界周围的点信息,采用隐式曲面拟合的方法拟合一曲面片光滑的覆盖孔洞,然后通过在曲面上重采样实现网格孔洞修补.常见的曲面拟合有:二次曲面拟合、B-样条曲面拟合、三角Bézier曲面拟合及基于径向基函数的曲面拟合等。

 

点集的三角剖分指的是:给定一组散乱数据点,如何将各数据点之间以三角形或四面体相互连接,形成三角网格,并使网格质量较优.该问题的解即是散乱点集的一个三角剖分,其实质是以三角网格反映各个数据点与其邻近点之间的拓扑连接关系,从而揭示数据点之间的内在本质联系.

 

基本概念:

如果两个三角形拥有一个公共边,则这条公共边在两个不同的三角形中是反向的,此时我们称这两个三角形是邻接三角形

边界边:如果一条边只属于一个三角形,则这条边称为边界边.

边界顶点:边界边上的顶点称为边界顶点.

边界三角形:拥有一个或两个边界顶点的三角形称为边界三角形.

二环点:与边界顶点相邻接的非边界顶点.

顶点邻接三角形:拥有某一顶点的所有三角形称为这个顶点的顶点邻接三角形.

三角形的法向量:指的是三角形所在平面的法向量,它与三角形边的走向满足右手螺旋法则.

顶点密度:顶点v的顶点密度指的是顶点v的顶点邻接三角形边长的平均值。

 

 

对于模型的孔洞修补算法主要采用以下几种策略:

1、直接三角剖分:早期的孔洞修补算法主要考虑如何对孔洞区域进行三角化。三角剖分本质上是一个非线性优化问题,为了获得该问题的最优解,可以使用动态规划算法、遗传算法、模拟退火算法等对孔洞区域进行剖分,以获得最优的三角化结果。已有方法:孔洞多边形的顶点构造新的三角片;各向异性孔洞修补算法。

2、新增采样点:已有方法:分段处理思想,根据孔洞的复杂性将孔洞分为若干个简单的子孔洞;三角片自然增长。

3、采样点调整:已有方法:根据曲率来调整新增点的位置;基于移动最小二乘法的补点方法;基于体素扩散方法来调整新增点的位置;基于径向基函数的调整方法;神经网络的方法。

4、点云数据三角化。

 

Delaunay三角剖分具有三角剖分最小内角为最大的性质,能够进行任意多连通域有限网格的自动生成可最大限度的保证网中三角形满足近似等边性,避免了过于狭长和尖锐的三角形的出现,是公认的最优三角网。其主流算法有三种:分割-归并法,逐点插入法,三角网生长法。

 

一个理想的孔洞修补算法具有如下性质:

(1)、自动性。用户如果选择了孔洞,交互应该尽可能简单。

(2)、效率性。合理的运行时间,良好的交互速度。

(3)、准确性。用修补网格来填补孔洞,应该尽可能得和周围网格相融合,网格密度和形状应该和原孔洞边界相匹配。

(4)、鲁棒性。能够处理任意网格的任意孔洞。这是很难被满足的。

 

《三维颅骨模型的孔洞修补算法研究》中提出一种算法,主要分为五个步骤:

(1)孔洞检测。对输入的颅骨三角网格模型进行孔洞分析,并对检测出的孔洞进行标记。

 孔洞检测室通过自动搜索模型边界点来完成的。

1)模型边界点的提取:判断边界点的过程就是判断该点是否是边界边上的点的过程。

//在一般情况下,空间曲面上点的存储是随机的,所以得到的所有边界点是无序的,对曲面上的点进行边界点判断的时候,可得到与当前边界点的邻接边界点,基于此,即可对所有边界点排序,得到完整的边界曲线。

2)模型边界点的分类和排序

(2)孔洞区域离散点的生成和三角剖分。用户选择需要修补的孔洞,在其中插入离散点,然后对插入的离散点进行三角剖分。

1)孔洞区域离散点插入:对较小的孔洞,直接进行三角剖分;对较大的孔洞,先在孔洞多边形内插入离散点,然后再进行三角化。

2)离散点的三角剖分

(3)网格细分。对三角剖分后的网格进行网格细分。

基本思想:对于每一个三角形,连接各边的中点生成四个新的三角形。

(4)孔洞隐式曲面的建立。利用RBF建立孔洞区域的隐式曲面,调整插入点的位置。

(5)网格平滑。用伞状算子对隐式曲面进行平滑处理。

 

《面向颅骨损伤修补的缺损重建算法》

以包含缺损结构的三维重建Mesh模型为操作对象,根据交互输入的引导点,通过三角面片的边特征及目标点位置搜索并向外扩展出孔洞上边界环,得到目标问题区域边界,其中内环为孔洞边界,此区域内的所有三角面片为目标问题区域;通过双环采样,投影构建代理面,结合代理面对内环的三角化细化,三角面进行基于代理曲线的 Freeform 变形, 然后在微分域进行保持边缘细节特征的平滑操作, 得到缺失实体孔洞的上缝合面; 通过向颅骨厚度方向扩展, 得到孔洞下边界轮廓, 并搜索出上下边界环之间的三角网格区域; 通过上缝合面的构建方法, 得到缺失实体孔洞的下缝合面; 最后, 连接上下缝合面以及两个边界轮廓环之间的三角网格区域, 获取修复实体。

《A robust hole-filling algorithm for triangular mesh》

主要步骤:

(1)确定三角网格中的孔洞;

(2)对每一个网格模型中的孔洞

1)利用AFM技术生成初始修补网格;

2)基于柏松等式来改善补丁网格:利用谐波等式或者测地线插值来计算法向量;利用局部旋转旋转三角片;解柏松等式得到每一顶点的新坐标;更新坐标得到平滑的补丁网格。

 

《A piecewise hole-filling algorithm in reverse engineering》

它将一个复杂的孔洞分成几个简单的子洞,子洞连续地进行填补。

结构:

步骤:

(1)对于每一个孔洞确定一个投射曲面或者孔洞向量

(2)投射边界边到曲面上,计算交点

(3)根据交点将孔洞分成几个子孔洞

(4)重复:对每个子孔洞应用平面三角测量算法;将计算的交点参数应用于原始边;细分

 

通用网格模型的孔洞修补算法BHRA能够较好地处理对不规则区域复杂孔洞的修补,但是不能通用与各种复杂孔洞。

对于大区域复杂孔洞的修补,利用IRS(向内递归求解法)

(1)内部控制辅助点插入

(2)隐式曲面建立

(3)辅助插入点调整到隐式曲面

(4)逐层插入辅助点并重新计算隐式曲面

对于特征区域复杂孔洞的修补,采用TMA(特征模型匹配法)

(1)特征模型匹配

(2)网格融合

 

转载于:https://www.cnblogs.com/bxyan/p/6679947.html

dll函数接口: ////******** 初始化默认参数 ********// //extern "C" int __stdcall ZSY3DViewerInit(); //******** 读取历史数据到cloud ********// extern "C" int __stdcall ZSY3DReadHistoryData(char *file_dir); //******** 读取txt数据到cloud ********// extern "C" int __stdcall ZSY3DReadTxtData(char *file_dir); //******** 读取单个点数据到cloud ********// extern "C" int __stdcall ZSY3DReadSingleData(float x, float y, float z); //******** 读取所有点数据到cloud ********// extern "C" int __stdcall ZSY3DReadNowData(float *x, float *y, float *z, int count); //******** vtk读取txt文件并显示 ********// extern "C" int __stdcall ZSY3DReadFile_TXT(char *file_dir); //******** vtk读取obj文件并显示 ********// extern "C" int __stdcall ZSY3DReadFile_OBJ(char *file_dir); //******** vtk读取vtk文件并显示 ********// extern "C" int __stdcall ZSY3DReadFile_VTK(char *file_dir); //******** vtk读取ply文件并显示 ********// extern "C" int __stdcall ZSY3DReadFile_PLY(char *file_dir); //******** cloud下采样处理 ********// extern "C" int __stdcall ZSY3DDownSampling(float leaf_size); //******** cloud均匀采样处理 ********// extern "C" int __stdcall ZSY3DBalanceSampling(float radiusSearch = 0.01f); //******** cloud增采样处理 ********// extern "C" int __stdcall ZSY3DIncreaseSampling(float radius = 0.03f, float StepSize = 0.02f); //******** cloud直通滤波采样处理 ********// extern "C" int __stdcall ZSY3DStraightSampling(char *fieldName = "z", float limits_min = 0.0f, float limits_max = 0.1f, bool limitsNegative = true); //******** cloud统计滤波采样处理 ********// extern "C" int __stdcall ZSY3DStatisticsSampling(float meanK = 50.0f,float stddevMulThresh = 1.0f); //******** cloud半径滤波采样处理 ********// extern "C" int __stdcall ZSY3DRadiusSampling(float radiusSearch = 0.8f, float minNeighborsInRadius = 2.0f); //******** cloud数据进行渲染,并显示 ********// extern "C" int __stdcall ZSY3DShowPointCloud(); //******** cloud数据进行VTK三维重建(三角面绘制),并显示 ********// extern "C" int __stdcall ZSY3DDelaunayBuild(bool depth_color); //******** cloud数据进行VTK三维重建(曲面体绘制),并显示 ********// extern "C" int __stdcall ZSY3DSurfaceBu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值