繁体   English   中英

努力使用 Python 中的 Open3D 从点云数据中创建防水网格

[英]Struggling to create watertight meshes out of point cloud data using Open3D in Python

我正在尝试从点云中创建一个防水网格,以表示来自锥形束 CT 图像的器官轮廓数据。 我的目标是获取两个网格并计算它们两者之间的相交量。

我已尝试使用此处显示的每种方法

泊松重构

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() 的结果是 False,但是对于 Bladder 数据,它返回 True。 此外,该算法将网格扩展到数据的垂直限制之上和之下。 如果有办法将其最小化,这将不是一个破坏交易的问题,那就太好了。

泊松网格图像泊松网格图像

球旋转

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)

如果我能够填充孔,这将是我的首选方法,因为它只是连接顶点而无需插值。 也许如果我能够将其放入 state 中,其中唯一剩余的孔很大,我可以将此网格转换为与 Pyvista 兼容的网格并使用 Pymeshfix 修补这些孔。

球旋转网格图像球旋转网格图像

阿尔法形状

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])

这样做的结果类似于球旋转,但更糟。

Alpha 形状网格图像Alpha 形状网格图像

样本数据

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

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()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM