【编程实践】利用open3d对点云进行聚类并可视化

功能:对点云进行DBSCAN聚类,可视化聚类结果并统计噪声比例。
输入:DungouCut.pcd点云文件。
输出:聚类数量、噪声比例及彩色可视化结果。
注意:eps和min_points需根据点云密度调整。
调优方向:通过average_distance动态设置eps,或网格搜索最佳参数组合。

# -*- coding: utf-8 -*-
"""
Created on Jan 27 16:39 2025

@author: zhiyang
"""
import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt
cloud_in = o3d.io.read_point_cloud('data_input\\DungouCut.pcd')
cloud_points = np.asarray(cloud_in.points)
kdtree = o3d.geometry.KDTreeFlann(cloud_in)
distances = []

for i in range(len(cloud_points)):
    [_, idx, d] = kdtree.search_knn_vector_3d(cloud_in.points[i], 2)
    diatance = np.sqrt(d[1])
    distances.append(diatance)
average_distance = np.mean(distances)

eps = 10 * average_distance
min_points = 10
labels = np.array(cloud_in.cluster_dbscan(eps = eps, min_points = min_points, print_progress = True))
max_label = labels.max()
print(f"聚类数量:{max_label+1}")
print(f"噪声比例:{np.sum(labels == -1) / len(labels):.3f}")
colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))
colors[labels < 0] = [0,0,0,1]
cloud_in.colors = o3d.utility.Vector3dVector(colors[:, :3])
o3d.visualization.draw_geometries([cloud_in])

运行所需要依赖第三方库如下:

# reqiurements.txt
matplotlib==3.7.5
numpy==1.24.3
numpy==1.24.4
open3d==0.17.0
pyvista==0.44.2
scikit_learn==1.3.2

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值