【金山文档 | WPS云文档】 高斯滤波、中值滤波解释以及CHM中应用 https://www.kdocs.cn/l/cllg0bwrYaOE
本篇ai解释偏多,大多理论解释
第一部分:滤波原理解释
1. 高斯滤波
核心思想:一种线性平滑滤波器。它根据高斯函数(正态分布曲线)来生成一个加权平均核(Kernel)。这个核的中心权重最大,越远离中心,权重越小。处理图像时,将核覆盖在每个像素上,用核内所有像素值的加权平均值来替换中心的像素值。
效果:
优点:能非常有效地消除符合正态分布的噪声(如高斯噪声),平滑效果均匀,能较好地保留图像的总体梯度(即整体形状和趋势)。
缺点:在平滑的同时会模糊边缘。因为边缘处的像素值变化剧烈,加权平均会使得边缘变得不那么锐利。
关键参数:
核大小:通常是一个奇数(如3x3, 5x5, 7x7)。核越大,平滑效果越强,图像也越模糊。
标准差:决定了权重分布的集中程度。标准差越大,权重越分散,意味着更远的像素也会对中心点有较大贡献,平滑效果也更明显。
简单比喻:就像透过一块毛玻璃看东西,轮廓都在,但所有细节都变得柔和模糊了。
2. 中值滤波
核心思想:一种非线性平滑滤波器。它用一个滑动窗口(如3x3, 5x5)扫描图像的每一个像素,将窗口内的所有像素值进行排序,然后用其中的中值来替换窗口中心的像素值。
效果:
优点:对椒盐噪声(即随机出现的、孤立的极值点)有奇效。因为它取的是中位数,所以个别异常高或异常低的点不会被采用,从而直接被过滤掉。能较好地保护边缘,因为边缘的像素值虽然差异大,但中值通常来自边缘的某一侧,不会像平均值那样混合两侧的值。
缺点:对于大量聚集的噪声或高斯噪声,效果可能不如高斯滤波。如果窗口内噪声点超过一半,滤波可能会失败。同时,它可能会抹去一些细微的纹理特征。
关键参数:
窗口大小:同样是一个奇数。窗口越大,能过滤掉的更大尺寸的孤立噪声点,但也可能导致细节丢失。
简单比喻:就像在一个小组里投票,取中间派的意见,极端分子的意见(异常高/低值)会被自动忽略。
第二部分:在CHM数据平滑处理中的应用
CHM数据的特点与平滑目的
CHM:冠层高度模型。它是一个栅格图像,每个像素的值代表了该位置的地面到树冠顶部的高度。
为什么需要平滑:
原始数据噪声:LiDAR点云数据在生成CHM的过程中,可能会因为多重反射、GPS误差、飞行姿态波动等原因,产生一些异常的像素点(例如,本该是树冠的地方出现了一个极低的洞,或者本该是空地的地方出现了一个极高的尖刺)。
过于粗糙的树冠轮廓:特别是低分辨率的CHM,树冠边界可能呈现锯齿状,不便于后续的树冠分割和提取。
平滑的目标:
去除孤立的、明显错误的极高或极低值(中值滤波的强项)。
使树冠表面和冠幅轮廓变得自然平滑,同时尽可能保留真实的树冠边缘和形状。
如何使用这两种滤波
通常的建议是:结合使用,以达到最佳效果。
推荐工作流程:
- 第一步:使用中值滤波去除异常值
目的:首先清除CHM中最明显的“椒盐噪声”,即那些孤立的极高(可能是错误尖刺)和极低(可能是数据空洞)的像素。
参数建议:
窗口大小:从 3x3 开始尝试。如果噪声点比较大,可以尝试 5x5。不宜过大,否则会过度平滑,使小树冠消失。
迭代次数:有时一次滤波不能完全去除所有噪声,可以应用2-3次迭代。但同样要谨慎,避免过度处理。
- 第二步:使用高斯滤波进行整体平滑
目的:在中值滤波去除了尖锐噪声的基础上,使用高斯滤波对树冠表面进行柔和平滑,得到更自然、连续的树冠高度曲面,为后续的树冠分割(如局部最大值法、分水岭算法等)做准备。
参数建议:
核大小:与中值滤波窗口大小类似,从 3x3 或 5x5 开始。
标准差:可以设置为与核大小相关。在许多软件中,如果你不指定标准差,它会根据核大小自动计算一个默认值。你可以先使用默认值,然后根据效果微调。标准差略大一些,平滑效果会更柔和。
实际操作指南(以常用GIS/遥感软件为例)
在QGIS中操作:
- 中值滤波:
路径:处理工具箱 -> 搜索中值滤波。
选择你的CHM栅格作为输入层。
设置“参考核的半径”(例如,1表示3x3窗口,2表示5x5)。
运行。
- 高斯滤波:
路径:处理工具箱 -> 搜索高斯滤波。
选择经过中值滤波后的结果作为输入层。
设置“参考核的半径”(同样,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许可级别,参数相对复杂。
操作步骤:
- 数据准备:
确保您的CHM数据已经过平滑处理(例如,使用之前提到的焦点统计工具进行中值滤波或高斯滤波)。这是至关重要的一步,可以去除噪声,防止将噪声点误判为树顶。
在ArcGIS Pro中打开您的工程和CHM图层。
- 找到并打开工具:
点击工具栏上的 “分析” 选项卡。
在 “栅格分析” 组中,点击 “区域分析” 下拉菜单,选择 “定位区域”。
也可以在 “地理处理” 面板中直接搜索 定位区域。
- 参数设置:
输入栅格:选择您平滑后的CHM数据。
输出区域要素:指定输出面要素的名称和保存位置。这个结果将代表检测到的每个树冠的范围。
区域设置(关键部分):
区域类型:选择 “极值区域”。
极值类型:选择 “最大值”。这告诉工具我们要找局部高值。
区域邻域设置:这里定义“移动窗口”的大小。这是最重要的参数。
邻域类型:推荐选择 “圆形”,更符合树冠形状。
半径:输入一个值。单位与您的CHM分辨率相同。例如,如果CHM分辨率是0.5米,您希望搜索窗口的直径约为3米,则半径可设置为 1.5。这个值需要根据目标树木的冠幅大小反复试验。
输出点要素(可选):勾选此选项,并指定一个输出点要素的名称。这将生成树顶点(即局部最大值点),每个点会包含树高属性。
- 运行工具:
点击“运行”。工具会同时生成一个面图层(树冠范围)和一个点图层(树顶位置和高度)。
方法二:使用经典栅格计算法(适用于所有许可级别)
这个方法通过组合使用多个工具来模拟局部最大值搜索,是ArcMap和ArcGIS Pro中都通用的经典方法。
核心原理:如果一个像素的值等于其一定邻域内的最大值,那么这个像素就是局部最大值。
操作步骤:
- 数据准备:同样,使用平滑后的CHM(
Smoothed_CHM)。 - 步骤一:计算局部最大值栅格
使用 “焦点统计” 工具。
参数设置:
输入栅格:Smoothed_CHM
输出栅格:FocalMax_CHM (例如)
邻域设置:选择“圆形”并设置半径(同上,例如1.5)。这个参数决定窗口大小。
统计类型:“最大值”。
运行。FocalMax_CHM 的每个像素值 now 代表了其周围圆形邻域内的最高高度。
- 步骤二:识别局部最大值点
使用 “栅格计算器” 工具。
构建一个表达式,找出原始CHM的值等于其局部最大值的那些点。
表达式:Con("Smoothed_CHM" == "FocalMax_CHM", "Smoothed_CHM")
解释:Con是条件函数。这个表达式的意思是:如果Smoothed_CHM的值等于FocalMax_CHM的值,则输出Smoothed_CHM的值(即树高);否则输出NoData。
输出栅格:设置为LocalMax_Points_Raster
运行。此时得到的LocalMax_Points_Raster是一个栅格图层,其中非NoData的像素就是局部最大值点,其像素值就是树高。
- 步骤三:将栅格点转换为矢量点(可选但推荐)
使用 “栅格转点” 工具。
输入栅格:LocalMax_Points_Raster
字段:选择VALUE,这样生成的点的属性表里就会包含树高信息。
输出点要素:指定最终需要的树顶点矢量文件名称,如Detected_Treetops。
运行。
结果分析与优化
无论使用哪种方法,得到结果后都需要进行分析:
- 可视化检查:
将生成的树顶点图层叠加在原始的CHM上(最好使用清晰的色带渲染)。
目视判断:
正确检测:点是否准确落在树冠的顶部?
过度检测:一棵树上是否出现了多个点?(说明窗口太小,需要增大邻域半径)
检测不足:明显的树木是否没有被检测到?(说明窗口太大,需要减小邻域半径,或者树木本身太矮,被平滑掉了)
误检:点是否出现在非树区域(如建筑物、噪声)?
- 属性表分析:
打开树顶点图层的属性表。
查看VALUE(或类似的)字段,这是树高。对树高进行排序或创建直方图,检查是否有大量不合理的极低值(可能是误检),其分布是否符合林分预期。
- 空间分布分析:
使用 “计算几何属性” 工具为点图层添加点坐标。
使用 “平均最近邻” 工具分析点的分布模式(是随机、离散还是聚集)。如果点呈现显著的聚集分布,可能意味着窗口太小,导致一棵树上检测出多个点。
总结与建议
特性 | 方法一(定位区域) | 方法二(焦点统计+栅格计算) |
许可要求 | Advanced | Basic (即可) |
输出 | 点+面 | 点 (需额外转换) |
流程 | 简单,一步到位 | 复杂,多步骤 |
推荐度 | 高(如果有许可) | 高(通用备选方案) |
最佳实践建议:
始终从预处理(平滑)开始。
参数调试是关键:在一个有代表性的小区域(样区)上进行测试。尝试不同的邻域半径(如1.0, 1.5, 2.0, 2.5),通过目视对比选择最佳值,然后再应用到整个区域。
结合使用:有时先用“定位区域”提取树冠面,再用“要素转折点”工具从面中提取顶点,也能得到很好的效果。
管理预期:局部最大值法对锥形树冠的针叶林效果最好,对阔叶林或茂密森林可能会漏检或合并树冠。