Open3d处理点云数据-Kmeans聚类分割(三)
·
1. K-means聚类分割原理
核心目标:将点云数据划分为K个簇,使同一簇内点的特征相似度最大化,不同簇之间差异最大化。
1.1数学公式
-
距离计算(欧式距离):
[ d(x_i, \mu_j) = \sqrt{(x_i - \mu_j)^T (x_i - \mu_j)} ]
其中,(x_i)为点坐标,(\mu_j)为簇中心。 -
质心更新:
[ \mu_j = \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i ]
(C_j)为第(j)个簇的点集合,(|C_j|)为簇内点数。
1.2算法流程
- 初始化:随机选取
K个初始质心。 - 迭代优化:
- 分配阶段:将每个点分配到最近的质心所属簇。
- 更新阶段:重新计算每个簇的质心。
- 终止条件:质心变化小于阈值或达到最大迭代次数。
1.3参考文献
- J. MacQueen, “Some Methods for Classification and Analysis of Multivariate Observations” (1967).
- 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聚类分割图
更多推荐
所有评论(0)