通过闭环平面轮廓数组创建三角形网格的Python实现

如何解决通过闭环平面轮廓数组创建三角形网格的Python实现

我有点被困住了。

我有一个3D点云(由(n,3)个顶点组成的数组),我试图在其中生成3D三角形网格。到目前为止,我还没有运气。

数据的格式为:

  • (x,y)值以规则间隔(z)间隔。可以将数据视为在z方向上逐片存储的闭环平面轮廓。
  • 数据中的顶点必须是网格三角形的绝对位置(即,我不希望它们平滑以使体积开始改变形状,但是层之间的线性插值很好)。

插图:

Z=2. : ..x-------x...   <- Contour 2
Z=1.5: ...\......|...   <- Join the two contours into a mesh.
Z=1. : .....x----x...   <- Contour 1
Repeat for n slices,end up with an enclosed 3D triangular mesh.

我尝试过的事情:

  • 使用Open3D
    • The rolling ball (pivot) method只能完成75%的网格,并且留下较大的区域不完整(尽管有各种大小的球)。在顶部和底部切片中存在一些特别的问题,在这些切片中,中间的缝隙往往比较大(即平坦的表面)。
    • The Poisson reconstruction method使音量过大,我不再能准确表示音量。这种情况发生在3至12点的所有深度。
  • CGAL
    • 我无法让它为我的一生工作。 SWIG不是很好,使用SWIG的CGAL实施也不是很好。
    • 有两种CGAL的PyBind实现,但是它们尚未并入CGAL的3D三角测量库。
  • 探索了其他模块,例如PyMesh,TriMesh,TetGen,Scikit-Geometry,Shapely等。我可能一直错过答案。

鉴于我的数据是一个闭环平面轮廓的列表,似乎必须要有一些简单的解决方案才能将相邻的切片轮廓“连接”到一个大的3d网格中。就像您在搅拌机中一样。 有一些非python解决方案(例如MeshLab)可以很好地解决这些问题,但是我需要一个python解决方案。有人有什么想法吗?我对VTK和ITK进行了一些了解,但到目前为止还没有找到我真正想要的东西。

我也开始考虑也许可以对切片之间的中间轮廓进行插值,并用顶点填充顶部和底部的轮廓,以使数据对“枢轴球”方法更加友好。

在此先感谢您的帮助。 如果有一个好的方法尚未进行编码,我保证会对其进行编码,并使其适用于我所处的环境:)

解决方法

实际上,有两种方法可以在python中具有meshlab功能:

  1. 第一个是第三方的MeshLabXML(https://github.com/3DLIRIOUS/MeshLabXML),是Meshlab脚本接口的Python脚本接口。
  2. 第二个是PyMeshLab(https://github.com/cnr-isti-vclab/PyMeshLab),这是MeshLab作者(目前处于Alpha阶段)正在进行的一项工作,旨在将Python直接绑定到所有meshlab过滤器
,

《医学物理学杂志》上有一篇标题为"Technical Note: an algorithm and software for conversion of radiotherapy contour‐sequence data to ready‐to‐print 3D structures"的整洁论文,很好地描述了这个问题。不需要python软件包,但是使用numpy更容易实现。不需要任何3D软件包。

提供了一个有用的摘录: ...

  1. 确定构成指定结构的切片(2D轮廓)的数量。
  2. 确定每个切片中的点数。
  3. 提取每个切片中每个点的笛卡尔坐标并将其存储在专用数据结构中...
  4. 重新排列每个切片(曲线)中的点数,以使起点(索引为0的点)是后续切片之间的最接近点。重新计数从点0开始,切片0(z坐标最低的切片)。
  5. 确定每个曲线的方向(即,由点相对于曲线的内部/外部的增加的索引确定的方向)。如果发现切片之间存在差异,则不匹配曲线中的点编号(以及方向)将相反。
  6. 所考虑结构的侧面是离散的。相邻层的点排列成三份,构成STL文件的三角形小平面。对于每个三角形,最接近的点与每个图层的后续索引都被连接。
  7. 所考虑结构的上下基础表面是离散的。程序对曲线上的每三个后续点进行迭代,并检查它们是否属于边的凸部。如果是,则将它们连接到一个构面,然后从进一步的迭代中删除中间点。

因此,基本上,这是将每个切片中的数据集与每个切片的最近值对齐的问题。然后对齐每个轮廓的方向。然后根据距离将两层之间的点连接起来。

本文还提供了执行此操作的代码(用于DICOM文件),但是我自己重新编写了该代码,它很吸引人。

我希望这对其他人有帮助!确保在使用此功能的任何工作中都赞誉作者。

,

pymadcad的最新功能可以做到这一点,不确定是否符合“旋转球”之类的确切期望,请检查doc for blending

从轮廓列表开始,它可以生成混合曲面以将它们连接起来:

出于您的目的,我认为最好的方法之一是:

  • blendpair(line1,line2)
  • junction(*lines)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-