1. K-means聚类分割原理

核心目标:将点云数据划分为K个簇,使同一簇内点的特征相似度最大化,不同簇之间差异最大化。

1.1数学公式

  1. 距离计算(欧式距离):
    [ d(x_i, \mu_j) = \sqrt{(x_i - \mu_j)^T (x_i - \mu_j)} ]
    其中,(x_i)为点坐标,(\mu_j)为簇中心。

  2. 质心更新
    [ \mu_j = \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i ]
    (C_j)为第(j)个簇的点集合,(|C_j|)为簇内点数。

1.2算法流程

  1. 初始化:随机选取K个初始质心。
  2. 迭代优化
    • 分配阶段:将每个点分配到最近的质心所属簇。
    • 更新阶段:重新计算每个簇的质心。
  3. 终止条件:质心变化小于阈值或达到最大迭代次数。

1.3参考文献

  1. J. MacQueen, “Some Methods for Classification and Analysis of Multivariate Observations” (1967).
  2. Scikit-learn官方文档:https://scikit-learn.org/stable/modules/clustering.html#k-means

2.代码实现

 

import open3d as o3d
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 读取点云
pcd = o3d.io.read_point_cloud("input.pcd")

# 降采样(可选)
pcd = pcd.voxel_down_sample(voxel_size=0.02)

# 提取坐标作为特征
points = np.asarray(pcd.points)

# K-means聚类
kmeans = KMeans(n_clusters=5, random_state=0)  # 假设分5类
labels = kmeans.fit_predict(points)

# 颜色映射(每个簇分配不同颜色)
colors = plt.get_cmap("tab10")(labels / (kmeans.n_clusters - 1))[:, :3]
pcd.colors = o3d.utility.Vector3dVector(colors)

# 可视化
o3d.visualization.draw_geometries([pcd])

# 保存结果(可选)
o3d.io.write_point_cloud("output_clustered.pcd", pcd)

3.成果输出

 

兔子原始数据图

兔子Kmeans聚类分割图

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐