Progressive Morphological Filtering(渐进式形态学滤波) 是一种用于从机载LiDAR(激光雷达)数据中分离地面点与非地面点的滤波算法。该算法通过逐步增大滤波窗口尺寸,并结合高程差阈值,能够有效去除建筑物、车辆、植被等非地面点,同时保留地形特征,生成高精度的数字地形模型(DTM)或数字高程模型(DEM)。
1. 算法背景
机载LiDAR技术能够快速、低成本地获取大范围的高精度地形数据。然而,LiDAR点云中不仅包含地面点,还包含建筑物、车辆、植被等非地面点。为了生成高精度的DTM/DEM,需要将这些非地面点从点云中分离出来。Progressive Morphological Filtering 正是为解决这一问题而设计的。
2. 核心原理
2.1 形态学滤波基础
形态学滤波基于数学形态学中的**膨胀(Dilation)和腐蚀(Erosion)**操作:
- 膨胀:在窗口内选择最大高程值,用于扩大地物特征。
- 腐蚀:在窗口内选择最小高程值,用于缩小地物特征。
- 开操作:先腐蚀后膨胀,用于去除细小地物(如树木)并保留大型地物(如建筑物)。
2.2 渐进式滤波
传统形态学滤波使用固定窗口尺寸,难以同时处理不同尺寸的地物(如小汽车和大型建筑物)。渐进式形态学滤波通过逐步增大窗口尺寸来解决这一问题:
- 初始窗口:使用较小的窗口去除细小地物(如树木、汽车)。
- 逐步增大窗口:随着窗口尺寸增大,逐步去除更大的地物(如建筑物)。
- 高程差阈值:引入高程差阈值,区分地面点与非地面点。地面点的高程变化是渐变的,而非地面点(如建筑物屋顶)的高程变化是突变的。
3. 算法流程
- 点云划分:将不规则点云划分为规则网格,每个网格中选择高程最低点作为初始地面点。
- 迭代滤波:
- 使用初始窗口尺寸进行形态学开操作,去除细小地物。
- 逐步增大窗口尺寸,重复开操作,去除更大尺寸的地物。
- 根据高程差阈值判断地面点与非地面点。
- 参数调整:
- 窗口尺寸:可通过线性或指数增长方式调整。
- 高程差阈值:根据地形坡度和地物高度动态调整。
- 输出结果:生成地面点云和非地面点云,用于后续的DTM/DEM生成。
4. 参数设置
- 窗口尺寸:决定滤波的粒度,过小会保留过多非地面点,过大会丢失地形细节。
- 高程差阈值:用于区分地面点与非地面点,通常根据地形坡度和地物高度设置。
- 坡度:影响高程差阈值的计算,坡度越大,阈值越高。
5. 应用与优化
- 应用场景:广泛应用于地形建模、洪水模拟、滑坡预测等领域。
- 优化方法:
- 多线程加速:如PCL库中的
ApproximateProgressiveMorphologicalFilter
,通过多线程提高计算效率。 - 参数调优:根据具体场景调整窗口尺寸和高程差阈值,以获得最佳滤波效果。
- 多线程加速:如PCL库中的
6. 代码示例
以下是PCL库中Progressive Morphological Filtering的简单实现,代码读取点云数据,应用渐进式形态学滤波,并输出地面点云。
- 读取PCD文件:使用
pcl::PCDReader
读取点云数据。 - 应用渐进形态滤波器:使用
pcl::ProgressiveMorphologicalFilter
提取地面点。 - 提取地面点并保存:通过
pcl::ExtractIndices
从原始点云中提取地面点并保存到一个新的 PCD 文件。 - 提取非地面点并保存:通过设置
setNegative(true)
,提取非地面点并保存到另一个新的 PCD 文件。
创建bare_earth.cpp
#include <iostream>
#include <pcl/io/pcd_io.h> // 用于读取和写入PCD文件
#include <pcl/point_types.h> // 用于点云数据类型