如何在PyVista中实现基于邻近距离的点云下采样(抽稀)?
基于邻点邻近度的PyVista点云抽稀方案
针对未网格化的点云,无需从零开发,可通过PyVista及底层VTK的现成方法实现基于邻近度的下采样:
1. 空间聚类抽稀
利用聚类算法将邻近点归为一类,保留每类的代表点(如质心),实现抽稀:
import pyvista as pv # 假设point_cloud是你的原始点云(pyvista.PolyData对象) # 用k-means聚类,按目标点数控制抽稀程度 clustered = point_cloud.clustering(n_clusters=1000, method='kmeans') # 提取聚类质心作为抽稀后的点云 downsampled = clustered.extract_points(clustered['ClusterId'], tolerance=0.0, include_cells=False)
若要通过距离阈值控制邻近度,可改用method='dbscan',设置eps参数定义邻域半径,筛选核心点或聚类质心。
2. 用decimate_pro适配无拓扑点云
虽然常规decimate针对网格化数据,但decimate_pro可直接处理无拓扑的点云,基于空间分布筛选邻近点:
# target_reduction设置抽稀比例,0.7表示保留30%的点 downsampled = point_cloud.decimate_pro(target_reduction=0.7)
可通过feature_angle参数调整对边缘点的保留优先级,间接优化邻近点的筛选逻辑。
3. 调用VTK底层点定位器去重
直接用VTK的vtkStaticPointLocator按距离阈值筛选非邻近点:
import vtk import pyvista as pv # 初始化点定位器并构建索引 locator = vtk.vtkStaticPointLocator() locator.SetDataSet(point_cloud) locator.BuildLocator() # 设置邻域半径阈值,筛选不重复的点 distance_threshold = 0.1 unique_point_ids = vtk.vtkIdList() locator.FindUniquePoints(distance_threshold, unique_point_ids) # 提取抽稀后的点云 downsampled = point_cloud.extract_points(unique_point_ids)
这种方法直接基于邻点距离去重,完全匹配“基于邻近度抽稀”的需求。
内容的提问来源于stack exchange,提问作者Sterling Butters
相关产品推荐
相关产品推荐

