Open3D DbScanClustering聚类算法及聚类分簇可视化及存储

news/2024/7/2 14:31:10

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个聚簇的点数比较巨大,明显一些。另外右边角落有一块比较小的片段。

1. 效果图

点云聚类后分类别提取及可视化效果图如下:

在这里插入图片描述

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

控制台输出:

PointCloud with 196133 points.
[Open3D DEBUG] Precompute neighbors.
[Open3D DEBUG] Done Precompute neighbors.
[Open3D DEBUG] Compute Clusters
Precompute neighbors.[========================================] 100%
[Open3D DEBUG] Done Compute Clusters: 10
point cloud has 10 clusters
[0 0 0 ... 2 2 2] 196133
min:  -1  max:  9
(array([    23,     24,     25, ..., 196130, 196131, 196132], dtype=int64),)   type:  <class 'tuple'>  size:  190176
PointCloud with 5957 points.
zero_index:  (array([    0,     1,     2, ..., 38888, 38889, 39501], dtype=int64),)  size:  5957
label:  -1 点云数: 109
label:  0 点云数: 5957
label:  1 点云数: 25136
label:  2 点云数: 150429
label:  3 点云数: 11
label:  4 点云数: 24
label:  5 点云数: 14352
label:  6 点云数: 65
label:  7 点云数: 12
label:  8 点云数: 10
label:  9 点云数: 28

2. 源代码

# <DBSCAN聚类算法,是基于密度的聚类算法。>
# 该算法需要两个参数。
# -eps: 定义到聚类邻居的距离
# -min_points: 定义形成聚类所需的最小点数。
# 该函数返回一个标签,其中标签-1表示噪音。>import open3d as o3d
import matplotlib.pyplot as plt
import numpy as nppath = "./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], "o3d dbscanclusting origin", width=400, height=400)print(labels, len(labels))
min = labels.min()
max = labels.max()
# print('min: ', min, " max: ", max)# 打印聚类非0的点云下标,点云数
print(np.nonzero(labels), '  type: ', type(np.nonzero(labels)), ' size: ', len(np.array(np.nonzero(labels)[0])))zero_index = np.where(labels == 0)  # 提取分类为0的聚类点云下标
zero_pcd = pcd.select_by_index(np.array(zero_index)[0])  # 根据下标提取点云点
print(zero_pcd)
print('zero_index: ', zero_index, " size: ", len(np.array(zero_index)[0]))for label in range(min, max+1):label_index = np.where(labels == label)  # 提取分类为label的聚类点云下标label_pcd = pcd.select_by_index(np.array(label_index)[0])  # 根据下标提取点云点print('label: ', str(label), '点云数:', len(label_pcd.points))# 可视化o3d.visualization.draw_geometries([label_pcd], "o3d dbscanclusting " + str(label) + " results", width=400,height=400)# 分别按分类写入文件o3d.io.write_point_cloud("./" + str(label) + ".pcd", label_pcd)

参考

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/17435.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

端口01 - 零基础入门学习汇编语言67

第十四章&#xff1a;端口01 让编程改变世界 Change the world by program 引言 CPU可以直接读写3 个地方的数据 &#xff08;1&#xff09;CPU 内部的寄存器&#xff1b; &#xff08;2&#xff09;内存单元&#xff1b; &#xff08;3&#xff09;端口。 这一章&#xff0c…

【点云重采样Resampling】Python-pcl 基于多项式平滑点云及法线估计的曲面重建

1. 点云重采样 基于多项式平滑点云及法线估计的曲面重建以实现重采样&#xff0c;可以使得点云数据更规整一些&#xff0c;没之前那么杂乱。 set_Compute_Normals(True) 可以通过在最小二乘法中进行法线估计&#xff0c;提高重采样准确度&#xff1b;set_polynomial_fit(True…

Open3D KdTree建立、3种近邻搜索及结果可视化

1. 点云索引 Open3D KdTree,可以快速的在无序的点云中建立空间拓扑结构,使得能迅速的进行近邻搜索; 2. 近邻方法分类: Open3D这边支持的近邻搜索方法由VTK实现; K近邻搜索(K Nearest Neighbors Search)半径近邻搜索(Radius Nearest Neighbors Search)混合近邻搜索(…

Open3D 点云法向量3种估计方法及法向量可视化

点云3种法向量估计方法及可视化 1)点云读取可视化2)下采样可视化3)法向量三种估计方式(K近邻估计,半径近邻估计,混合搜索估计)4)点云每个点对应的法向量点存储及可视化5)法向量点和原始点云同时可视化6)源码1)点云读取可视化 原始点云: 2)下采样可视化 下采样:…

使用Python,OpenCV创建动画GIF图和模因生成器

在这篇博客中,我们将学习如何使用Python,OpenCV,dlib和ImageMagick工具箱创建动画GIF。 然后,您将结合所有这些技术,使用OpenCV构建一个模因生成器(眼镜👓和文字Deal with it) 效果图: 首先,讨论该项目的先决条件和依赖项,包括如何正确配置开发环境。 然后,将审…

使用Python,OpenCV和Hough圆检测图像中的圆

使用Python,OpenCV和Hough圆检测图像中的圆 1. 效果图2. cv2.HoughCircles(image, method, dp, minDist)3. 源码参考前几篇博客中有介绍,使用OpenCV检测图形中的三角形、正方形、矩形,多边形;这篇博客将展示如何利用cv2.HoughCircles函数使用OpenCV检测图像中的圆圈。 1. …

用Duplex实现消息广播

http://blog.csdn.net/fangxinggood/archive/2011/01/15/6142861.aspx WCF中定义3种消息交换模式&#xff1a; 1. Request/Reply; 2. One-Way; 3. Duplex。 Request/Reply 是缺省模式&#xff0c;即同步调用。在调用服务方法后需要等待服务的消息返回&#xff0c;即便该方法返…

Python OpenCV应用K均值聚类进行颜色量化

Python OpenCV应用K均值聚类进行颜色量化 1. 效果图2. 颜色量化是什么?3. MiniBatchKMeans & KMeans4. 源码参考在这篇博客文章中,我将向您展示如何使用K-means聚类和颜色量化在图像中创建“ A Scanner Darkly”效果。 1. 效果图 左侧原始图像,右侧颜色量化图像