赞
踩
下面这篇文章介绍的非常详细,如果有兴趣消息了解算法的,可以移步到这里:https://blog.csdn.net/weixin_50514171/article/details/127195711
dbscan是一种基于密度的聚类算法,根据点周围的密度,将点进行聚类划分。
几个概念(半径eps,阈值点数min_points):
• 核心点:半径eps内的点个数大于给定min_points的点
• 边界点:半径eps内的点个数小于给定阈值min_points,但它在核心点R邻域内。
• 噪声点:既不是核心点,也不是边界点
特点:可以对任意形状的稠密数据集进行聚类,可以在聚类的同时发现异常点,对数据集中的异常点不敏感,如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差。
labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))
参数:
eps:搜索半径
min_points:形成聚类所需的最小点数。
返回值:
聚类标签索引,其中标签-1表示噪声点。
这段代码有两个不容易理解的地方:
1、 with o3d.utility.VerbosityContextManager(
o3d.utility.VerbosityLevel.Debug) as cm:
在 python 中,为了保证资源在使用过后得到释放,会使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。这里的意思是在执行cluster_dbscan方法时,设置open3d的调试级别为o3d.utility.VerbosityLevel.Debug。
2、colors = plt.get_cmap(“tab20”)(labels / (max_label if max_label > 0 else 1))
python中matplotlib内置的离散cmap中颜色,最多的tab20有20个颜色。
cmap类似于一个字典,以float形式输入[0, 1]之间的数字,能够得到对应的颜色rgba值(输入数字如果大于1,cmap会自动对其进行正则化)。
import open3d as o3d import numpy as np import matplotlib.pyplot as plt if __name__ == "__main__": sample_ply_data = o3d.data.PLYPointCloud() pcd = o3d.io.read_point_cloud(sample_ply_data.path) # Flip it, otherwise the pointcloud will be upside down. pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) with o3d.utility.VerbosityContextManager( o3d.utility.VerbosityLevel.Debug) as cm: labels = np.array( pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True)) max_label = labels.max() print(f"point cloud has {max_label + 1} clusters") colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1)) colors[labels < 0] = 0 pcd.colors = o3d.utility.Vector3dVector(colors[:, :3]) o3d.visualization.draw([pcd])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。