1、背景介绍
欧式聚类是一种基于欧氏距离度量的聚类算法。它是点云处理中的一个重要步骤,它可以帮助我们从无序的点云数据中提取有意义的信息。一般来说,对点云进行欧式聚类处理,可以帮助后续数据处理,如物体检测与识别、三维重建等。如下图所示,经过欧式聚类处理后,得到单棵树木,识别出单棵树木。
2、欧氏聚类原理
点云欧氏聚类是一种基于点云数据中点与点之间的欧氏距离来进行聚类的方法,只要任意点之间距离小于设定阈值,便将这两点聚为一类。如下图所示,展示了二维平面下欧氏聚类原理
欧氏聚类算法编程大体步骤如下,总体来说,分割结果与设置的距离阈值密切相关。
-
初始化:
- 创建一个空的结果列表,用于存放聚类结果。
- 初始化一个标志数组,用于标记点是否已被处理。
-
构建搜索结构:
- 构建一个空间索引结构(如 KD 树),以便快速查找每个点的邻域。
-
遍历点云:
- 遍历点云中的每一个点。
- 如果该点尚未被处理,则开始一个新的聚类。
-
区域增长:
- 选择一个未处理的点作为起始点。
- 在给定的距离阈值内找到所有邻近的点,并将它们标记为已处理。
- 将这些邻近的点添加到当前聚类中。
- 对这些邻近点重复上述过程,直到没有新的点加入聚类为止。
-
保存聚类结果:
- 将当前聚类添加到结果列表中。
-
重复步骤 3-5:
- 继续遍历未处理的点,重复上述步骤,直到所有点都被处理。
-
输出结果:
- 返回所有聚类的结果列表。
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编写的欧氏聚类代码对点云进行聚类效果。