【Lidar】Open3D点云DBSCAN聚类算法:基于密度的点云聚类(单木分割)附Python代码

1 DBSCAN算法介绍

        DBSCAN聚类算法是一种基于密度的聚类算法,全称为“基于密度的带有噪声的空间聚类应用”,英文名称为Density-Based Spatial Clustering of Applications with Noise。

        DBSCAN聚类算法能够发现任意形状的类别,并且对噪音数据具有较强的鲁棒性。其基本思想是,如果一个点在给定的邻域内有足够多的相邻点,那么该点就是一个核心点;如果一个点在给定的邻域内没有足够多的相邻点,那么该点就是一个边界点;如果一个点既不是核心点也不是边界点,那么该点就是噪音点。

        DBSCAN聚类算法的优点在于,它只需要扫描一遍数据集即可完成聚类,不需迭代执行,因此具有较高的效率。此外,DBSCAN聚类算法可以发现任意形状的簇,而不仅仅是凸形簇。

        在实际应用中,DBSCAN聚类算法可以应用于许多领域,如图像处理、文本挖掘、生物信息学等。例如,在图像处理中,可以使用DBSCAN聚类算法对图像进行分割和识别;在文本挖掘中,可以使用DBSCAN聚类算法对文本进行主题分类和情感分析;在生物信息学中,可以使用DBSCAN聚类算法对基因序列进行聚类分析。总之,DBSCAN聚类算法是一种非常实用的聚类算法,可以应用于许多领域。

2 Python代码

        我这里使用的是Open3D库自带的DBSCAN算法,主要参数就两个:1、eps: 这是确定邻域的半径。它决定了在考虑一个点是否在某个点的邻域时,我们考虑的范围有多大。2、min_points: 这是构成一个簇所需要的最少点数。如果一个点的邻域中包含的点数少于这个值,那么这个点将被视为噪声点,不会加入任何簇。

# -*- coding: utf-8 -*-
"""
@Time : 2023/11/3 14:37
@Auth : RS迷途小书童
@File :Point Cloud Clustering.py
@IDE :PyCharm
@Purpose:点云聚类
"""
import open3d as o3d
import numpy as np
import matplotlib.pyplot as plt


def DBSCAN():
    # 欧式聚类,注意eps和min_points的取值
    pcd_path = r"4 - Cloud.pcd"
    pcd = o3d.io.read_point_cloud(pcd_path)
    pcd = o3d.geometry.PointCloud(pcd)
    print(pcd)
    # 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.045, min_points=20, print_progress=True))
        # eps: 这是确定邻域的半径。它决定了在考虑一个点是否在某个点的邻域时,我们考虑的范围有多大。
        # min_points: 这是构成一个簇所需要的最少点数。如果一个点的邻域中包含的点数少于这个值,那么这个点将被视为噪声点,不会加入任何簇。
    max_label = max(labels)  # 最大的类别值
    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  # 类别为0的,颜色设置为黑色
    pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])  # ndarray to vector3d
    o3d.visualization.draw([pcd], width=1920, height=1080)
    output_path = "clustered_point_cloud.pcd"
    o3d.io.write_point_cloud(output_path, pcd)


if __name__ == "__main__":
    DBSCAN()

3 效果展示

4 总结

        总的来说,DBSCAN算法还是不错的,它作为基于欧式距离为基础的密度聚类算法在表现上还可以。但是对于完善地林业单木分割还是有些困难,可能还需要加入其他算法来修正它的结果。其次在DBSCAN算法的参数方面需要好好臻选,如果搜索半径设置的过大程序就会执行很长一段时间!

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Lidar点云分割聚类算法是一种利用激光雷达扫描数据进行地物分类和分析的算法激光雷达通过发射激光束并接收反射回来的信号,可以获取到地物的三维坐标信息。而激光雷达扫描得到的原始数据是一组离散点的信息,需要进行分割聚类处理才能得到有意义的结果。 点云分割算法的主要目标是将原始点云数据分割成不同的地物部分。常用的分割算法有基于几何特征和基于特征提取的方法。基于几何特征的算法主要依靠点云中点的相邻关系进行分割,比如根据点间距、法线方向等信息来判断是否属于同一地物。而基于特征提取的算法则通过对点云进行特征提取,比如曲率、形状描述子等,根据不同特征之间的相似性进行聚类,从而实现点云分割点云聚类算法则是对分割后的点云进行进一步的聚类,将属于同一地物的点划分为一个簇。聚类算法常用的方法包括基于密度和基于连通关系的方法。基于密度聚类算法通过确定点的密度来判断是否属于同一簇,如DBSCAN算法。而基于连通关系的聚类算法则依靠点之间的连通关系进行划分,比如基于区域生长的算法。 通过点云分割聚类算法,可以有效地提取地物的相关信息,如建筑物、树木、道路等,为后续的地物识别、地物分类、场景分析等应用提供有价值的数据基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RS迷途小书童

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值