(Python)使用Gdal进行批量的影像RPC正射校正

使用Python+Gdal进行批量的影像RPC正射校正

摘要

遥感影像经常会遇到大批量数据做统一处理的情况,而其影像命名由于其一级产品的生产过程有很强的规律性,天然具备批量处理的潜质。

本次针对带RPC的遥感影像批量处理,借助了Python脚本语言,使用re库(正则表达式)来处理字符串与名称搜索、os库来处理路径和文件遍历、GDAL库来进行RPC模型的正射校正,最终实现了批量正射的效果。

使用的Python及其处理库具有在window和linux等各种平台下具备易部署、易调试、易编译、易移植的特点。

方法

实验数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-buTyiEMJ-1636256458826)(C:\Users\卫少东\Documents\BaiduNetdiskWorkspace\个人文档\博客写作\批量进行RPC矫正\body.assets\image-20211107113200349.png)]

数据组织如下,常见的一级带rpc的产品(rpb亦可),注意一定遥感影像要带有同名“_RPC”或者“_rpc”的有理多项式模型文件:

    目录: D:\欧比特\2\single\6


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2021/11/6     23:10                ortho
-a----         2021/11/4     18:43            777 imagelist.txt
-a----         2021/11/5     16:00       51176986 HHZ3_20201114005237_0007_L1B_B06_CMOS2.tif
-a----         2021/11/5     16:00       51176986 HHZ3_20201114005237_0008_L1B_B06_CMOS2.tif
-a----         2021/11/5     16:00       51176986 HHZ3_20201114005237_0009_L1B_B06_CMOS2.tif
-a----         2021/11/5     16:00       51176986 HHZ3_20201114005237_0010_L1B_B06_CMOS1.tif
-a----         2021/11/5     16:01       51176986 HHZ3_20201114005237_0010_L1B_B06_CMOS3.tif
-a----         2021/11/5     16:01       51176986 HHZ3_20201114005237_0011_L1B_B06_CMOS1.tif
-a----         2021/11/5     16:01       51176986 HHZ3_20201114005237_0011_L1B_B06_CMOS3.tif
-a----         2021/11/3     16:15           6036 HHZ3_20201114005237_0007_L1B_B06_CMOS2_rpc.txt
-a----         2021/11/3     16:15           6036 HHZ3_20201114005237_0008_L1B_B06_CMOS2_rpc.txt
-a----         2021/11/3     16:15           6036 HHZ3_20201114005237_0009_L1B_B06_CMOS2_rpc.txt
-a----         2021/11/3     16:15           6035 HHZ3_20201114005237_0010_L1B_B06_CMOS1_rpc.txt
-a----         2021/11/3     16:15       
### 使用Python实现影像正射校正的方法 #### 工具与库的选择 为了实现影像正射校正,可以借助 `arcpy` 和其他开源工具如 `GDAL` 或者 `rasterio` 来完成。这些工具提供了丰富的功能来处理遥感影像数据。 对于基于 ArcGIS 的解决方案,可以通过 `arcpy` 提供的功能模块来进行批量处理无人机影像数据,包括正射校正和镶嵌操作[^1]。而对于更灵活的开发环境,则可以选择使用 GDAL 库中的函数接口或者 rasterio 进行自定义脚本编写。 --- #### 方法一:利用ArcPy进行正射校正 以下是通过ArcPy执行正射校正的一个基本流程: ```python import arcpy # 设置工作空间路径 workspace = r"C:\path\to\your\data" arcpy.env.workspace = workspace # 输入原始影像文件名列表 input_images = ["image1.tif", "image2.tif"] # 输出目录设置 output_directory = r"C:\path\to\output" for image in input_images: # 定义输入DEM用于高度修正 dem_path = r"C:\path\to\digital_elevation_model.dem" # 执行正射校正命令 (Orthorectify_management 函数) output_image = f"{output_directory}\\orthocorrected_{image}" arcpy.OrthoCorrect_management( Input_Raster=image, Output_Raster=output_image, DEM=dem_path, Resampling_Type="BILINEAR", Pixel_Size="" ) ``` 上述代码片段展示了如何调用 `arcpy.OrthoCorrect_management()` 函数对一组影像应用正射校正过程。此方法依赖于预先准备好的数字高程模型(DEM),并支持多种重采样方式(如双线性插值)。 --- #### 方法二:采用GDAL/OGR库实现RPC校正 如果希望摆脱专有软件限制而转向开放源码方案,那么可以考虑使用GDAL及其关联组件。下面是一个简单的例子说明怎样加载带有RPC元数据信息的卫星图像,并对其进行几何纠正: ```python from osgeo import gdal, ogr def rpc_ortho_correction(input_file, dem_file, output_file): options = [ '-of', 'GTiff', '-rpc', '-r', 'bilinear', '-co', 'COMPRESS=LZW' ] # 调用gdal.Warp() API 实施矫正 ds_out = gdal.Warp(output_file, input_file, format='GTiff', resampleAlg='bilinear', dstSRS='EPSG:4326', srcNodata=0, multithread=True, warpOptions=options) if __name__ == "__main__": input_raster = "/path/to/input/image_with_rpc.tif" dem_dataset = "/path/to/dem_data.tif" result_output = "/desired/output/orthorectified_result.tif" rpc_ortho_correction(input_raster, dem_dataset, result_output) ``` 这里我们运用了GDAL Warp API 中专门针对RPC模型设计的部分选项参数[^2]^。它允许指定不同的重采样算法以及目标坐标系转换规则等高级配置项。 --- #### 方法三:Rasterio结合NumPy矩阵运算 另一种现代做法是依靠 Rasterio 结合 NumPy 数组计算能力来自定义整个正射校正逻辑链路: ```python import numpy as np import rasterio from affine import Affine with rasterio.open('original_image.tif') as dataset: img_array = dataset.read(1) # Read first band transform_matrix = ( Affine.translation(-dataset.bounds.left, -dataset.bounds.bottom) * ~Affine.from_gdal(*dataset.transform)) new_profile = dataset.profile.copy() new_profile.update({ 'height': int(dataset.height * scale_factor), 'width' : int(dataset.width * scale_factor), 'transform': new_transform}) with rasterio.open('corrected_image.tif', 'w', **new_profile) as dest_ds: dest_ds.write(img_array.astype(rasterio.uint8), indexes=[1]) ``` 尽管这种方法更加底层化但也赋予开发者更大的灵活性去调整细节部分[^3]. --- #### 总结 以上介绍了三种主要途径用来解决Python环境下实施影像正射校正的需求——分别依托于Esri公司的ArcPy扩展包、广泛使用GDAL跨平台框架还有新兴流行的Rasterio+Numpy组合模式。每种技术路线都有其独特优势,在实际项目选型阶段需综合考量具体应用场景需求再做决定。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值