4、点云数据获取与预处理:无人机载LiDAR点云采集流程、点云去噪、滤波、下采样
各位同学,咱们今天聊聊点云数据。说实话,我刚入行那会儿,觉得点云就是一堆密密麻麻的点,没啥好看的。直到第一次用无人机载LiDAR去飞一片丘陵地带的果园,回来一看数据——好家伙,满屏的噪点,树冠和地面糊成一团。那一刻我才明白,点云这东西,采集是基础,预处理才是真正的技术活。
你想想看,无人机在天上飞,激光雷达往下打,地面上的草、树、电线杆、甚至飞过的鸟,都会被记录下来。如果不做处理,这些数据根本没法用。所以今天这一讲,咱们就掰开揉碎了讲清楚:点云怎么采,采回来怎么洗,洗完怎么用。
4.1 无人机载LiDAR点云采集流程
先说采集。我个人的习惯是,起飞前先花半小时做航线规划。别小看这一步,规划得好,后面省一半力气。
第一步:确定任务区域与飞行参数
你得先知道你要飞多大面积。比如一块50亩的梯田,地形起伏大,那飞行高度就不能太高。我一般建议:
- 飞行高度:相对地面50-80米。太高了,点云密度不够;太低了,效率低还容易撞山。
- 航向重叠率:60%-70%。这个值决定了点云在飞行方向上的重叠程度。
- 旁向重叠率:30%-40%。保证相邻航线之间的数据能拼接上。
- 飞行速度:5-8米/秒。太快了,点云会拉长变形。
第二步:设备检查与校准
嗯,这里要注意。LiDAR系统里有个IMU(惯性测量单元),它记录飞机的姿态。如果IMU没校准好,点云会整体漂移。我曾经有一次,飞完回来发现点云和RTK基站差了2米,查了半天,原来是IMU的温漂没补偿。所以起飞前,一定要做静态初始化——让飞机在地上静止3-5分钟,让IMU稳定下来。
第三步:执行飞行与数据采集
飞的时候,我习惯盯着地面控制站的实时点云预览。如果发现某条航线的点云密度突然变稀,那可能是激光雷达的扫描角度偏了,或者飞机颠簸太大。这时候我会果断中断航线,重新调整。
第四步:数据导出与初步检查
落地后,把SD卡拔出来,用配套软件把原始数据转成LAS格式。然后打开看一眼——点云有没有空洞?有没有明显的跳变?如果有,那可能得补飞一条航线。
4.2 点云去噪
点云采回来了,接下来就是去噪。说白了,就是把那些不属于地面的“脏东西”去掉。比如飞过的鸟、飘落的树叶、甚至无人机自身的旋翼反射。
常见的噪点类型:
- 孤立噪点:离群点,周围没有其他点。比如一只鸟飞过,只留下一个点。
- 低密度噪点:某个区域点特别稀疏,可能是激光打到水面或玻璃上,反射信号弱。
- 高反射噪点:比如金属电线杆,反射太强,导致点云出现“拖尾”现象。
去噪的方法,我一般分两步走:
第一步:手动粗筛。用点云软件(比如CloudCompare)打开数据,肉眼扫一遍。看到明显飞在天上的孤立点,直接框选删除。这一步虽然笨,但很有效。
第二步:自动去噪。用算法批量处理。常用的有统计滤波和半径滤波,咱们下面细讲。
4.3 滤波:统计滤波与半径滤波
滤波,是点云预处理的核心。你想想看,点云里每个点都有三维坐标,但有些点位置不对,比如因为激光打到树叶边缘,反射回来的点位置偏了。滤波就是把这些“坏点”揪出来。
4.3.1 统计滤波
统计滤波的原理很简单:计算每个点周围K个邻居的平均距离。如果某个点离它的邻居太远,那它大概率是个噪点。
举个例子,我设置K=10,然后计算每个点到它最近10个点的平均距离。如果这个平均距离超过了全局平均距离的3倍(这个倍数叫标准差倍数),我就把它删掉。
代码示例(Python + Open3D):
import open3d as o3d
# 读取点云
pcd = o3d.io.read_point_cloud("raw_cloud.ply")
# 统计滤波
cl, ind = pcd.remove_statistical_outlier(
nb_neighbors=10, # 邻居点数
std_ratio=2.0 # 标准差倍数
)
# 保存滤波后的点云
o3d.io.write_point_cloud("filtered_cloud.ply", cl)
我在项目中遇到过一个问题:如果地形起伏很大(比如梯田),统计滤波会把陡坡上的点也当成噪点删掉。为什么?因为陡坡上的点,邻居距离本来就大。所以后来我学乖了,先做一次粗略的地面分割,只对非地面点做统计滤波。
4.3.2 半径滤波
半径滤波更直接:以每个点为中心,画一个半径为R的球。如果球内的点数少于某个阈值,就删掉这个点。
比如我设置半径R=0.5米,阈值=5。意思是:如果一个点周围0.5米内少于5个点,那它就是个孤立点,删掉。
代码示例:
# 半径滤波
cl, ind = pcd.remove_radius_outlier(
nb_points=5, # 最少点数
radius=0.5 # 搜索半径(米)
)
半径滤波的好处是参数直观,容易调。坏处是如果点云密度不均匀,那密度低的区域(比如树冠边缘)容易被误删。我建议先用统计滤波去噪,再用半径滤波做精细清理。
4.4 下采样
下采样,说白了就是让点云变“瘦”。你想想看,一块10亩的地,点云可能有上亿个点。这么多点,处理起来电脑都卡。而且很多点是冗余的——比如平坦的地面,每平方米有100个点和有10个点,效果差不多。
常用的下采样方法:
- 体素滤波:把空间划分成小立方体(体素),每个体素里只保留一个点(通常是重心点)。这是最常用的方法。
- 随机采样:随机删除一定比例的点。简单粗暴,但可能丢失细节。
- 均匀采样:按固定间隔取点,保证点云分布均匀。
我个人最推荐体素滤波。为什么?因为它能保持点云的几何结构。比如一个斜坡,体素滤波后,斜坡的形状还在;而随机采样可能会把斜坡上的关键点删掉。
代码示例(体素滤波):
# 体素下采样
voxel_size = 0.1 # 体素边长(米)
down_pcd = pcd.voxel_down_sample(voxel_size)
# 看看下采样前后的点数
print(f"原始点数: {len(pcd.points)}")
print(f"下采样后点数: {len(down_pcd.points)}")
体素大小的选择很关键。我一般这样定:
| 应用场景 | 推荐体素大小 | 说明 |
|---|---|---|
| 精细地形建模 | 0.05 - 0.1米 | 保留田埂、沟渠等细节 |
| 大范围地形分析 | 0.2 - 0.5米 | 适合平原、缓坡 |
| 快速预览 | 1.0米以上 | 只用来看看大概地形 |
嗯,这里要提醒一句:下采样不是越少越好。我见过有人为了省事,直接把体素设成1米,结果点云变成了一堆方块,地形细节全没了。所以下采样的度,得根据你的后续需求来定。
好了,点云获取和预处理就讲到这里。下一讲咱们聊聊怎么从点云里提取地面点,生成数字高程模型(DEM)。到时候你会发现,前面这些去噪、滤波、下采样的功夫,全都没白费。