You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:59:56