Open3d dbscan聚类算法cluster_dbscan

目录

  • 一、dbscan聚类算法介绍
  • 二、cluster_dbscan函数解析
  • 三、代码实现

一、dbscan聚类算法介绍

下面这篇文章介绍的非常详细,如果有兴趣消息了解算法的,可以移步到这里:https://blog.csdn.net/weixin_50514171/article/details/127195711
dbscan是一种基于密度的聚类算法,根据点周围的密度,将点进行聚类划分。
几个概念(半径eps,阈值点数min_points):
• 核心点:半径eps内的点个数大于给定min_points的点
• 边界点:半径eps内的点个数小于给定阈值min_points,但它在核心点R邻域内。
• 噪声点:既不是核心点,也不是边界点
特点:可以对任意形状的稠密数据集进行聚类,可以在聚类的同时发现异常点,对数据集中的异常点不敏感,如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差。

二、cluster_dbscan函数解析

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

你可能感兴趣的:(python+Open3d,python,open3d)