首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python中的Open3D创建点云数据外的水密网格

使用Python中的Open3D创建点云数据外的水密网格
EN

Stack Overflow用户
提问于 2021-08-13 19:25:40
回答 1查看 1.5K关注 0票数 7

我试图创建一个水密的网格点云代表器官轮廓数据从锥束CT图像。我的目标是取两个网格,并计算它们之间的交点体积。

我试过使用每一种显示为这里的方法

泊松重建

代码语言:javascript
复制
point_cloud = np.genfromtxt('ct_prostate_contour_data.csv', delimiter=',')
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud)
pcd.compute_convex_hull()
pcd.estimate_normals()
pcd.orient_normals_consistent_tangent_plane(10)

mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=10, width=0, scale=20, linear_fit=True)[0]
mesh.compute_vertex_normals()
mesh.paint_uniform_color([0.5, 0.5, 0.5])
mesh.remove_degenerate_triangles()
o3d.visualization.draw_geometries([pcd, mesh], mesh_show_back_face=True)

虽然这个方法似乎会给我带来一个水密的网格,但是mesh.is_watertight()的结果是错误的,但是对于膀胱数据,它返回True。此外,该算法将网格扩展到数据的垂直界限之上和下面。如果有办法将其降到最低,这不是一个交易破裂的问题,这将是很好的。

泊松网格图像

球旋转

代码语言:javascript
复制
point_cloud = np.genfromtxt('ct_prostate_contour_data.csv', delimiter=',')
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud)
pcd.compute_convex_hull()
pcd.estimate_normals()
pcd.orient_normals_consistent_tangent_plane(30)

distances = pcd.compute_nearest_neighbor_distance()
avg_dist = np.mean(distances)
radii = [0.1*avg_dist, 0.5*avg_dist, 1*avg_dist, 2*avg_dist] 
r = o3d.utility.DoubleVector(radii)
rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, r)
o3d.visualization.draw_geometries([pcd, rec_mesh], mesh_show_back_face=True)

这将是我的首选方法,如果我能够填补漏洞,因为它只是连接顶点,没有插值。也许,如果我能够把它变成一个唯一剩下的洞很大的状态,我可以将这个网格转换成一个Pyvista兼容的网格,并使用Pymeshfix来修补这些洞。

球旋转网格图像

阿尔法形状

代码语言:javascript
复制
point_cloud = np.genfromtxt('ct_prostate_contour_data.csv', delimiter=',')
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_cloud)
alpha = 8
tetra_mesh, pt_map = o3d.geometry.TetraMesh.create_from_point_cloud(pcd)
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha, tetra_mesh, pt_map)
mesh.compute_vertex_normals()
mesh.paint_uniform_color([0.5, 0.5, 0.5])
mesh.remove_degenerate_triangles()
o3d.visualization.draw_geometries([pcd, mesh])

其结果类似于球的旋转,但更糟。

α形状网格图像

样本数据

EN

回答 1

Stack Overflow用户

发布于 2021-08-29 22:23:31

我是PyVista模块的作者之一。我们在vtkSurfaceReconstructionFilter中引入了PyVista中的拉动请求#1617

代码语言:javascript
复制
import pymeshfix
import numpy as np
import pyvista as pv

pv.set_plot_theme('document')

array = np.genfromtxt('ct_prostate_contour_data.csv', delimiter=',')

point_cloud = pv.PolyData(array)
surf = point_cloud.reconstruct_surface(nbr_sz=20, sample_spacing=2)

mf = pymeshfix.MeshFix(surf)
mf.repair()
repaired = mf.mesh

pl = pv.Plotter()
pl.add_mesh(point_cloud, color='k', point_size=10)
pl.add_mesh(repaired)
pl.add_title('Reconstructed Surface')
pl.show()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68777480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档