By wangchaoqiang, 25 September, 2025
Forums

【金山文档 | WPS云文档】 高斯滤波、中值滤波解释以及CHM中应用 https://www.kdocs.cn/l/cllg0bwrYaOE

本篇ai解释偏多,大多理论解释

第一部分:滤波原理解释

1. 高斯滤波

核心思想:一种线性平滑滤波器。它根据高斯函数(正态分布曲线)来生成一个加权平均核(Kernel)。这个核的中心权重最大,越远离中心,权重越小。处理图像时,将核覆盖在每个像素上,用核内所有像素值的加权平均值来替换中心的像素值。

效果

优点:能非常有效地消除符合正态分布的噪声(如高斯噪声),平滑效果均匀,能较好地保留图像的总体梯度(即整体形状和趋势)。

缺点:在平滑的同时会模糊边缘。因为边缘处的像素值变化剧烈,加权平均会使得边缘变得不那么锐利。

关键参数

核大小:通常是一个奇数(如3x3, 5x5, 7x7)。核越大,平滑效果越强,图像也越模糊。

标准差:决定了权重分布的集中程度。标准差越大,权重越分散,意味着更远的像素也会对中心点有较大贡献,平滑效果也更明显。

简单比喻:就像透过一块毛玻璃看东西,轮廓都在,但所有细节都变得柔和模糊了。

2. 中值滤波

核心思想:一种非线性平滑滤波器。它用一个滑动窗口(如3x3, 5x5)扫描图像的每一个像素,将窗口内的所有像素值进行排序,然后用其中的中值来替换窗口中心的像素值。

效果

优点:对椒盐噪声(即随机出现的、孤立的极值点)有奇效。因为它取的是中位数,所以个别异常高或异常低的点不会被采用,从而直接被过滤掉。能较好地保护边缘,因为边缘的像素值虽然差异大,但中值通常来自边缘的某一侧,不会像平均值那样混合两侧的值。

缺点:对于大量聚集的噪声或高斯噪声,效果可能不如高斯滤波。如果窗口内噪声点超过一半,滤波可能会失败。同时,它可能会抹去一些细微的纹理特征。

关键参数

窗口大小:同样是一个奇数。窗口越大,能过滤掉的更大尺寸的孤立噪声点,但也可能导致细节丢失。

简单比喻:就像在一个小组里投票,取中间派的意见,极端分子的意见(异常高/低值)会被自动忽略。

第二部分:在CHM数据平滑处理中的应用

CHM数据的特点与平滑目的

CHM:冠层高度模型。它是一个栅格图像,每个像素的值代表了该位置的地面到树冠顶部的高度。

为什么需要平滑

原始数据噪声:LiDAR点云数据在生成CHM的过程中,可能会因为多重反射、GPS误差、飞行姿态波动等原因,产生一些异常的像素点(例如,本该是树冠的地方出现了一个极低的洞,或者本该是空地的地方出现了一个极高的尖刺)。

过于粗糙的树冠轮廓:特别是低分辨率的CHM,树冠边界可能呈现锯齿状,不便于后续的树冠分割和提取。

平滑的目标

去除孤立的、明显错误的极高或极低值(中值滤波的强项)。

使树冠表面和冠幅轮廓变得自然平滑,同时尽可能保留真实的树冠边缘和形状

如何使用这两种滤波

通常的建议是:结合使用,以达到最佳效果。

推荐工作流程:

  1. 第一步:使用中值滤波去除异常值

目的:首先清除CHM中最明显的“椒盐噪声”,即那些孤立的极高(可能是错误尖刺)和极低(可能是数据空洞)的像素。

参数建议

窗口大小:从 3x3 开始尝试。如果噪声点比较大,可以尝试 5x5。不宜过大,否则会过度平滑,使小树冠消失。

迭代次数:有时一次滤波不能完全去除所有噪声,可以应用2-3次迭代。但同样要谨慎,避免过度处理。

  1. 第二步:使用高斯滤波进行整体平滑

目的:在中值滤波去除了尖锐噪声的基础上,使用高斯滤波对树冠表面进行柔和平滑,得到更自然、连续的树冠高度曲面,为后续的树冠分割(如局部最大值法、分水岭算法等)做准备。

参数建议

核大小:与中值滤波窗口大小类似,从 3x35x5 开始。

标准差:可以设置为与核大小相关。在许多软件中,如果你不指定标准差,它会根据核大小自动计算一个默认值。你可以先使用默认值,然后根据效果微调。标准差略大一些,平滑效果会更柔和。

实际操作指南(以常用GIS/遥感软件为例)

在QGIS中操作:

  1. 中值滤波

路径:处理工具箱 -> 搜索中值滤波

选择你的CHM栅格作为输入层。

设置“参考核的半径”(例如,1表示3x3窗口,2表示5x5)。

运行。

  1. 高斯滤波

路径:处理工具箱 -> 搜索高斯滤波

选择经过中值滤波后的结果作为输入层。

设置“参考核的半径”(同样,1代表3x3)。

可以设置标准差(或使用默认值)。

运行。

在Python (使用scikit-image) 中操作:

import numpy as np

from skimage import filters, io

import matplotlib.pyplot as plt

 

# 1. 读取CHM数据(假设为TIFF格式)

chm = io.imread('your_chm_file.tif')

 

# 2. 应用中值滤波

from scipy.ndimage import median_filter

chm_median = median_filter(chm, size=3) # size=3 表示 3x3 窗口

 

# 3. 应用高斯滤波

chm_smoothed = filters.gaussian(chm_median, sigma=1, truncate=3.0)

# sigma: 标准差

# truncate: 核的截止范围,通常设为3-4,表示核的大小约为 (sigma * truncate * 2 + 1)

 

# 4. 保存结果

io.imsave('smoothed_chm.tif', chm_smoothed)

 

# 5. (可选)可视化对比

fig, axes = plt.subplots(1, 3, figsize=(15, 5))

axes[0].imshow(chm, cmap='viridis')

axes[0].set_title('Original CHM')

axes[1].imshow(chm_median, cmap='viridis')

axes[1].set_title('After Median Filter')

axes[2].imshow(chm_smoothed, cmap='viridis')

axes[2].set_title('After Gaussian Filter')

plt.show()

总结与关键建议

先中值,后高斯:这是一个非常有效且常用的组合策略,兼顾了去除异常值和整体平滑。

参数从小开始切勿一开始就使用过大的窗口或标准差。总是从小的参数(如3x3)开始,逐步增加,并实时查看效果,直到达到你的需求为止。过度平滑会丢失树木结构信息,导致树冠合并或边界定位不准。

目视检查至关重要:平滑处理没有“唯一正确”的参数。最佳参数取决于你的数据质量和研究目的。务必通过目视对比,判断树冠形状是否得到保持,噪声是否被有效抑制。

最终目的:平滑后的CHM应该能够更清晰地显示出单个树冠的凸起结构,便于后续的树冠提取林木参数反演(如树高、冠幅面积等)。

使用ArcGIS对平滑后的CHM数据进行处理:

方法一:使用官方推荐工具 —— “定位区域” (Locate Regions) 工具

这是ArcGIS Pro最直接、最现代的方法,它专门用于识别栅格中的局部极值区域。

优点:功能强大,能直接输出面要素(树冠范围)和点要素(树顶点),一体化完成。

缺点:需要Advanced许可级别,参数相对复杂。

操作步骤:

  1. 数据准备

确保您的CHM数据已经过平滑处理(例如,使用之前提到的焦点统计工具进行中值滤波或高斯滤波)。这是至关重要的一步,可以去除噪声,防止将噪声点误判为树顶。

在ArcGIS Pro中打开您的工程和CHM图层。

  1. 找到并打开工具

点击工具栏上的 “分析” 选项卡。

“栅格分析” 组中,点击 “区域分析” 下拉菜单,选择 “定位区域”

也可以在 “地理处理” 面板中直接搜索 定位区域

  1. 参数设置

输入栅格:选择您平滑后的CHM数据。

输出区域要素:指定输出面要素的名称和保存位置。这个结果将代表检测到的每个树冠的范围。

区域设置(关键部分):

区域类型:选择 “极值区域”

极值类型:选择 “最大值”。这告诉工具我们要找局部高值。

区域邻域设置:这里定义“移动窗口”的大小。这是最重要的参数

邻域类型:推荐选择 “圆形”,更符合树冠形状。

半径:输入一个值。单位与您的CHM分辨率相同。例如,如果CHM分辨率是0.5米,您希望搜索窗口的直径约为3米,则半径可设置为 1.5。这个值需要根据目标树木的冠幅大小反复试验。

输出点要素(可选):勾选此选项,并指定一个输出点要素的名称。这将生成树顶点(即局部最大值点),每个点会包含树高属性。

  1. 运行工具

点击“运行”。工具会同时生成一个面图层(树冠范围)和一个点图层(树顶位置和高度)。


方法二:使用经典栅格计算法(适用于所有许可级别)

这个方法通过组合使用多个工具来模拟局部最大值搜索,是ArcMap和ArcGIS Pro中都通用的经典方法。

核心原理:如果一个像素的值等于其一定邻域内的最大值,那么这个像素就是局部最大值。

操作步骤:

  1. 数据准备:同样,使用平滑后的CHM(Smoothed_CHM)。
  2. 步骤一:计算局部最大值栅格

使用 “焦点统计” 工具。

参数设置

输入栅格Smoothed_CHM

输出栅格FocalMax_CHM (例如)

邻域设置:选择“圆形”并设置半径(同上,例如1.5)。这个参数决定窗口大小。

统计类型“最大值”

运行。FocalMax_CHM 的每个像素值 now 代表了其周围圆形邻域内的最高高度。

  1. 步骤二:识别局部最大值点

使用 “栅格计算器” 工具。

构建一个表达式,找出原始CHM的值等于其局部最大值的那些点。

表达式Con("Smoothed_CHM" == "FocalMax_CHM", "Smoothed_CHM")

解释Con是条件函数。这个表达式的意思是:如果Smoothed_CHM的值等于FocalMax_CHM的值,则输出Smoothed_CHM的值(即树高);否则输出NoData。

输出栅格:设置为LocalMax_Points_Raster

运行。此时得到的LocalMax_Points_Raster是一个栅格图层,其中非NoData的像素就是局部最大值点,其像素值就是树高。

  1. 步骤三:将栅格点转换为矢量点(可选但推荐)

使用 “栅格转点” 工具。

输入栅格LocalMax_Points_Raster

字段:选择VALUE,这样生成的点的属性表里就会包含树高信息。

输出点要素:指定最终需要的树顶点矢量文件名称,如Detected_Treetops

运行。

结果分析与优化

无论使用哪种方法,得到结果后都需要进行分析:

  1. 可视化检查

将生成的树顶点图层叠加在原始的CHM上(最好使用清晰的色带渲染)。

目视判断

正确检测:点是否准确落在树冠的顶部?

过度检测:一棵树上是否出现了多个点?(说明窗口太小,需要增大邻域半径)

检测不足:明显的树木是否没有被检测到?(说明窗口太大,需要减小邻域半径,或者树木本身太矮,被平滑掉了)

误检:点是否出现在非树区域(如建筑物、噪声)?

  1. 属性表分析

打开树顶点图层的属性表。

查看VALUE(或类似的)字段,这是树高。对树高进行排序创建直方图,检查是否有大量不合理的极低值(可能是误检),其分布是否符合林分预期。

  1. 空间分布分析

使用 “计算几何属性” 工具为点图层添加点坐标。

使用 “平均最近邻” 工具分析点的分布模式(是随机、离散还是聚集)。如果点呈现显著的聚集分布,可能意味着窗口太小,导致一棵树上检测出多个点。

总结与建议

特性

方法一(定位区域)

方法二(焦点统计+栅格计算)

许可要求

Advanced

Basic (即可)

输出

点+面

(需额外转换)

流程

简单,一步到位

复杂,多步骤

推荐度

(如果有许可)

(通用备选方案)

最佳实践建议:

始终从预处理(平滑)开始

参数调试是关键:在一个有代表性的小区域(样区)上进行测试。尝试不同的邻域半径(如1.0, 1.5, 2.0, 2.5),通过目视对比选择最佳值,然后再应用到整个区域。

结合使用:有时先用“定位区域”提取树冠面,再用“要素转折点”工具从面中提取顶点,也能得到很好的效果。

管理预期:局部最大值法对锥形树冠的针叶林效果最好,对阔叶林或茂密森林可能会漏检或合并树冠。