免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

lidR 地面分类终极指南:CSF、MCC、PMF、PTD 四大算法原理与对比

lidR 地面分类终极指南:CSF、MCC、PMF、PTD 四大算法原理与对比 lidR 地面分类终极指南CSF、MCC、PMF、PTD 四大算法原理与对比【免费下载链接】lidRAirborne LiDAR data manipulation and visualisation for forestry application项目地址: https://gitcode.com/gh_mirrors/li/lidRlidR 是专为林业应用打造的机载激光雷达Airborne LiDAR点云处理 R 包而lidR 地面分类正是构建数字高程模型DTM、归一化树高、提取地形因子等一切地形分析的第一步。很多新手面对 CSF、MCC、PMF、PTD 四个算法往往一头雾水。本文用最通俗的语言带你彻底搞懂这四大地面分类算法的原理、参数、适用场景与选型技巧让你一次上手不踩坑。为什么 lidR 地面分类如此重要激光雷达点云中真正属于地面的点只占一小部分其余是植被、建筑、电线等非地面点。地面分类的目的就是把这部分地面点精准地挑出来在 LAS 规范中标记为类别 2随后才能插值生成高精度 DTM 数字高程模型用normalize_height()做高度归一化得到树高CHM为单木分割、森林蓄积量估算等下游分析提供干净的数据底座。可以说地面分类的精度直接决定了整个林业分析链条的上限。lidR 为此内置了 4 种算法全部由classify_ground()这一个入口驱动算法定义集中在R/algorithm-gnd.R入口函数见R/classify_ground.R每个算法的官方文档位于man/目录如man/gnd_csf.Rd、man/gnd_mcc.Rd、man/gnd_pmf.Rd、man/ptd.Rd。认识 classify_ground一个入口四种算法lidR 的用法非常统一你只需要把算法对象传给classify_ground()即可例如classify_ground(las, csf())。函数默认只使用**末次回波last returns**参与计算因为末次回波更可能来自地面如果你已经做过噪声分类还可以关闭该选项。另外如果点云里已经存在地面点类别 2函数会自动将它们重置为未分类再重新计算避免新旧结果叠加。 提示classify_ground()同样支持LAScatalog对象可以分块、多核处理海量瓦片数据不需要额外写循环。CSF 布料模拟滤波给地形盖一块布 CSFCloth Simulation Filter布料模拟滤波是 2016 年提出的算法将倒置后的点云铺上一块虚拟布料利用布料在重力下自然贴合地形的过程来识别地面。植被等非地面点位于布料之下而地面点会托起布料最终以布料为基准距离布料小于阈值class_threshold默认 0.5的点即被判定为地面。它的核心参数包括rigidness布料硬度1 适合起伏崎岖地形2 中等3 适合平坦地形cloth_resolution布料颗粒间距通常设为点云平均点距sloop_smooth陡坡地形建议设为TRUE可减少陡坡处的误判iterations、time_step布料模拟的迭代次数与时间步长一般保持默认。适用场景CSF 对复杂地形和陡坡的适应性最强参数有合理的默认值是最适合新手起步的算法其实现依赖RCSF包。MCC 多尺度曲率分类用曲率切开地面 MCCMultiscale Curvature Classification多尺度曲率分类源自 2007 年 Evans Hudak 的经典论文通过曲率阈值区分地面与植被地面点所在表面的曲率变化平缓而植被边缘曲率变化剧烈多尺度扫描 曲率阈值即可完成切割。它只有两个核心参数s尺度与点云的点距post spacing和地物尺度相关通常从点距开始尝试比如点距 1.5 m 就先试mcc(1.5, ...)t曲率阈值米制数据可从 0.3 起步英尺制数据可从 1 起步然后以 0.1 的步长微调。适用场景MCC 在森林环境中表现出色尤其适合点密度适中、树木尺度变化大的林区数据但实现依赖RMCC包参数需要一定调优经验。PMF 渐进式形态学滤波窗口越扫越大的清洁工 PMFProgressive Morphological Filter渐进式形态学滤波源于 2003 年 Zhang 等人的论文用不断增大的窗口对点云做形态学开运算逐步抹掉非地面地物窗口小的时候只清理小灌木窗口越来越大最终把整棵树、整栋楼都过滤掉剩下的就是地面。PMF 没有默认参数你必须手动给出两组序列ws窗口大小序列如ws seq(3, 12, 3)th对应的高程差阈值序列需与ws等长且递增。lidR 还提供了util_makeZhangParam()工具函数R/algorithm-gnd.R可依据论文中的公式式 4、5、7自动生成合理的ws/th序列只需指定b、dh0、dhmax、max_ws等参数即可。适用场景PMF 对相对平坦的区域如城市、平缓林地效果稳定且算法完全内置、无需额外 R 包但陡峭山区需要小心调参。PTD 渐进式 TIN 加密让三角网从地面长上来 PTDProgressive TIN Densification渐进式 TIN 加密源自 2000 年 Axelsson 的经典方法lidR 提供的是改进版实现。它的思路是先在地面网格中选取最低点作为种子点构建初始三角网TIN然后迭代地把满足角度与距离约束的点吸收进三角网使地形表面不断逼近真实地面。核心参数有四个res种子点网格分辨率森林场景 10 m 即可城区存在建筑桥梁建议加大到 50 mangle迭代角平缓地形用 20 左右山地可提高到 40distance迭代距离限制模型向上跳跃的幅度防止把低矮植被或小建筑误判为地面spacing当三角网边长小于该值时停止加密避免过度细化。PTD 对低噪声点具有天然的鲁棒性其内核由 C 实现见src/C_ptd.cpp、src/ptd/计算效率很高在森林与山地场景中表现均衡是很多林业项目的首选。CSF vs MCC vs PMF vs PTD四大算法对比一览表算法原理一句话最佳场景调参难度依赖CSF倒置点云 布料模拟贴合地形复杂地形、陡坡、新手友好⭐ 低默认参数可用RCSFMCC多尺度曲率阈值切割森林、中低密度点云⭐⭐⭐ 需经验调参RMCCPMF渐进式形态学滤波平坦区域、城市建筑⭐⭐ 需给出序列内置PTD渐进式 TIN 加密迭代生长森林山地、对噪声鲁棒⭐⭐ 参数直观内置C场景化选型建议你的地形适合哪个算法第一次做地面分类 / 想快速出结果直接上csf()默认参数即可获得不错的效果陡坡、悬崖、地形剧烈起伏用csf(sloop_smooth TRUE)或ptd(res 20, angle 40)城市建筑区、相对平坦的样地pmf()配合util_makeZhangParam()生成的序列或者csf(rigidness 3)茂密森林、点密度中等偏低的林区mcc()往往能给出更干净的地面大范围生产、追求效率与稳定性ptd()的 C 内核性能出色配合LAScatalog多核处理十分顺手。快速上手lidR 地面分类完整流程示例lidR 内置了示例数据Topography.laz位于inst/extdata/几行代码就能跑通完整流程library(lidR) las - readLAS(system.file(extdata, Topography.laz, package lidR)) # 选择一种地面分类算法 las - classify_ground(las, csf()) # 布料模拟 # las - classify_ground(las, ptd(res 20, angle 20, distance 1)) # TIN 加密 # 生成 DTM 并归一化高度 dtm - rasterize_terrain(las, 1, tin()) las - normalize_height(las, dtm)对开发者来说源码可直接克隆到本地阅读学习git clone https://gitcode.com/gh_mirrors/li/lidR新手避坑lidR 地面分类常见问题 ⚠️参数单位必须与点云一致MCC 的s、tPMF 的ws、th都要与数据单位米或英尺保持一致混用会导致结果完全错误注意回波信息缺失classify_ground()默认只用末次回波若点云缺少ReturnNumber、NumberOfReturns字段会给出警告并退化为使用全部点已有地面点会被重置如果数据中已有类别 2 的点函数会先将其置为未分类再重新计算控制台会打印提示属正常行为先做噪声分类效果更好PTD 对低噪声鲁棒但提前用classify_noise()清理噪声点能让各算法的结果都更干净大区域务必用 LAScatalog直接读入整片区域可能内存不足改用readLAScatalog()让引擎自动分块、加缓冲并多核并行。小结lidR 地面分类提供了风格迥异的四种算法CSF 通用易用、MCC 擅长森林、PMF 适合平缓地形、PTD 稳健高效。没有最好的算法只有最适合你的数据与场景的算法。建议先用示例数据分别跑一遍四种算法用plot(las, color Classification)可视化对比效果再根据地形复杂度与生产需求选定主算法。掌握本文的选型思路你的林业点云分析之路就已经成功了一大半【免费下载链接】lidRAirborne LiDAR data manipulation and visualisation for forestry application项目地址: https://gitcode.com/gh_mirrors/li/lidR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表