ArcGIS影像空值填充\插补

本文介绍了使用ArcGIS的栅格计算器处理遥感影像空值的方法,包括利用前后月或年前后同日期的影像进行填充,以解决因云层遮挡等原因造成的影像缺失问题。通过条件函数Con和IsNull判断并填充空值,从而改善影像质量。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

遥感,遥远的感知。既然是遥远的,就避免不了会出现看不清的现象:比如被天空中的云遮挡住,冬天地物被雪覆盖住等等,就会导致影像出现空值缺失值等。


下面将是对空值处理的一种思路:

MODIS产品中的部分异常值区域采用同产品的前一个月或者后一个月的相同位置的值填充,或选择同产品的前一年或后一年的相同时间的相同位置的值做填充处理,或选择其周围相邻3×3位置的像元均值填充。

方法一:巧用栅格计算器来填充影像

存在较多空值的影像:图A,日期是19年1月25日
在这里插入图片描述
质量较好的影像:图B,日期是19年2月2日
在这里插入图片描述

那么我们可以用
a.拿前后一年的同日期影像来填充(如18年1月25日或者20年1月25日,或者18年1月25日和20年1月25日这两年的平均值来填充19年1月25日);
b.拿相邻月份的影像来填充(如那19年2月2日的影像来填充,虽然是2月份的,但也就相差不到10天19年1月25日)

采用栅格计算器输入以下公式即可:

Con(IsNull(“mod_19_01_25”),“mod_19_02_02.tif”,“mod_19_01_25.tif”)

通过IsNull(“mod_19_01_25"来判断该"mod_19_01_25"栅格是否存在nodata,如果存在则将nodata的地方用"mod_19_02_02.tif"影像对应的地方的值来填充,如果不存在则返回原值,也就是"mod_19_01_25.tif”。(Con是条件函数,IsNull判断是否存在nodata,

填充后的结果如下:

(第一个图层是19年1月25日填充后的栅格;第二个图层是19年1月25日的原始栅格;第三个是用来填充的19年2月2日的图像。)
下图就是19年1月25日填充后的结果图:
该点是原始图有值,这填充后的还用原始值:
在这里插入图片描述
该点是原始图为nodata,则用19年的2月2的栅格的值来填充该点。
在这里插入图片描述

注意:

空值的填充具体是用前后月的来填充还是前后年的值来填充,要具体分析。如过原始图像质量太差或者,原始图像和 用来填充的图像 之间差异较大那么填充后的质量也一般,会有颜色突变的问题,不平滑,不能为了填充为填充。

参考文献:

1.《基于MOD16的乌江流域地表蒸散发时空特征及影响因素》
MODIS产品中的部分异常值区域采用同产品的前一个月或者后一个月的相同位置的值填充,或选择同产品的前一年或后一年的相同时间的相同位置的值做填充处理,或选择其周围相邻3×3位置的像元均值填充。

2.《基于CSLE的福建省闽清县水土流失动态监测与分析》
MODIS-NDVI数据预处理:首先是原始数据的格式转换,其次将所有影像进行投影变换,转换成要求的空间参考坐标系,最后利用异常或空值区域相邻月份的值进行逐像素填充和修补,以获得有效值相对完整的项目区NDVI产品数据。

3.《郑州市三维扩张与地表温度的时空变化研究》

import arcpy # ArcGISPython模块,用于地理数据处理 import numpy as np # 数计算库,处理数组 import pandas as pd # 数据处理库,类似Excel表格 from sklearn.svm import SVC # 支持向量机分类模型 from sklearn.preprocessing import StandardScaler # 数据标准化工具 # 设置工作空间(您的数据存放位置) arcpy.env.workspace = r"E:\py_train\20250615\luoyang\svm\1" # 修改为您的实际文件夹路径 arcpy.env.overwriteOutput = True # 允许覆盖已有文件 # 输入数据 sample_points = "dzd_0_1.shp" # 您已经准备好的点文件(200灾害点+400非灾害点) # 定义点文件中的字段名(您需要根据实际情况修改) factor_fields = ["dist", "podu", "zdmd", "3cd", "lizhi", "2ld", "nianxing", "curva", "ndvi","shuixi","jiangyu"] label_field = "leixing" # 这个字段标记点是灾害点(1)还是非灾害点(0) # 从点文件中读取数据 print("从点文件读取已提取的因子...") fields = factor_fields + [label_field] # 需要读取的所有字段 data_dict = {field: [] for field in fields} # 创建空字典存储数据 # 使用游标读取所有属性(类似打开Excel表格读取数据) with arcpy.da.SearchCursor(sample_points, fields) as cursor: for row in cursor: for i, field in enumerate(fields): data_dict[field].append(row[i]) # 逐行读取数据 # 转换为DataFrame(类似Excel表格) df = pd.DataFrame(data_dict) print(f"成功读取 {len(df)} 个样本点数据") # 分离特征(X)和标签(y) X = df[factor_fields] # 所有因子(坡度、坡向等) y = df[label_field] # 灾害类型(0或1) # 清理无效(删除空数据) df_clean = df.dropna() if len(df) != len(df_clean): print(f"移除 {len(df) - len(df_clean)} 个包含空值的样本") X = df_clean[factor_fields] # 清理后的因子 y = df_clean[label_field] # 清理后的标签 # 数据标准化(非常重要!) print("标准化数据...") scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 转换为标准格式 print("训练SVM模型...") # 创建支持向量机分类器 svm_model = SVC( kernel='rbf', # 使用径向基函数(最常用) C=1.0, # 正则化参数(默认) gamma='scale', # 核函数系数(自动计算) probability=True # 输出概率(0-1之间) ) # 使用全部数据训练模型 svm_model.fit(X_scaled, y) print("SVM模型训练完成") # 读取所有栅格数据 raster_arrays = {} print("读取栅格数据...") for name in factor_fields: # 遍历所有因子 path = f"{name}.tif" # 假设栅格文件名与字段名相同 print(f" - {path}") # 使用arcpy.RasterToNumPyArray而不是从sa导入 raster_arrays[name] = arcpy.RasterToNumPyArray(path) # 转换为数组 # 获取参考栅格信息(用于结果输出) ref_raster = f"{factor_fields[0]}.tif" # 第一个栅格 desc = arcpy.Describe(ref_raster) cell_size = desc.meanCellWidth # 像元大小(30米) extent = desc.extent # 范围 spatial_ref = desc.spatialReference # 坐标系 # 创建全区预测网格 rows, cols = raster_arrays[factor_fields[0]].shape prediction = np.zeros((rows, cols), dtype=np.float32) # 分块处理(避免内存不足) block_size = 1000 # 每次处理1000行 print(f"开始全区预测,总行数: {rows},块大小: {block_size}行") for i in range(0, rows, block_size): i_end = min(i + block_size, rows) print(f"处理行 {i} 到 {i_end-1} ({i_end-i}行)") # 提取当前块的所有因子 block_data = {} for name in factor_fields: block_data[name] = raster_arrays[name][i:i_end, :].flatten() # 创建数据框 block_df = pd.DataFrame(block_data) # 标准化(使用与训练数据相同的缩放器) block_scaled = scaler.transform(block_df) # 预测灾害发生概率 proba = svm_model.predict_proba(block_scaled)[:, 1] prediction[i:i_end, :] = proba.reshape((i_end - i), cols) print("生成易发性栅格...") # 将预测数组转为栅格 # 使用arcpy.NumPyArrayToRaster而不是从sa导入 susceptibility_raster = arcpy.NumPyArrayToRaster( prediction, # 预测结果数组 arcpy.Point(extent.XMin, extent.YMin), # 左上角坐标 cell_size, cell_size # 像元大小 ) # 设置坐标系 arcpy.management.DefineProjection( in_dataset=susceptibility_raster, coor_system=spatial_ref ) # 保存结果 output_raster = "Geohazard_Susceptibility.tif" susceptibility_raster.save(output_raster) print(f"易发性栅格已保存至: {output_raster}") print("处理完成! ") 以上代码在arcgis pro 2.8 notebook中提示ValueError Traceback (most recent call last) In [1]: Line 97: block_df = pd.DataFrame(block_data) File C:\Users\Administrator\AppData\Local\ESRI\conda\envs\arcgispro-py3-clone\lib\site-packages\pandas\core\frame.py, in __init__: Line 529: mgr = init_dict(data, index, columns, dtype=dtype) File C:\Users\Administrator\AppData\Local\ESRI\conda\envs\arcgispro-py3-clone\lib\site-packages\pandas\core\internals\construction.py, in init_dict: Line 287: return arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype) File C:\Users\Administrator\AppData\Local\ESRI\conda\envs\arcgispro-py3-clone\lib\site-packages\pandas\core\internals\construction.py, in arrays_to_mgr: Line 80: index = extract_index(arrays) File C:\Users\Administrator\AppData\Local\ESRI\conda\envs\arcgispro-py3-clone\lib\site-packages\pandas\core\internals\construction.py, in extract_index: Line 401: raise ValueError("arrays must all be same length") ValueError: arrays must all be same length
06-17
### 使用ArcGIS处理和填充影像数据的空值ArcGIS中,针对影像中存在的`NoData`,可以通过多种方法来实现有效的填补。对于少量的`NoData`区域,采用邻域统计分析是一种常见的方式。 具体而言,在ArcMap环境中,通过访问`Spatial Analyst Tools`下的地图代数工具集内的栅格计算器功能,能够执行复杂的条件判断与计算逻辑以达到修复目的。为了用邻域内像元的平均替代这些无效的数据位置,可构建如下表达式: ```python Con(IsNull("raster"), FocalStatistics("raster", NbrRectangle(5, 5, "CELL"), "MEAN"), "raster")[^1] ``` 此命令的作用在于:当检测到当前像元为`NoData`时,则以其周围定义形状区域内其他有效数的算术平均作为新;如果不是`NoData`则保持原样不变。“长方形”的尺寸参数可以根据实际需求调整,比如增大或减小区间范围以便更好地匹配特定场景的要求[^2]。 除了矩形窗口之外,还有圆形(`NbrCircle`)、环状(`NbrAnnulus`)等多种不同形态的选择可供灵活运用,从而满足多样化的应用背景下的精确度和平滑效果要求。 另外一种思路是基于时间序列的概念来进行前后年的均填充,即如果有多年份相同地理位置上的遥感资料可用的话,那么就可以考虑将相邻两年对应位置处观测得到的结果相加再除以样本数量得到估计用于弥缺失部分。不过这种方法适用于具有连续多期次测量记录的情况,并不是所有情形都适用。 最后得注意的是,在进行上述任何一项操作之前,请务必确认选择了恰当的像素存储格式选项,以免因设置不当而导致最终输出成果失真等问题的发生[^3]。
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值