1、格网(体素)化原理
点云格网化组织可以分为二维格网化与三维体素,其主要根据不同应用场景进行分类。其中二维格网化主要用于机载LiDAR采集的点云数据,该类数据主要从俯视的角度采集的数据,因此采用二维格网对数据进行组织比较合适,过程类似规则的影像数据,将点投影在XOY平面上。点云体素化(voxel)在车载、地面三维激光上应用较为广泛,因为在三维空间分布离散,且无论投影在任意一个面上都不合理,如XOY不可取,存在大量的重叠点,因此一般采用体素化对其进行组织。
二维格网 三维体素
无论是点云格网化处理还是体素化处理,都属于数据的预处理,后续的很多数据处理,如分割、分类等,都是在点云格网化(体素化)基础上进行的,因此有必要理解这两种原理。
1.1二维格网化(机载LiDAR点云)
首先统计点云数据的X、Y坐标值的最大值与最小值,分别为Xmin、Xmax、Ymin、Ymax。根据划分的格网尺寸L再确定行号格网的总的行号与列号:
行号=ceil(Xmax-Xmin)/L
列号=ceil(Ymax-Ymin)/L
Ceil为向上取整函数,对于每个点P(x,y,z),依据其x、y坐标将该点划入到相应的格网内即可。P点的格网号为:
行号=ceil(x-Xmin)
列号=ceil(y-Ymin)
****需要注意的是,为了防止出现越界,需要将Xmin、Xmax、Ymin、Ymax适当的向外扩,如
Xmin=Xmin-L
Xmax=Xmax+L
Ymin=Ymin-L
Ymax=Ymax+L
(这些都是些小技巧,不然在后续应用中可能出现内存溢出,或者越界的情况)
1.2 三维体素化(车载、地面激光点云)
其过程与二维格网类似,只是多了一个Z轴的划分。具体步骤如下:首先统计点云数据的X、Y、Z坐标值的最大值与最小值,分别为Xmin、Xmax、Ymin、Ymax、Zmin、Zmax。根据划分的格网尺寸L再确定行号格网的总的行号、列号、层号:
行号=ceil((Xmax-Xmin)/L)
列号=ceil((Ymax-Ymin)/L)
层号=ceil((Zmax-Zmin)/L)
Ceil为向上取整符号,对于每个点P(x,y,z),依据其x、y、z坐标将该点划入到相应的格网内。P点的行号、列号、层号:
行号=ceil((x-Xmin)/L)
列号=ceil((y-Ymin)/L)
层号=ceil((z-Zmin)/L)
****同样需要注意的是,为了防止出现越界,需要将Xmin、Xmax、Ymin、Ymax、Zmin、Zmax适当的向外扩,如
Xmin=Xmin-L
Xmax=Xmax+L
Ymin=Ymin-L
Ymax=Ymax+L
Zmin=Zmin-L
Zmax=Zmax+L
基于C++编写的源码,下载链接如下:
机载点云格网化、车载与地基点云体素化-算法与数据结构文档类资源-CSDN下载
2. 效果如下:
机载点云的二维格网化效果图如下:
较大格网尺度
较小格网尺度
局部放大图
地基点云在不同尺度下的三维体素化结果:
需要注意的是,这仅仅对数据进行组织,同一格网内点没有必然的属性,需要按照自己的要求做进一步处理。