Matlab三维离散点云的邻域点搜索(柱状邻域、球状邻域及KNN)

在计算三维点云的法向量、曲率、坡度等间接特征时,需要搜索点的邻域点。

某点邻域的选取多依据空间几何信息,从空间维数分为二维邻域和三维邻域,对应的有柱状邻域和球状邻域。

同时,邻域的选取可以通过限制邻近点的个数(KNN)或者限制邻域范围(柱状邻域和球状邻域)来实现。

柱状邻域点指以一点为中心,以r为半径的无限高、垂直圆柱范围内的点。

球状邻域点指以一点为中心,以r为半径的球体内所包含的点。

KNN指与一点最邻近的K个点。

具体代码如下:

function [idx,dist] = nbselect(data,part,varargin)
% 功能:选择不同邻域类型,返回邻域索引与距离
% 输入:data - 原始数据    part - 待检索数据
%       varargin - 球状、柱状邻域或KNN+半径或个数
%      ‘sph’ - 球状邻域
%      ‘cyl’ - 柱状邻域
%       ‘K’  - KNN 
% 输出:idx - 邻域索引 dist - 距离
% example: [sph,dist_sph] =  nbselect(data,part,'sph',r_sph);
if varargin{1} == 'sph'
    r_sph = varargin{2};
    [idx,dist] = rangesearch(data(:,1:3),part(:,1:3),r_sph,'Distance','euclidean','NSMethod','kdtree');      
elseif varargin{1} == 'cyl'
    r_cyl = varargin{2};
    [idx,dist] = rangesearch(data(:,1:2),part(:,1:2),r_cyl,'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);  
end
end

为了检测邻域点获取的效果,通过一块ISPRS的LiDAR点云数据进行验证,结果如下:

懒得自己动手的朋友,测试数据与示例代码见:

Matlab建立KD树搜索三维点云的邻近点(柱状邻域、球状邻域与KNN)

getpointsXYZ.rar

相关文章见:

利用Matlab鼠标单击拾取三维点云可视化图像figure中的单个或多个点坐标信息

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值