By wangchaoqiang, 25 September, 2025
Forums

概述:

目的是从无人机获取的影像数据中,识别并定位到每一颗独立树木,从而获取每棵树的单木信息(树高、冠幅等)

DSM (Digital Surface Model - 数字表面模型): 它包含了地表以上所有物体的高度信息,如建筑物、车辆、树冠的顶部。DSM可以直观地理解为一张记录了地表最高点高度的“高程照片”。

DEM (Digital Elevation Model - 数字高程模型): 只包含裸露的地表地形高度,不包括任何建筑物、植被。

CHM (Canopy Height Model - 冠层高度模型): 这是最关键的数据。它由 DSM 减去 DEM 得到,代表了纯植被的高度(树冠顶部相对于地面的高度)。CHM看起来像一幅由许多小山丘组成的图像,每个“小山丘”理论上就对应一棵树的树冠。

具体方法技术:

基于局部最大值/最小值算法主要通过CHM数据进行操作实现,核心思想为一棵树的最高点(树冠顶点)或最低点(树干基部,需特定数据)在空间上是一个局部极值点,这个点就可以被认为是这棵树的位置。

基于局部最大值法:假设树冠顶点是周围一定区域内最高的点,寻找树冠顶点

数据预处理

生成CHM: 首先必须拥有DSM和DEM数据,通过 CHM = DSM - DEM 计算得到冠层高度模型。

平滑滤波(至关重要): 原始的CHM数据可能因为噪声、不规则树冠(如双顶)而显得粗糙。直接寻找局部最大值会找到过多的错误点(过分割)。因此,通常使用高斯滤波中值滤波对CHM进行平滑处理,以消除小波动,凸显出主要树冠的形态。

高斯滤波: 效果更自然,能更好地保持树冠形状。

中值滤波: 能更好地保持边缘和消除椒盐噪声。

https://www.kdocs.cn/l/cllg0bwrYaOE

移动窗口搜索

定义一个特定大小的移动窗口(例如 3x3, 5x5 像素)。窗口大小的选择是关键参数,需要根据图像分辨率(GSD)和期望的树冠大小来设定。

规则: 将这个窗口在平滑后的CHM上逐像素移动。对于窗口中心的像素,如果它的值是整个窗口内最大的,且其值大于某个设定的最小高度阈值(例如,高于2米以排除灌木和噪声),则该点被识别为一个树冠顶点,即一棵树的位置。

结果输出

所有被识别出的局部最大值点的坐标(X, Y)就是单木的位置。其对应的CHM值(Z)可以近似作为该树的树高。

示例:

平滑后的CHM数据(俯视图,数值代表高度):

[ 5, 5, 6, 5, 5 ]

[ 5, 8, 9, 8, 5 ]

[ 6, 9, 10, 9, 6 ] ——中心点‘10’是3x3窗口内的最大值,被识别为一棵树

[ 5, 8, 9, 8, 5 ]

[ 5, 5, 6, 5, 5 ]

(2)如何生成CHM数据

生成CHM(Canopy Height Model,冠层高度模型)是通过将DSM(数字表面模型)减去DEM(数字高程模型)来实现的,公式为:CHM = DSM - DEM。

方法一:直接在大疆智图中导出CHM

通过空三和三维重建数据处理后可以生成高质量DSM和DEM,重建完成后,选择二维地图成果,点击导出选择CHM,选择GeoTIFF格式导出。(工作站大疆智图3.7.0版本支持直接导出)

方法二:通过ArcGIS计算得出CHM 数据

通过大疆智图重建完成导出DSM和DEM数据,然后使用ArcGIS计算

在ArcGIS中添加DSM和DEM图层,打开"Spatial Analyst"工具箱中的"栅格计算器",输入公式:Raster("DSM") - Raster("DEM"),输出可生成CHM 。

设置无效值

使用Con工具将负值设为0:

python

Con(("CHM"<0),0,"CHM")

方法三:使用python脚本处理

import numpy as np

import rasterio

from rasterio import mask

 

def generate_chm(dsm_path, dem_path, output_path):

# 读取DSM数据

with rasterio.open(dsm_path) as dsm:

dsm_data = dsm.read(1)

dsm_profile = dsm.profile

 

# 读取DEM数据

with rasterio.open(dem_path) as dem:

dem_data = dem.read(1)

 

# 计算CHM (DSM - DEM)

chm_data = dsm_data - dem_data

 

# 将负值设为0(地表以下的高度无效)

chm_data[chm_data < 0] = 0

 

# 保存CHM

with rasterio.open(output_path, 'w', **dsm_profile) as dst:

dst.write(chm_data, 1)

(3)基于局部最小值法:寻找树干基部(使用较少,需要更高质量数据)

通过LiDAR点云实现,它不依赖于CHM,而是直接处理LiDAR获取的三维点云数据。算法会过滤出最后一次回波(Last Return)或地面点分类后的低点云。在这些低点中搜索局部最小值点。理论上,这些点因为激光穿透冠层间隙到达了地面或树干基部,所以高度值较低。识别出的局部最小值点被认为是树干基部的位置。

优点: 对于树干明显、林下通畅的森林,此法能更精确地定位树木的实际茎干位置。

缺点: 对茂密的下层植被或复杂林下地形非常敏感,容易产生大量错误识别。

【金山文档 | WPS云文档】 单木识别定位(基于局部最大值_最小值算法) https://www.kdocs.cn/l/coAPZfXixbPz