使用Python+Gdal进行批量的影像RPC正射校正
摘要
遥感影像经常会遇到大批量数据做统一处理的情况,而其影像命名由于其一级产品的生产过程有很强的规律性,天然具备批量处理的潜质。
本次针对带RPC的遥感影像批量处理,借助了Python脚本语言,使用re库(正则表达式)来处理字符串与名称搜索、os库来处理路径和文件遍历、GDAL库来进行RPC模型的正射校正,最终实现了批量正射的效果。
使用的Python及其处理库具有在window和linux等各种平台下具备易部署、易调试、易编译、易移植的特点。
方法
实验数据
数据组织如下,常见的一级带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 6037 HHZ3_20201114005237_0010_L1B_B06_CMOS3_rpc.txt
-a---- 2021/11/3 16:15 6035 HHZ3_20201114005237_0011_L1B_B06_CMOS1_rpc.txt
-a---- 2021/11/3 16:15 6037 HHZ3_20201114005237_0011_L1B_B06_CMOS3_rpc.txt
实现
代码介绍
主要分为三个函数:
- 遍历文件夹的遥感影像并生成待处理图像列表和正射之后存放的位置。
- 进行批量的正射的组织。
- 使用GDAL进行RPC矫正的封装。
完整代码
import os
import re
import numpy as np
from osgeo import gdal
import time
def RPCrect(input,output):
"""
使用
:param input:输入原始影像
:param output:输出正射影像
"""
dataset = gdal.Open(input, gdal.GA_Update)
rpc = dataset.GetMetadata("RPC")
dst_ds = gdal.Warp(output, dataset, dstSRS='EPSG:4326',
xRes=9.0909090909090909090909090909091e-5,
yRes=09.0909090909090909090909090909091e-5,
resampleAlg=gdal.GRIORA_Bilinear,
rpc=True,
transformerOptions=[r'RPC_DEM=E:\全球SRTM_90m\global']
)
def PatchGeoRectRPC(dst_list,ortho_list):
"""
批量的进行正射
:param dst_list: 待处理的影像列表
:param ortho_list: 输出正射影像的正射影像列表
"""
image_dst_list = np.loadtxt(dst_list,'str')
image_ortho_list = np.loadtxt(ortho_list, 'str')
tif_tile = re.compile(r'.tif')
for dst,ortho in zip(image_dst_list,image_ortho_list):
dst = dst.replace('\n', '')
ortho = ortho.replace('\n', '')
RPCrect(dst,ortho)
print("orthoed the input image.")
print("Patch ortho finished.")
def GetOrthoImageList(image_dir):
"""
自动读取影像,获取原始影像列表,建立正射影像的输出位置
:param image_dir: 待处理影像的文件夹
"""
image_dir_ortho = image_dir + r'\ortho'
isExists = os.path.exists(image_dir_ortho)
if not isExists:
os.makedirs(image_dir_ortho)
print(image_dir_ortho+' 创建成功')
else:
print(image_dir_ortho + ' existed')
tif_tile = re.compile(r'.tif')
dst_file = image_dir_ortho+ r"\image_list.txt"
ortho_file = image_dir_ortho + r"\image_ortho_list.txt"
f_dst = open(dst_file, 'w')
f_ortho = open(ortho_file, 'w')
gDirPath = os.walk(image_dir)
for root, dirs, files in gDirPath:
if files:
for file in files:
mo = tif_tile.search(file)
if mo:
image_dst = root + '\\' + file
img_ortho = tif_tile.sub(r'_ortho.tif',file)
image_ortho = root + '\\ortho\\' + img_ortho
f_dst.write(image_dst+'\n')
f_ortho.write(image_ortho + '\n')
print("Image list created.")
if __name__ == '__main__':
image_dir = r"D:\欧比特\2\single\28"
GetOrthoImageList(image_dir)
dst_list = image_dir + r"\ortho\image_list.txt"
ortho_list = image_dir + r"\ortho\image_ortho_list.txt"
start = time.time()
PatchGeoRectRPC(dst_list, ortho_list)
end = time.time()
print("正射校正运行时间:%.2f秒" % (end - start))
实验结果
代码运行结果
Image list created.
orthoed the input image.
orthoed the input image.
orthoed the input image.
orthoed the input image.
orthoed the input image.
orthoed the input image.
orthoed the input image.
Patch ortho finished.
正射校正运行时间:55.08秒
正射校正结果
性能
在商务本Thinkpad上,校正一张在数秒到十几秒不等,考虑到易用性,性能的要求可以略微宽容;在主机或者性能本上应该具有更好的性能表现。
|