基于欧氏距离的点云聚类(python)

1、背景介绍

       欧式聚类是一种基于欧氏距离度量的聚类算法。它是点云处理中的一个重要步骤,它可以帮助我们从无序的点云数据中提取有意义的信息。一般来说,对点云进行欧式聚类处理,可以帮助后续数据处理,如物体检测与识别、三维重建等。如下图所示,经过欧式聚类处理后,得到单棵树木,识别出单棵树木。

2、欧氏聚类原理

      点云欧氏聚类是一种基于点云数据中点与点之间的欧氏距离来进行聚类的方法,只要任意点之间距离小于设定阈值,便将这两点聚为一类。如下图所示,展示了二维平面下欧氏聚类原理

欧氏聚类算法编程大体步骤如下,总体来说,分割结果与设置的距离阈值密切相关。

  1. 初始化

    • 创建一个空的结果列表,用于存放聚类结果。
    • 初始化一个标志数组,用于标记点是否已被处理。
  2. 构建搜索结构

    • 构建一个空间索引结构(如 KD 树),以便快速查找每个点的邻域。
  3. 遍历点云

    • 遍历点云中的每一个点。
    • 如果该点尚未被处理,则开始一个新的聚类。
  4. 区域增长

    • 选择一个未处理的点作为起始点。
    • 在给定的距离阈值内找到所有邻近的点,并将它们标记为已处理。
    • 将这些邻近的点添加到当前聚类中。
    • 对这些邻近点重复上述过程,直到没有新的点加入聚类为止。
  5. 保存聚类结果

    • 将当前聚类添加到结果列表中。
  6. 重复步骤 3-5

    • 继续遍历未处理的点,重复上述步骤,直到所有点都被处理。
  7. 输出结果

    • 返回所有聚类的结果列表。

3、程序测试

3.1 部分代码     

        使用python语言,在pycharm平台上编写的欧氏聚类源代码,非调用API程序代码,下载链接:https://download.csdn.net/download/qq_32867925/89598939

下载包括源代码与测试数据:

其中区域增长代码如下,根据探测的近邻点一直增长下去,直至不再有点增加进来

 while len(seed)>=1:
        onepoint=seed.pop()#获取头部点,并从列表中剔除该点
        nearest_idx = kdtree.query_ball_point(onepoint, dis_thres)
        for j in range(len(nearest_idx)):
            id=nearest_idx[j]
            if flag[id] == 0:  # 表明没有增长
               flag[id] = 1
               onecluster.append(before_cluster[id])
               seed.append(before_cluster[id])

搜索近邻点,并对近邻点逐一进行处理,代码如下:

 nearest_idx = kdtree.query_ball_point(points[i], dis_thres)
for j in range(len(nearest_idx)):

3.2 测试结果分析

      选取车载点云采集的树木点云数据进行测试,如下图所示,总共5棵树木,树木之间间距不交明显,利用欧氏聚类对点云进行处理后,5棵树木点被划分到对应的树木上,分割效果还算理想。

4、总结

    介绍了欧氏聚类基本原理,并测试用python编写的欧氏聚类代码对点云进行聚类效果。

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云实验室lab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值