当前位置:   article > 正文

【Lidar】Open3D点云K-Means聚类算法:基于距离的点云聚类(单木分割)附Python代码_点云聚类分割算法

点云聚类分割算法

原创作者:RS迷途小书童

博客地址:https://blog.csdn.net/m0_56729804?type=blog

1 K-Means算法介绍

        K-means聚类算法是一种无监督学习算法,主要用于数据聚类。该算法的主要目标是找到一个数据点的划分,使得每个数据点与其所在簇的质心(即该簇所有数据点的均值)之间的平方距离之和最小。

        在K-means聚类算法中,首先需要预定义簇的数量K,然后随机选择K个对象作为初始的聚类中心。接着,算法会遍历数据集中的每个对象,根据对象与各个聚类中心的距离,将每个对象分配给距离它最近的聚类中心。完成一轮分配后,算法会重新计算每个簇的聚类中心,新的聚类中心是该簇所有对象的均值。这个过程会不断重复,直到满足某个终止条件,如没有(或最小数目)对象被重新分配给不同的簇,没有(或最小数目)簇的中心再发生变化,或者误差平方和局部最小。

2 Python代码

        我这里使用的是Python机器学习库里自带的K-Means算法,不用自己手动复现。参数如下:

        1)n_clusters (整数): 这是你希望算法找到的簇的数量。例如,如果你希望算法将数据分为三类,那么你应该设置 n_clusters=3

        2)random_state (整数或None): 这个参数是用来设置随机数生成器的种子。这样,每次运行算法时,你都会得到相同的结果。如果你想让结果每次都不一样,你可以设置 random_state=None

        3)n_init (整数): 这个参数是用来指定算法运行的不同初始化次数的。算法会多次运行,每次都使用不同的随机初始化,然后选择最好的结果(即具有最小内部集群距离的结果)。这有助于避免局部最优解。

        4)init (字符串或数组): 这个参数决定了初始化聚类中心的方法。常见的选项包括 "k-means++" 和 "random"。如果你使用 "k-means++",那么算法会首先随机选择一个点作为第一个聚类中心,然后选择具有最大与已选择聚类中心距离的点作为下一个聚类中心。这种方法有助于提高算法的稳定性。

  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2023/11/3 14:37
  4. @Auth : RS迷途小书童
  5. @File :Point Cloud Clustering.py
  6. @IDE :PyCharm
  7. @Purpose:点云聚类
  8. @Web:博客地址:https://blog.csdn.net/m0_56729804
  9. """
  10. import open3d as o3d
  11. import numpy as np
  12. from copy import deepcopy
  13. from sklearn import cluster
  14. import matplotlib.pyplot as plt
  15. def KMeans():
  16. # KMeans聚类,非监督
  17. pcd_path = r"彭俊喜/4 - Cloud.pcd"
  18. pcd = o3d.io.read_point_cloud(pcd_path)
  19. pcd = o3d.geometry.PointCloud(pcd)
  20. print(pcd)
  21. pcd.paint_uniform_color(color=[0, 0, 0])
  22. # 对点云数据进行着色操作,使其所有点的颜色相同,颜色为 [0, 0, 0]
  23. n_clusters = 3 # 聚类簇数
  24. points = np.array(pcd.points)
  25. print(points)
  26. # 将点云数据转换为 numpy 数组,并使用 sklearn 的 KMeans 进行聚类
  27. kmeans = cluster.KMeans(n_clusters=n_clusters, random_state=42, n_init=10, init="k-means++")
  28. kmeans.fit(points) # 获取聚类结果,这里主要是每个点的类别标签
  29. labels = kmeans.labels_
  30. colors = np.random.randint(0, 255, size=(n_clusters, 3)) / 255
  31. # 随机生成一些颜色,然后根据类别标签将这些颜色分配给对应的点
  32. colors = colors[labels]
  33. pcd_cluster = deepcopy(pcd)
  34. pcd_cluster.translate([50, 0, 0])
  35. # 对原始的点云数据做一个深度拷贝,并将这个拷贝的每个点的位置向下移动50个单位。这是为了在可视化时更清楚地看到聚类效果
  36. pcd_cluster.colors = o3d.utility.Vector3dVector(colors)
  37. # 将新生成的颜色赋值给拷贝的点云数据
  38. o3d.visualization.draw_geometries([pcd_cluster])
  39. # o3d.io.write_point_cloud(r'3trees_clustering.ply', pcd_cluster, write_ascii=False, compressed=False,
  40. # print_progress=True)
  41. if __name__ == "__main__":
  42. KMeans()

3 效果展示

4 总结

        总的来说,K-Means算法还是不错的,单木分割方面比DBSCAN聚类表现得好。但是对于完善地林业单木分割还是有些困难,可能还需要加入其他算法来修正它的结果。其次在K-Means算法的参数方面需要好好臻选。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/790134
推荐阅读
相关标签
  

闽ICP备14008679号