在遥感数据处理与地理信息系统(GIS)分析工作中,栅格数据中的异常值是一个普遍存在且必须妥善处理的问题。异常值可能表现为传感器噪声、云层遮挡造成的无效观测、DEM 数据中的空洞或高程跳变,以及数据重采样过程中产生的极端数值。这些异常值如果不加处理直接参与后续分析,会导致统计结果失真、地形参数计算错误、空间插值结果偏差等一系列问题。本文以 ArcGIS 平台为核心工具,系统梳理异常值的识别、提取与修复方法,并结合焦点统计与地图代数技术,提供一套可操作、可复用的技术流程。
ArcGIS 作为 Esri 公司开发的专业 GIS 软件平台,提供了丰富的栅格数据处理工具。其中,ArcToolbox 中的 Spatial Analyst 扩展模块是处理栅格异常值的核心工具集。通过地图代数(Map Algebra)语言,用户可以将多个栅格操作组合成单个表达式,实现从异常值识别到修复的完整工作流。本文所述方法适用于 ArcGIS Desktop 及 ArcGIS Pro 环境,核心函数与工具逻辑在两个版本中保持一致。
一、异常值的定义与识别策略
在栅格数据中,异常值通常指两类情况:一类是数据集中明确标记的无效值,例如 MODIS 产品中的填充值(Fill Value)、Landsat 数据中的背景值,以及 DEM 中的 NoData 空洞;另一类是统计意义上的离群值,即数值明显偏离周围像元或整体分布的值,例如高程数据中突然出现的极端高值或低值。区分这两类异常值对于选择合适的处理方法至关重要。
ArcGIS 帮助文档中提供了「查找异常值」的专题说明,指导用户通过栅格属性表、直方图以及栅格计算器等方式定位异常值的位置与范围。在实际操作中,建议首先使用栅格数据的属性表或分类渲染方式查看数值分布,识别出明显的异常值区间。对于 NoData 值,可以直接通过 IsNull 函数进行判断;对于特定数值范围的异常值,则可以使用关系表达式结合 SetNull 函数进行提取。
二、异常值提取的核心工具与函数
异常值提取的主要目的是将识别出的异常像元转换为 NoData(空值),为后续的插值修复创造条件。ArcGIS 中实现这一目标的核心工具是栅格计算器(Raster Calculator),其路径为:ArcToolBox → Spatial Analyst Tools → Map Algebra → Raster Calculator。栅格计算器支持地图代数语法,可以灵活组合多种函数完成复杂的栅格运算。
在异常值提取场景中,最常用的两个函数是 Con 和 SetNull。Con 函数是一个条件判断函数,其基本语法为 Con(条件表达式, 条件为真时的值, 条件为假时的值)。SetNull 函数则专门用于将满足特定条件的像元设置为 NoData,其语法为 SetNull(条件表达式, 输入栅格)。这两个函数可以单独使用,也可以嵌套组合,实现精细化的异常值控制。
2.1 Con 函数与 SetNull 函数的应用对比
Con 函数与 SetNull 函数在功能上有一定重叠,但适用场景有所不同。Con 函数更加通用,可以将异常值替换为任意指定值(如 0、平均值、邻域统计值等),而 SetNull 函数专注于将异常值转换为 NoData。以下表格对比了两个函数在异常值提取中的典型用法:
| 函数 | 表达式示例 | 功能说明 | 适用场景 |
|---|---|---|---|
| Con | Con(IsNull("DEM"), 0, "DEM") | 将 DEM 中的 NoData 值赋为 0,其他值保持不变 | 需要将空值替换为特定数值时 |
| Con | Con("DEM" > 5000, 5000, "DEM") | 将 DEM 中大于 5000 的异常高值截断为 5000 | 处理已知阈值范围的离群值时 |
| SetNull | SetNull("DEM" == 4, "DEM") | 将 DEM 中值为 4 的栅格设为 NoData | 将特定编码值标记为无效时 |
| SetNull | SetNull("DEM" < -100, "DEM") | 将 DEM 中小于 -100 的异常低值设为 NoData | 处理明显超出合理范围的值时 |
从表中可以看出,Con 函数更适合需要保留栅格完整性、将异常值替换为可用数值的场景;SetNull 函数则更适合将异常值彻底排除、交由后续插值算法处理的场景。在实际工作中,通常先使用 SetNull 或 Con 函数将异常值统一转换为 NoData,再通过插值方法进行修复。
2.2 栅格计算器中的函数嵌套与组合
栅格计算器的强大之处在于支持函数的嵌套与组合使用。例如,当需要同时处理多种类型的异常值时,可以将多个条件判断串联起来。以下表格列举了几种常见的组合表达式及其应用场景:
| 表达式 | 功能说明 | 典型应用 |
|---|---|---|
| Con(IsNull("DEM"), 0, Con("DEM" > 8000, 8000, "DEM")) | 先将 NoData 赋为 0,再将大于 8000 的值截断为 8000 | DEM 数据清洗与极值控制 |
| SetNull(IsNull("DEM") | ("DEM" < 0), "DEM") | 将 NoData 和负值同时设为 NoData | 去除无效高程值 |
| Con(("Raster" >= 0) & ("Raster" <= 100), "Raster", "") | 仅保留 0 到 100 之间的有效值,其余设为 NoData | 植被指数等有固定取值范围的指数产品 |
这些组合表达式展示了地图代数在处理复杂异常值场景时的灵活性。需要注意的是,表达式中的运算符(如 &、|、==、> 等)必须符合地图代数的语法规范,栅格名称需要用双引号包裹。
三、异常值修复:焦点统计与插值方法
将异常值提取为 NoData 之后,下一步就是通过插值方法修复这些空值区域。ArcGIS 提供了多种插值工具,包括反距离权重法(IDW)、克里金法(Kriging)、样条函数法(Spline)以及自然邻域法(Natural Neighbor)等。然而,对于栅格数据中的局部空洞修复,最常用且高效的方法是焦点统计(Focal Statistics)方法。
焦点统计工具通过对每个像元周围指定邻域内的像元进行统计分析(如均值、中值、最大值、最小值等),生成一个新的栅格。在异常值修复场景中,焦点统计的均值(MEAN)或中值(MEDIAN)统计类型最为常用,因为它们能够利用周围有效像元的值来合理估计异常位置的值。焦点统计工具的路径为:ArcToolBox → Spatial Analyst Tools → Neighborhood → Focal Statistics。
3.1 焦点统计的邻域类型与参数设置
焦点统计工具的核心参数包括邻域类型(Neighborhood)、统计类型(Statistics Type)以及是否忽略 NoData 值。邻域类型决定了参与统计的像元范围,常用的邻域类型包括矩形(Rectangle)、圆形(Circle)、环形(Annulus)和楔形(Wedge)。以下表格总结了不同邻域类型的特点与适用场景:
| 邻域类型 | 参数说明 | 特点 | 适用场景 |
|---|---|---|---|
| 矩形(NbrRectangle) | 指定宽度和高度(以像元或地图单位计) | 形状规则,计算效率高 | 大多数栅格数据修复场景 |
| 圆形(NbrCircle) | 指定半径 | 各向同性,无方向偏差 | 需要均匀考虑各方向影响的场景 |
| 环形(NbrAnnulus) | 指定内半径和外半径 | 排除中心区域,仅用外围像元 | 需要避免中心异常值干扰的场景 |
| 楔形(NbrWedge) | 指定起始角度、终止角度和半径 | 具有方向性 | 需要考虑特定方向影响的场景 |
在异常值修复中,矩形邻域(NbrRectangle)是最常用的选择。例如,NbrRectangle(3, 3, "CELL") 表示以当前像元为中心的 3×3 像元窗口。窗口大小的选择需要根据异常值区域的大小和数据的空间分辨率来确定:窗口过小可能无法覆盖较大的空洞区域,窗口过大则可能引入过多无关像元,导致修复结果过于平滑。
3.2 地图代数中的焦点统计函数调用
焦点统计工具在地图代数中的函数形式为 FocalStatistics。其基本语法为:FocalStatistics(输入栅格, 邻域定义, 统计类型, 是否忽略 NoData)。其中,邻域定义需要使用 NbrRectangle、NbrCircle 等邻域函数来指定。以下表格列出了焦点统计函数在不同统计类型下的表达式示例:
| 统计类型 | 表达式示例 | 功能说明 |
|---|---|---|
| 均值(MEAN) | FocalStatistics("DEM", NbrRectangle(3, 3, "CELL"), "MEAN", "DATA") | 计算 3×3 窗口内有效像元的平均值 |
| 中值(MEDIAN) | FocalStatistics("DEM", NbrRectangle(5, 5, "CELL"), "MEDIAN", "DATA") | 计算 5×5 窗口内有效像元的中值 |
| 最小值(MINIMUM) | FocalStatistics("DEM", NbrRectangle(3, 3, "CELL"), "MINIMUM", "DATA") | 计算 3×3 窗口内有效像元的最小值 |
| 最大值(MAXIMUM) | FocalStatistics("DEM", NbrRectangle(3, 3, "CELL"), "MAXIMUM", "DATA") | 计算 3×3 窗口内有效像元的最大值 |
在上述表达式中,最后一个参数 "DATA" 表示在统计时忽略 NoData 值,仅使用有效像元进行计算。这一设置对于异常值修复至关重要,因为如果包含 NoData 值,统计结果将无法正确反映周围有效像元的数值特征。
3.3 Con 函数与焦点统计的组合修复方法
将异常值提取与焦点统计修复相结合,可以构建一个完整的地图代数表达式,一步完成异常值的识别与修复。核心思路是:使用 Con 函数判断哪些像元是异常值(通常为 NoData),对于异常像元,使用焦点统计计算出的邻域统计值进行填充;对于正常像元,则保留原始值。以下表格展示了不同场景下的组合表达式:
| 场景 | 表达式 | 说明 |
|---|---|---|
| 修复 NoData 空洞 | Con(IsNull("DEM"), FocalStatistics("DEM", NbrRectangle(3, 3, "CELL"), "MEAN", "DATA"), "DEM") | 用 3×3 邻域均值填充 NoData 区域 |
| 修复特定值异常 | Con("DEM" == 4, FocalStatistics(SetNull("DEM" == 4, "DEM"), NbrRectangle(5, 5, "CELL"), "MEAN", "DATA"), "DEM") | 先将值为 4 的像元设为 NoData,再用 5×5 邻域均值填充 |
| 修复极值异常 | Con(("DEM" > 8000) | ("DEM" < -100), FocalStatistics(SetNull(("DEM" > 8000) | ("DEM" < -100), "DEM"), NbrRectangle(3, 3, "CELL"), "MEDIAN", "DATA"), "DEM") | 将超出合理范围的值用邻域中值替换 |
这些组合表达式体现了地图代数的核心优势:将多个空间分析操作整合为单个表达式,避免了中间数据的生成与管理,提高了处理效率。需要注意的是,当异常值区域较大时,单次焦点统计可能无法完全填充所有空洞,此时需要迭代执行修复操作,或使用更大的邻域窗口。
四、完整工作流程与操作步骤
为了便于读者在实际工作中应用上述方法,以下将完整的异常值修复流程整理为系统化的操作步骤。整个流程分为数据准备、异常值识别、异常值提取、焦点统计修复和结果验证五个阶段。
4.1 数据准备阶段
在开始处理之前,需要确保栅格数据已正确加载到 ArcMap 或 ArcGIS Pro 中,并检查数据的坐标系、像元大小和数值范围。建议在处理前备份原始数据,以防操作失误导致数据丢失。同时,确认 Spatial Analyst 扩展模块已启用,否则栅格计算器和焦点统计工具将无法使用。
4.2 异常值识别与提取阶段
打开栅格计算器,根据数据特点选择合适的函数表达式。对于 NoData 值,使用 IsNull 函数进行判断;对于特定数值范围的异常值,使用关系表达式进行筛选。执行表达式后,异常值将被转换为 NoData 或指定的替代值。建议在此阶段生成一个异常值分布图,直观检查异常值的空间分布是否合理。
4.3 焦点统计修复阶段
在栅格计算器中输入组合表达式,将 Con 函数与 FocalStatistics 函数结合使用。根据异常值区域的大小选择合适的邻域窗口尺寸,通常从 3×3 开始尝试,如果修复效果不理想,再逐步增大窗口。执行表达式后,异常值区域将被邻域统计值填充。
4.4 结果验证阶段
修复完成后,需要对结果进行验证。可以通过以下方式检查修复效果:对比修复前后的栅格直方图,查看异常值是否已被合理替换;在异常值区域附近进行剖面分析,检查修复后的数值是否与周围地形或数据趋势一致;使用栅格计算器检查结果中是否还存在 NoData 值或异常值。
五、不同数据类型的异常值处理策略
不同类型的栅格数据具有不同的数值特征和异常值表现,因此需要采取针对性的处理策略。以下表格总结了常见栅格数据类型的特点及推荐的异常值处理方法:
| 数据类型 | 常见异常值表现 | 推荐处理方法 | 注意事项 |
|---|---|---|---|
| DEM 高程数据 | NoData 空洞、极端高值或低值、局部跳变 | SetNull 提取异常值后,用焦点统计均值或中值填充 | 注意保持地形特征,避免过度平滑 |
| MODIS 遥感产品 | 填充值(如 -28672)、云污染像元 | 使用产品自带的 QA 波段识别异常像元,再用时间序列插值或空间插值修复 | 需结合产品质量控制信息 |
| Landsat 地表反射率 | 云阴影、饱和像元、NoData 背景值 | 使用 QA 波段掩膜异常像元,再用邻域插值或时间合成方法修复 | 注意区分水体与云阴影 |
| 植被指数(NDVI/EVI) | 超出理论范围的值(如小于 -1 或大于 1) | 使用 Con 函数截断超出范围的值,再用邻域均值填充 | 注意保留真实的极端植被状况 |
| 分类结果栅格 | 孤立像元、类别噪声 | 使用众数滤波(Majority Filter)或焦点统计的众数类型进行平滑 | 避免改变类别边界的准确性 |
上述表格中的处理策略需要根据具体数据情况进行调整。例如,对于 MODIS 数据,其产品文档中明确规定了各种填充值的具体数值,用户应查阅对应产品的用户指南,准确识别异常值。对于分类结果栅格,异常值的概念与连续数值型数据有所不同,更多指的是类别噪声和孤立像元,此时焦点统计的众数(MAJORITY)类型比均值更为合适。
六、进阶技巧与注意事项
在实际应用中,掌握一些进阶技巧可以显著提高异常值修复的质量和效率。以下从多个维度总结关键注意事项:
6.1 邻域窗口大小的选择原则
邻域窗口大小的选择直接影响修复效果。窗口过小,可能无法覆盖较大的异常值区域,导致修复不彻底;窗口过大,则会引入过多远处像元的信息,使修复结果过于平滑,丢失局部细节。一般原则是:窗口尺寸应略大于最大异常值区域的直径。例如,如果最大的 NoData 空洞直径约为 5 个像元,则建议使用 7×7 或更大的邻域窗口。对于分布零散的小面积异常值,3×3 窗口通常已经足够。
6.2 统计类型的选择依据
焦点统计的统计类型选择取决于数据的性质和修复目标。均值(MEAN)计算简单,但对极端值敏感,如果邻域内存在其他异常值,均值可能被拉偏。中值(MEDIAN)对极端值具有较强的鲁棒性,适合在数据中存在少量离群值的情况下使用。对于地形数据,如果希望保持地形的连续性和平滑性,均值较为合适;如果希望保留更多的局部变化特征,中值可能更为保守。
6.3 迭代修复与多尺度处理
对于大面积或连续分布的异常值区域,单次焦点统计可能无法完全填充所有空洞。此时可以采用迭代修复策略:先使用较小的邻域窗口进行修复,然后检查结果中是否还存在 NoData 值,如果存在,再使用更大的窗口进行第二次修复。另一种方法是采用多尺度处理思路,先使用大窗口进行粗略修复,再使用小窗口进行精细调整。
6.4 数据备份与结果验证
在进行任何异常值处理之前,务必保留原始数据的备份。异常值修复是一个不可逆的过程,一旦原始值被替换,就无法恢复到处理前的状态。此外,修复完成后应进行系统的结果验证,包括视觉检查和定量检查。视觉检查可以通过对比修复前后的渲染图进行,定量检查则可以使用栅格统计工具比较修复前后的数值分布特征。
七、相关资源与参考链接
以下整理了 ArcGIS 官方文档中与本文主题相关的核心资源链接,这些链接均可在联网状态下直接点击访问,为读者提供更详细的技术参考:
| 资源名称 | 链接地址 | 内容简介 |
|---|---|---|
| ArcGIS 帮助文档——查找异常值 | https://desktop.arcgis.com/zh-cn/arcmap/latest/extensions/spatial-analyst/performing-analysis/finding-outliers.htm | 官方指南,介绍栅格数据中异常值的识别方法 |
| ArcGIS 帮助文档——栅格计算器 | https://desktop.arcgis.com/zh-cn/arcmap/latest/tools/spatial-analyst-toolbox/raster-calculator.htm | 栅格计算器的使用说明与地图代数语法参考 |
| ArcGIS 帮助文档——Con 函数 | https://desktop.arcgis.com/zh-cn/arcmap/latest/tools/spatial-analyst-toolbox/con-.htm | Con 条件判断函数的详细语法与示例 |
| ArcGIS 帮助文档——SetNull 函数 | https://desktop.arcgis.com/zh-cn/arcmap/latest/tools/spatial-analyst-toolbox/set-null.htm | SetNull 函数的详细语法与示例 |
| ArcGIS 帮助文档——焦点统计工具 | https://desktop.arcgis.com/zh-cn/arcmap/latest/tools/spatial-analyst-toolbox/focal-statistics.htm | 焦点统计工具的完整参数说明与用法 |
| ArcGIS 帮助文档——NbrRectangle | https://desktop.arcgis.com/zh-cn/arcmap/latest/tools/spatial-analyst-toolbox/nbrrectangle.htm | 矩形邻域定义函数的语法说明 |
| ArcGIS 帮助文档——在地图代数中执行工具 | https://desktop.arcgis.com/zh-cn/arcmap/latest/extensions/spatial-analyst/map-algebra/using-tools-in-map-algebra.htm | 介绍如何在地图代数表达式中调用地理处理工具 |
上述链接均指向 ArcGIS 官方文档站点,内容权威且持续更新。读者在访问时需要注意,ArcGIS 文档会随软件版本更新而调整,部分链接可能因版本变化而重定向。如果遇到链接失效的情况,可以通过 ArcGIS 官方文档站点的搜索功能查找对应主题。
八、总结与展望
异常值修复是栅格数据预处理中不可或缺的环节,直接影响后续分析的准确性和可靠性。本文系统介绍了 ArcGIS 平台下基于地图代数的异常值处理方法,核心思路可以概括为「识别—提取—修复—验证」四个步骤。通过 Con 函数与 SetNull 函数的灵活运用,可以精确提取各类异常值;通过焦点统计与地图代数的结合,可以高效修复 NoData 空洞和异常值区域。
在实际应用中,异常值处理没有放之四海而皆准的固定方案,需要根据数据类型、异常值特征和分析目标进行针对性调整。本文提供的表达式示例和参数选择建议可以作为起点,读者应在此基础上结合具体数据进行试验和优化。随着 ArcGIS Pro 对地图代数和栅格分析功能的持续增强,以及 Python 脚本接口(ArcPy)的深度集成,异常值处理工作流可以进一步实现自动化和批量化,为大规模栅格数据处理提供更高效的解决方案。

