Matlab点云处理及可视化第1期—基于KD树的邻域点搜索(柱状邻域、球状邻域及KNN)

news2025/8/2 19:39:42

目录

1 概述

2 代码实现

3 可视化验证

数据及完整代码获取方式:


观前提示:本文文字内容请勿直接用于论文写作,否则后果自负

特别提示:《Matlab点云处理及可视化》系列文章旨在为初入点云处理领域的朋友提供一份较为权威、可直接用于论文写作的Matlab点云数据处理教程。所有代码均未做加密处理,部分进阶内容会有一定获取门槛,介意请直接划走。

先来看一下最终可视化结果

1 概述

点云数据具有离散无规则性、盲目性、海量性,因此有必要建立有效的点云数据索引,一方面可提高海量点云数据的处理效率,另一方面,通过结合不同的查询方式(邻域搜索方法)和计算方法,可以为后续去噪、滤波、分类等多种数据处理提供多元化的点云特征(如法向量、曲率、坡度、类别等)。

K-D树(K-Dimension tree)是一种常用的点云数据索引方法。K-D树是一种特殊的二元空间分割树(Binary Space Partitioning trees, BSP trees),其所用分割平面需要与某一坐标轴垂直,而BSP树所用分割平面可以是任意方向的。

点云数据的邻域搜索方法主要包括固定距离(Fixed Distance Neighbors, FDN)与K最邻近(K-Nearest Neighbor, KNN)两种类型。

固定距离搜索首先设定距离阈值,通过计算当前点与待定点之间的距离,将距离小于距离阈值的所有待定点视为当前点的FDN点。常用的固定距离邻域搜索方式包括柱状邻域与球状邻域。其中,柱状邻域通过计算当前点与待定点之间的平面距离,将距离小于预设半径的所有待定点视为当前点的柱状邻域点;而球状邻域通过计算当前点与待定点之间的三维空间距离,将距离小于预设半径的所有待定点视为当前点的球状邻域点。

K最邻近搜索首先确定邻域点个数K,然后计算当前点与待定点之间的距离,并将待定点按距离大小进行排序,将距离最小的K个待定点视为当前点的KNN点。

2 代码实现

function [idx,dist] = nbselect(data,part,varargin)% 功能:构建K-D树,选择不同邻域类型,返回邻域点索引与距离% 输入:data     - 原始数据(M*3)    %       part     - 待检索数据(N*3)%       varargin - 球状、柱状邻域或KNN+半径或个数%       'Q'  - 球状邻域%       'Z'  - 柱状邻域%       'K'  - KNN % 输出:idx  - 邻域点索引 %       dist - 距离% example:[sph,dist_sph] =  nbselect(data,part,'Q',r_Q);if varargin{1} == 'Q'    r_Q = varargin{2};    [idx,dist] = rangesearch(data(:,1:3),part(:,1:3),r_Q,'Distance','euclidean','NSMethod','kdtree');      elseif varargin{1} == 'Z'    r_Z = varargin{2};    [idx,dist] = rangesearch(data(:,1:2),part(:,1:2),r_Z,'Distance','euclidean','NSMethod','kdtree');  elseif varargin{1} == 'K'    k = varargin{2};    [idx,dist] = knnsearch(data(:,1:3),part(:,1:3),'Distance','euclidean','NSMethod','kdtree','K',k);  endend

3 可视化验证

为了检测三种邻域点的搜索效果,采用ISPRS提供的LiDAR点云数据(房屋屋顶)进行验证

%% 数据准备% 读取数据data = load('Vaihingen_building1.txt');% 参数设置k = 15;  % KNN邻近点个数r_Z = 3; % 柱状邻域半径r_Q = 3; % 球状邻域半径% 待搜索点确定% 在图上用游标选点,按任意键结束,得到游标点的坐标pos% figure_handle = figure;% scatter3(data(:,1),data(:,2),data(:,3),15,'k','filled');% pos = GetPOS(figure_handle,1); % closepos = [497336.899993900  5419701.40999997  282];%% 邻域点搜索% 以pos为中心,确定三种邻域内邻域点索引[Q,dist_Q] =  nbselect(data,pos,'Q',r_Q);[Z,dist_Z] =  nbselect(data,pos,'Z',r_Z);[knn,dist_knn] =  nbselect(data,pos,'K',k);% 确定三种邻域下邻域点坐标Pz = data(Z{1,1},1:3);Pq = data(Q{1,1},1:3);Pk = data(knn,1:3);%% 可视化验证% 窗口尺寸设置(单位:厘米)figureUnits = 'centimeters';figureWidth = 18;figureHeight = 20;figureHandle = figure;set(gcf, 'Units', figureUnits, 'Position', [0 0 figureWidth figureHeight]);hold on% 散点图绘制l1 = scatter3(data(:,1),data(:,2),data(:,3),15);% 原始点云l2 = scatter3(Pz(:,1),Pz(:,2),Pz(:,3),30);% 柱状邻域点l3 = scatter3(Pq(:,1),Pq(:,2),Pq(:,3),20);% 球状邻域点    l4 = scatter3(Pk(:,1),Pk(:,2),Pk(:,3),15);% KNN点  l5 = scatter3(pos(:,1),pos(:,2),pos(:,3),20);% 待搜索点hTitle = title('Neighborhood points selection');hXLabel = xlabel('XAxis');hYLabel = ylabel('YAxis');hZLabel = zlabel('ZAxis');% 细节优化axis equal tightset(l1,'Marker','o','MarkerFaceColor',C1,'MarkerEdgeColor',C1)set(l2,'Marker','o','MarkerFaceColor',C2,'MarkerEdgeColor',C2)set(l3,'Marker','^','MarkerFaceColor',C3,'MarkerEdgeColor',C3)set(l4,'Marker','+','MarkerFaceColor',C4,'MarkerEdgeColor',C4)set(l5,'Marker','s','MarkerFaceColor',C5,'MarkerEdgeColor',C5)view(-27.5,46.9);% 视角set(gca, 'Box', 'on', ...                                    % 边框         'XGrid','on','YGrid','on','ZGrid','on', ...         % 网格         'TickDir', 'out', 'TickLength', [0.01 0.01], ...    % 刻度         'XMinorTick', 'off', 'YMinorTick', 'off', ...       % 小刻度         'XColor', [.1 .1 .1],  'YColor', [.1 .1 .1])        % 坐标轴颜色hLegend = legend([l1,l2,l3,l4,l5], ...                 '原始点云', '柱状邻域', '球状邻域', 'KNN','当前点'); P = hLegend.Position;hLegend.Position = P + [-0.05 -0.05 0 0];% 字体和字号set(gca, 'FontName', 'Arial', 'FontSize', 10)set([hXLabel, hYLabel, hZLabel], 'FontName', 'Arial','FontSize', 11)set(hLegend, 'FontName', '微软雅黑', 'FontSize', 11)set(hTitle, 'FontName', 'Arial', 'FontSize', 12, 'FontWeight' , 'bold')% 背景颜色set(gcf,'Color',[1 1 1])% 图片输出print('test.png','-r300','-dpng')

其中,为了区分不同邻域点对象,从Matlab配色神器TheColor的XKCD颜色库中选择5种对比色

% 颜色定义C = TheColor('xkcd',[914 207 520 914 546]);C1 = C(1,1:3);C2 = C(2,1:3);C3 = C(3,1:3);C4 = C(4,1:3);C5 = C(5,1:3);

最终结果如下:

大家可以比较一下三种邻域搜索方法之间的差异。

以上。

数据及完整代码获取方式:

Matlab邻域点搜索icon-default.png?t=M85Bhttps://mp.weixin.qq.com/s/J3jYySwL6BUrBxAdCSjldQ

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

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

相关文章

MR直播(混合现实直播)做一场高品质企业培训

阿酷TONY / 2022-11-18 / 长沙 MR,是英文Mixed Reality两个单词的缩写,中文翻译为混合现实。 MR混合现实直播技术是通过在现实环境中引入虚拟场景信息,增强用户体验的真实感,具有真实性、实时互动性等特点。 MR直播解决方案是深…

基于springboot农产品交易平台的设计与实现

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于特色农产品电商平台 当然也不能排除在外,随着网络技术的不断成熟,带动了特色农产品电商平台,它彻底…

软件需求分析——需求的理论基础

如果有兴趣了解更多相关内容,可以来我的个人网站看看:瞳孔空间 一:需求的涵义 研究对象:软件加强型系统中的软件 软件加强型系统:泛指由计算机技术支持的互相联系着的一组人类活动组成的系统。与物理设备和人类社会…

linux网络协议栈源码分析 - 传输层(TCP的输出)

1、TCP write系统调用(tcp_sendmsg) 1.1、write系统调用 socket的write系统调用栈: write最终调用tcp_sendmsg发送消息。 1.2、tcp_sendmsg报文分段 tcp_sendmsg主要是对用户的消息按MSS进行分段、添加到发送队列并将用户数据拷贝到分段里面,根据相关判断设置PSH标…

[附源码]SSM计算机毕业设计超市收银系统论文JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

学生台灯是灯管的好还是led的好?分享学生专用台灯第一品牌

给学生使用的话肯定是led灯更好的,主要是对眼睛有保护作用的,灯管一般当做主要照明灯具是可以的,在家中客厅里,卧室就是灯管,使用led灯是想要补足亮度的,全光谱的国AA级台灯,更健康、更适应人类…

计算机网络---ARP、DHCP与ICMP

(一)IP 地址与硬件地址 IP地址是网络层使用的地址,它是分层次等级的。硬件地址是数据链路层使用的地址(MAC地址),它是平面式的。在网络层及网络层之上使用IP地址,IP地址放在IP数据报的首部&…

并肩刘德华,对战周杰伦,腾格尔老师线上演唱会即将拉开帷幕

在刚刚结束的第三十五届金鸡奖上面,著名爱国艺人刘德华,又一次出现在大众的视野当中。来自香港的天王刘德华,是一个著名的音乐人和演员,他拳拳的爱国之情,也感动了无数的粉丝。 刘德华作为中国华语乐坛的中坚力量&…

22071班(11月18日)

1.在串口工具进行输入: echo 1 > /dev/myled0 ---->led1灯点亮 echo 0 > /dev/myled0 ---->led1灯熄灭 echo 1 > /dev/myled1 ---->led1灯点亮 echo 0 > /dev/myled1 ---->led1灯熄灭 echo 1 > /dev/myled2 ----…

【附源码】计算机毕业设计JAVA校园跑腿平台

【附源码】计算机毕业设计JAVA校园跑腿平台 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…

什么是PaaS平台

PaaS平台概述 PaaS平台通常是基于IaaS平台构建的,PaaS平台和IaaS平台最大的差别是需求即服务。所有的管理都是以服务为粒度的,在IaaS以资源管理为中心的平台上提供了更高层次的抽象。 PaaS的本质 (1)运维自动化,故障…

统计聚类法的基本步骤:

统计聚类法的基本步骤: 1>形成数据框 2>计算距离阵 计算n个样品两两间的距离D。 3>进行系统聚类 (I)构造n个类,每个类只包含一个样品; (2)合并距离最近的两类为一新类; (3)计算新类与当前各类的距离,若类个数为1,…

观测云产品更新|Pipeline 使用体验优化;支持写入用户的自定义事件;自定义查看器支持选择更多类型的数据等

观测云更新 Pipeline 使用体验优化 Pipeline 支持过滤条件配置多选 支持将任意一个 Pipeline 脚本设置为“默认 Pipeline 脚本“,若当前数据类型在匹配 Pipeline 处理的时候,未匹配到其他的 Pipeline 脚本,则数据会按照默认 Pipeline 脚本的…

vs2017编译的64位libssh2库

需求:使用sftp上传下载文件 环境:windows vs2017 参考 链接: link 链接: link 编译 环境准备 libssh2依赖于openssl和zlib,所以需要有所以需要先编译:openssl和zlib才行。openssl和zlib。openssl和zlib我是下载人家编译好的…

【MySQL基础】数据库系统之关系型数据库与非关系型数据库

目录 一、数据库系统 1. 数据库 2. 数据库应用 3. 数据库管理系统(数据库软件) 3.1关系型数据库【RDBMS】 3.2非关系型数据库【NoSQL】 4. SQL和数据库管理系统的关系 5. 关系型数据库管理系统的组成 💟 创作不易,不妨点…

DIY CY7C68013A模块为逻辑分析仪

DIY CY7C68013A模块为逻辑分析仪摘要工具软件步骤参考资料:摘要 将淘宝购买的CY7C68013A模块修改为8通道逻辑分析仪。 购买的CY7C68013A模块如下: 工具软件 Zadig:用于安装逻辑分析仪驱动。 PulseView:Sigrok逻辑分析仪应用软…

Python面向对象2-继承-

文章目录目标一. 继承的概念二. 单继承三. 多继承 [python又支持多继承了]四. 子类重写父类同名方法和属性 #TODO目标 继承的概念单继承多继承子类重写父类的同名属性和方法子类调用父类的同名属性和方法多层继承super()私有属性和私有方法 一. 继承的概念 生活中的继承&…

实验(三):单片机I/O口实验-模拟开关灯

一、实验目的与任务 实验目的: 1.掌握单片机I/O口输入输出使用; 2.掌握单片机I/O口位操作的编程。 任务: 1.根据要求编写程序,并写出原理性注释; 2. 检查程序运行的结果,分析一下是…

VLAN和VLAN间路由

VLAN和VLAN间路由一 交换机二 vlan2.1 华为交换机的特性2.2 access接口2.2.1 在华为交换机上配置access接口2.2.2 access接口接收到报文的处理流程(打vlan tag)2.2.3 access接口发送报文的处理流程(剥离\弹出vlan tag)![在这里插入…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——权限控制

引入依赖 将登录检查拦截器删除掉 授权 首先显示路径 除了这些请求,其他的请求统统允许。 当权限不够处理的时候 返回XML是异步请求 添加denied的路径 获取用户权限的方法 将结果存入到集合中,实例化一个集合 获得用户权限,并把…