怡心湖

CSF 滤波算法如何从 DSM 中提取 DTM(去除植被/建筑)

CSF(Cloth Simulation Filtering,布料模拟滤波)是从 DSM(数字表面模型)中提取 DTM(数字地形模型)、去除植被/建筑最经典且实战中最常用的方法,尤其适合处理无人机航拍生成的点云或栅格 DEM。它的核心思想是用一块"柔性的虚拟布"从上往下罩住地表,布被物体顶起后贴合到的下表面即为真实地表面(裸土)

下面按原理 → 算法步骤 → 参数调优 → 俄乌战场实战注意来讲。


一、核心物理类比

  • DSM(输入):包含地面 + 植被冠层 + 屋顶的点云/栅栅格,像一座座"凸起物"。

  • 布料(Cloth):想象一块有弹性的薄布,初始水平悬置在 DSM 最高点上方。

  • 重力沉降:让布在重力作用下下落,碰到非地面物体(树、房)时被顶住形成凹陷,布的下表面最终贴合到的连续最低支撑面就是裸土地形(DTM)

  • 刚性粒子网格:算法中用离散质点网格(弹簧-质点系统)近似模拟布料。


二、CSF 算法详细步骤

假设输入为 DSM 点云 P={(xi​,yi​,zi​)},栅格化或散点均可。

Step 1:预处理与包围盒

  • 计算点云 XY 包围盒,确定布料网格大小(通常栅格分辨率 = DSM 分辨率,如 0.5m 或 1m)。

  • 设定布料初始高度 Hcloth​=max(zi​)+margin(高于最高地物)。

Step 2:初始化布料质点网格

  • 在 XY 平面建规则网格,每个格点对应一个质点,初始 Z 坐标 = Hcloth​。

  • 质点间用弹簧(结构弹簧 + 剪切弹簧)连接,赋予刚度系数 k。

Step 3:布料沉降迭代(核心)

对每个迭代步:

  1. 重力作用:所有未被约束的质点 Z 坐标 −=g⋅Δt(向下降落)。

  2. 弹簧力:根据相邻质点位移差计算弹簧恢复力,调整质点位置以保持布料光滑。

  3. 碰撞检测(关键!)

    • 对每个布料质点 (xc​,yc​,zc​),在原始点云 P中找到最近邻点 pnear​=(xp​,yp​,zp​)。

    • 判断是地面还是地物

      • 若点 zp​低于当前布料质点 zc​(即点在布下方),且是潜在地面点(通常初判条件宽松),则布料质点被允许下沉至 zc′​=zp​(贴地)。

      • 若点 zp​高于​ zc​(即点在布上方,说明是植被/屋顶),布料质点不可穿过,停留在当前位置(被顶住)。

    • 刚性布 vs 柔性布模式

      • 刚性 cloth(传统 CSF):布不能穿透任何点,仅停在最高点接触面——适合简单场景。

      • Flexible cloth(改进 CSF):允许轻微穿透(设定穿透阈值 Tpen​),可减少平坦屋顶误判为地面。

  4. 重复迭代直至布料收敛(质点位移 < 阈值)或达到最大迭代次数(通常 500~1000 次)。

Step 4:提取地面点分类

  • 沉降完成后,将原始点云中与最终布料表面距离 < 分类阈值(如 0.2~0.5m)的点标记为地面点(Ground),其余为非地面(non-ground:植被/建筑)

Step 5:插值生成 DTM

  • 对标记的 Ground 点进行 Delaunay 三角网或反距离加权(IDW)插值,生成规则格网 DTM。


三、关键参数与调优(直接影响 TERCOM 精度)

参数

含义

典型取值(无人机 0.5~1m DSM)

影响

网格分辨率 (grid size)

布料质点间距

= DSM 分辨率 (0.5~1m)

过大会漏掉微地形,过小计算慢

布料刚度 (stiffness / k)

弹簧刚度,越大越硬

通常较大(~1000~5000)模拟近似刚性布;太小会变波浪形

太软会把斜坡误当成凹陷

重力步长 (time step / g)

每步沉降量

0.5~2.0(视场景尺度)

太大易穿透,太小迭代多

最大迭代

沉降迭代次数

500~800

平原区收敛快,山地需更多

分类阈值 (classify threshold)

点与布面容差

0.2~0.5m(平原严,山区松)

过大把矮灌丛当地面→DTM 偏高

穿透深度 (allow penetration)

允许布微穿点云

0.1~0.3m(改进 CSF 开此选项)

有助于区分贴在地面上的低矮草灌

⚠️ 城镇/战壕注意:建筑物大面积水平顶面会使布"搁浅"在该高度,误判为地面 → 需开启 "翻转 normal 或 use upward filtering"​ 或先 mask 掉明显建筑多边形(OSM 建筑层辅助)。


四、针对俄乌战场数据的特殊处理

  1. 弹坑与反坦克壕

    • CSF 能较好保留弹坑(它是负地形,布可沉入),前提是 grid size 小于弹坑直径(建议 ≤0.5m 处理局部精修 DEM)。

  2. 植被(尤其是冬季枯木/夏玉米)

    • 冬季落叶林冠层稀疏,CSF 通常能把布沉到雪/地面;夏季密植玉米建议先做 NDVI 掩膜剔除植被区再滤波,或直接用雷达(InSAR) DEM 免光学植被影响。

  3. 废墟/焦土

    • 被炸毁建筑呈不规则碎块,CSF 倾向于把大块废墟当非地面(正确),但碎砾石若低于布初始面会被归入地面(合理——接近裸土高程)。

  4. 结合 OSM 建筑掩膜

    • 用 OpenStreetMap 建筑多边形先做 raster mask,标记区内点为"非地面强制排除",防止平顶楼房被 CSF 误判为平原地形。


五、常用开源实现

  • CloudCompare:菜单 Plugins → CSF Filter,可视化调参,适合离线处理。

  • Python (csf-python / laspy)pip install csf,封装 C++ 原版 Wang Zhang 算法,可直接处理 .las/.laz点云。

  • PDALfilters.csf阶段,适合流水线批处理大范围乌东战区 DSM。

简易 Python 伪代码示例:

import csf
import laspy

inFile = laspy.read("dsm.las")
xyz = inFile.xyz

cloth = csf.CSF()
cloth.setPointCloud(xyz)
cloth.setParams({
    'rigidness': 2,          # 1=柔性, 2=刚性(推荐)
    'time_step': 0.65,
    'class_threshold': 0.3,  # 米
    'grid_resolution': 0.5,  # 与DSM分辨率一致
    'iterations': 500
})
ground_idx, non_ground_idx = cloth.do_filtering()
# ground_idx 可用于插值生成 DTM

六、一句话总结

CSF 把"去除非地面物体"转化为物理模拟问题:让一块虚拟弹性布在重力下落到 DSM 点云上,布被植被/建筑顶起、在裸土处下沉贴合,其下表面即是 DTM。它比形态学开运算更能保留微地形(弹坑、沟渠),是乌军/北约处理无人机航拍 DEM 提取战区裸土地形的首选滤波算法。

此文由 怡心湖 编辑,若您觉得有益,欢迎分享转发!:首页 > 常识论 » CSF 滤波算法如何从 DSM 中提取 DTM(去除植被/建筑)

()
分享到:

相关推荐