在计算三维点云的法向量、曲率、坡度等间接特征时,需要搜索点的邻域点。
某点邻域的选取多依据空间几何信息,从空间维数分为二维邻域和三维邻域,对应的有柱状邻域和球状邻域。
同时,邻域的选取可以通过限制邻近点的个数(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中的单个或多个点坐标信息