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三维离散点云的邻域点搜索(柱状邻域、球状邻域及KNN)_第1张图片

Matlab三维离散点云的邻域点搜索(柱状邻域、球状邻域及KNN)_第2张图片

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

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

getpointsXYZ.rar

相关文章见:

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

你可能感兴趣的:(点云数据处理,matlab,可视化)