基于欧氏距离的点云聚类(python)

news2024/9/17 9:04:13

1、背景介绍

       欧式聚类是一种基于欧氏距离度量的聚类算法。它是点云处理中的一个重要步骤,它可以帮助我们从无序的点云数据中提取有意义的信息。一般来说,对点云进行欧式聚类处理,可以帮助后续数据处理,如物体检测与识别、三维重建等。如下图所示,经过欧式聚类处理后,得到单棵树木,识别出单棵树木。

2、欧氏聚类原理

      点云欧氏聚类是一种基于点云数据中点与点之间的欧氏距离来进行聚类的方法,只要任意点之间距离小于设定阈值,便将这两点聚为一类。如下图所示,展示了二维平面下欧氏聚类原理

欧氏聚类算法编程大体步骤如下,总体来说,分割结果与设置的距离阈值密切相关。

  1. 初始化

    • 创建一个空的结果列表,用于存放聚类结果。
    • 初始化一个标志数组,用于标记点是否已被处理。
  2. 构建搜索结构

    • 构建一个空间索引结构(如 KD 树),以便快速查找每个点的邻域。
  3. 遍历点云

    • 遍历点云中的每一个点。
    • 如果该点尚未被处理,则开始一个新的聚类。
  4. 区域增长

    • 选择一个未处理的点作为起始点。
    • 在给定的距离阈值内找到所有邻近的点,并将它们标记为已处理。
    • 将这些邻近的点添加到当前聚类中。
    • 对这些邻近点重复上述过程,直到没有新的点加入聚类为止。
  5. 保存聚类结果

    • 将当前聚类添加到结果列表中。
  6. 重复步骤 3-5

    • 继续遍历未处理的点,重复上述步骤,直到所有点都被处理。
  7. 输出结果

    • 返回所有聚类的结果列表。

3、程序测试

3.1 部分代码     

        使用python语言,在pycharm平台上编写的欧氏聚类源代码,非调用API程序代码,下载链接:https://download.csdn.net/download/qq_32867925/89598939

下载包括源代码与测试数据:

其中区域增长代码如下,根据探测的近邻点一直增长下去,直至不再有点增加进来

 while len(seed)>=1:
        onepoint=seed.pop()#获取头部点,并从列表中剔除该点
        nearest_idx = kdtree.query_ball_point(onepoint, dis_thres)
        for j in range(len(nearest_idx)):
            id=nearest_idx[j]
            if flag[id] == 0:  # 表明没有增长
               flag[id] = 1
               onecluster.append(before_cluster[id])
               seed.append(before_cluster[id])

搜索近邻点,并对近邻点逐一进行处理,代码如下:

 nearest_idx = kdtree.query_ball_point(points[i], dis_thres)
for j in range(len(nearest_idx)):

3.2 测试结果分析

      选取车载点云采集的树木点云数据进行测试,如下图所示,总共5棵树木,树木之间间距不交明显,利用欧氏聚类对点云进行处理后,5棵树木点被划分到对应的树木上,分割效果还算理想。

4、总结

    介绍了欧氏聚类基本原理,并测试用python编写的欧氏聚类代码对点云进行聚类效果。

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

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

相关文章

链式栈,队列与树形结构

链式栈 链式存储的栈 实现方式:可以使用单向链表完成 对单向链表进行头插(入栈)、头删(出栈),此时链表的头部就是链栈的栈顶,链表的尾部,就是链栈的栈底 队列 概念 队列&#…

二叉树算法题(1)

单值二叉树 思路: 若根结点为NULL,则直接返回true若根结点的左右结点存在,且与根结点的值不相等,则返回false递归根结点的左右子树 typedef struct TreeNode TreeNode; bool isUnivalTree(struct TreeNode* root) {if(root NU…

程序员修炼之路:深入广泛的必修课程

成为一名优秀的程序员,需要广泛而深入地学习多个领域的知识。这些课程不仅帮助建立扎实的编程基础,还培养了问题解决、算法设计、系统思维等多方面的能力。以下是一些核心的必修课: 计算机基础 计算机组成原理:理解计算机的硬件组…

一步步揭秘:浏览器输入URL后的那些事儿

Hello大家好,我是小米,一个热爱分享技术的IT达人。今天我们一起来聊聊一个大家每天都会用到但可能不太了解的过程:浏览器输入URL之后发生了什么。这是一个从用户输入到浏览器显示页面的完整过程,涉及到很多底层的网络基础知识。今天我们就一起来探究这个神秘的过程! DNS解…

Java 中的File类

路径分为绝对路径和相对路径。 相对路径肯定是相对谁来说的,一般是一个文件相对于另外一个文件而言的路径。 下面是一个例子,比如index.htm如何找到photo.jpg呢? c:/website/web/index.htmc:/website/img/photo.jpg 所以在index.htm中使用…

Python:类的属性(实例属性、类属性)和方法(实例方法、类方法、静态方法)

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 Python是一门面向对象的编程语言,其核心概念之一是类。类是对象的蓝图或模板,定义了对象的属性和方法。理解类的属性和方法对于掌握Python编程至…

【Docker】常见概念|技术架构演进之路|八大架构|单机架构|应用数据分离架构|应用服务集群架构

目录 一、常见概念 应用(Application) / 系统(System) 模块(Module) / 组件(Component) 分布式(Distributed) 集群(Cluster) 主…

python调用MATLAB函数的一个诡异的问题,数据类型问题

记一次python调用MATLAB函数的诡异问题 说明(废话)解决方案总结 说明(废话) 这个问题的起因是python调用MATLAB函数的问题,归根结底,主要还是因为不同语言对于不同的数据表达的方式不同造成的问题。 pytho…

在Postman中引用JS库

前言 在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的,即在请求前使用JavaScript脚本对…

界面组件DevExtreme v24.2将发布一系列新组件、支持.NET 9

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac&#xff0c…

中小企业选择数字工厂管理系统需要注意哪些问题

在当今数字化转型的大潮中,中小企业作为经济体系的重要组成部分,正积极寻求通过引入数字工厂管理系统来提升生产效率、优化资源配置、增强市场竞争力。然而,面对市场上琳琅满目的数字工厂管理系统解决方案,中小企业在选择时往往面…

HarmonyOS鸿蒙- 延时执行

一、延时执行一次 3000 表示秒,可根据需求修改 //2秒后执行打印setTimeout(() > {console.log(Timer is end)},3000) 取消延时执行 // 3秒后执行打印 let timerId setTimeout(() > {console.log(Timer is end)},3000)// 取消timerId的延时 clearTimeout(timerId) 二、…

设计师的素材管理神器,eagle、千鹿大测评

前言 专业的设计师都会精心维护自己的个人素材库,常常需要耗费大量时间用于浏览采集、分类标注、预览筛选、分享协作,还要管理字体、图片、音视频等各类设计素材 如果你作为设计师的话,今天,就为大家带来两款热门的素材管理工具…

构建基于数据驱动的应用程序与Llamaindex——理解大型语言模型

如果你在阅读这本书,你可能已经探索过大型语言模型(LLMs)的领域,并且已经认识到它们的潜在应用以及它们的缺陷。本书旨在解决LLMs所面临的挑战,并提供一本实用指南,教你如何使用LlamaIndex构建数据驱动的LL…

57_Redis与Springboot的集合应用

前提 要实现,使用Redis存储登录状态 需要一个完整的前端后端的项目 前端项目搭建 解压脚手架安装依赖配置请求代理选做: 禁用EsLint语法检查 Vue Admin Template关闭eslint校验,lintOnSave:false设置无效解决办法_lintonsave: false-CSDN博客 后端项…

C++和R穿刺针吸活检肿瘤算法模型模拟和进化动力学量化差异模型

🎯要点 🎯模拟肿瘤细胞增生进化轨迹 | 🎯肿瘤生长的随机空间细胞自动机模型 | 🎯模拟穿刺活检的收集空间局部的肿瘤块,模拟针吸活检采集长而薄的组织样本 | 🎯构建不同参数模拟合成肿瘤测试集 | &#x1f…

【TS】TypeScript函数类型:提升函数的类型安全性和可读性

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 TypeScript函数类型:提升函数的类型安全性和可读性1. 引言2. 基本函…

vue3 基于elementui el-table封装 hooks (未使用ts版本)

elementui-table封装 hooks js-hooks import { ref, reactive, onMounted } from vue import { ElMessage, ElMessageBox, ElNotification } from element-plus /*** FileDescription: el-table 函数式组件hooks--实现一个表格的数据加载、分页、搜索、删除和导出等操作,* fu…

tesseract 图片识别引擎

什么是tesseract Tesseract是一款开源的光学字符识别(OCR)引擎,用于从图像中提取文本。它由Ray Smith在惠普实验室于1985年至1995年开发,并在2005年由惠普将其作为开源软件发布。之后,Tesseract的开发由Google主导&am…

如何理解低代码?怎么用好低代码

怎样理解低代码 理解一个概念最好的办法就是找相关概念进行类比,那么想要单独理解低代码这个概念是不太行的。我们还需要了解“零代码”以及“纯代码”开发的概念。那么什么是低代码?其与“零代码”和“纯代码”的关系又是如何? 零代码 也许…