Open3D DbScanClustering聚类算法

DBSCAN聚类算法,是基于密度的聚类算法。该算法需要两个参数。

labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))


入参:

  • eps: 定义到聚类邻居的距离
  • min_points: 定义形成聚类所需的最小点数。

出参:

  • 该函数返回一个标签,其中标签-1表示噪音。

该算法定义以选中的点开始蔓延,邻居点距离<=0.02米,最小有10个点就可以构成一个簇;适用于原始点云分隔的比较开的,有明显界限的点云。

原始点云被分成了10个聚簇,每个聚簇不同的颜色,只有3个聚簇的点数比较巨大,明显一些。另外右边角落有一块比较小的片段。

官方例子算法效果:
在这里插入图片描述在这里插入图片描述
输出:

Format = auto
Extension = ply
geometry::PointCloud with 196133 points.
[Open3D DEBUG] Precompute Neighbours
[Open3D DEBUG] Done Precompute Neighbours
[Open3D DEBUG] Compute Clusters
Precompute Neighbours[========================================] 100%
[Open3D DEBUG] Done Compute Clusters: 10
point cloud has 10 clusters

源代码:

# <DBSCAN聚类算法,是基于密度的聚类算法。>
# 该算法需要两个参数。
# -eps: 定义到聚类邻居的距离
# -min_points: 定义形成聚类所需的最小点数。
# 该函数返回一个标签,其中标签-1表示噪音。>

import open3d as o3d
import matplotlib.pyplot as plt
import numpy as np

path =  "../pcds/fragment.ply"
print(path)

pcd = o3d.io.read_point_cloud(path)
print(pcd)

# 定义以选中的点开始蔓延,邻居点距离0.02米的,最小有10个点,可以构成一个簇;适用于点云分隔的比较开的,一块一块的点云。
with o3d.utility.VerbosityContextManager(o3d.utility.VerbosityLevel.Debug) as cm:
    labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True))

max_label = labels.max()
print(f"point cloud has {max_label + 1} clusters")
colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1))

colors[labels < 0] = 0
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
o3d.visualization.draw_geometries([pcd], "Open3D dbscanclusting")

参考:

http://www.open3d.org/docs/release/tutorial/Basic/pointcloud.html#Access-estimated-vertex-normal

猜你喜欢

转载自blog.csdn.net/qq_40985985/article/details/108512968