Python实战:GF-3 SAR数据预处理全流程解析(含RPC几何校正代码)
Python实战GF-3 SAR数据预处理全流程解析含RPC几何校正代码合成孔径雷达SAR数据因其全天候、全天时的观测能力在灾害监测、资源调查等领域具有独特优势。国产高分三号GF-3卫星作为我国首颗C波段多极化SAR卫星其数据预处理流程对后续应用至关重要。本文将完整解析从原始数据到几何校正产品的全流程实现重点分享Python环境下的代码级解决方案。1. 数据准备与环境配置1.1 核心工具链选择处理GF-3 SAR数据需要以下Python生态工具组合GDAL地理数据抽象层支持多种遥感数据格式Rasterio基于GDAL的栅格数据处理库NumPy科学计算基础库XML处理库解析元数据文件推荐使用conda创建独立环境conda create -n sar python3.8 conda install -c conda-forge gdal rasterio numpy1.2 数据目录结构规范建议采用以下目录结构管理项目GF3_Processing/ ├── input/ # 原始数据 ├── output/ # 处理结果 ├── dem/ # 高程数据 └── scripts/ # 处理脚本2. 元数据解析与数据读取2.1 XML元数据提取GF-3的.meta.xml文件包含关键定标参数需特别关注以下节点def parse_metadata(xml_path): tree ET.parse(xml_path) root tree.getroot() # 获取定标参数 calibration { HH: { QualifyValue: float(root[17][13][0].text), CalibrationConst: float(root[18][3][0].text) }, HV: { QualifyValue: float(root[17][13][1].text), CalibrationConst: float(root[18][3][1].text) } } return calibration2.2 复数数据读取GF-3 L1A级数据包含实部与虚部信息def read_complex_data(tiff_path): dataset gdal.Open(tiff_path) band1 dataset.GetRasterBand(1) complex_array band1.ReadAsArray() # 分离实部虚部 real_part np.array(complex_array[0, :, :], dtypefloat32) imag_part np.array(complex_array[1, :, :], dtypefloat32) return real_part, imag_part3. 辐射定标与数据转换3.1 强度与幅度计算SAR数据的基础物理量计算def calculate_intensity(real, imag): intensity real**2 imag**2 amplitude np.sqrt(intensity) return intensity, amplitude3.2 辐射定标流程完整的1A到1B级数据转换def radiometric_calibration(amplitude, qualify_1A, qualify_1B): # 1A到1B转换 DN amplitude / 32767 * qualify_1A / qualify_1B * 65535 # 辐射定标 sigma0 (DN * (qualify_1B / 65535))**2 # 转dB sigma0_db 10 * np.log10(sigma0) - calibration_const return sigma0_db注意QualifyValue_1B需要通过统计全图幅度值计算获得建议使用np.nanmax避免无效值影响4. 图像增强与几何校正4.1 自适应对比度拉伸2%线性截断拉伸实现def linear_stretch(data, percent2): vmin np.percentile(data, percent) vmax np.percentile(data, 100-percent) stretched (data - vmin) / (vmax - vmin) stretched[stretched 0] 0 stretched[stretched 1] 1 return stretched4.2 RPC几何校正基于有理多项式系数的几何校正实现def rpc_orthorectification(input_path, output_path, rpc_file): # 读取RPC参数 with open(rpc_file) as f: rpc_meta parse_rpc_parameters(f.read()) # 设置GDAL RPC元数据 ds gdal.Open(input_path) ds.SetMetadata(rpc_meta, RPC) # 执行校正 gdal.Warp(output_path, ds, dstSRSEPSG:4326, rpcTrue, resampleAlgbilinear)典型RPC参数文件(.rpc)包含以下关键参数参数组描述LINE_OFF行偏移量SAMP_OFF列偏移量LAT_OFF纬度偏移LINE_NUM_COEFF行分子多项式系数LINE_DEN_COEFF行分母多项式系数5. 完整处理流程集成5.1 批处理框架设计建议采用面向对象方式组织代码class GF3Processor: def __init__(self, input_dir): self.input_dir input_dir self.metadata self._load_metadata() def process_all(self): for pol in [HH, HV, VV]: self.process_polarization(pol) def process_polarization(self, polarization): # 实现单极化通道完整流程 pass5.2 典型问题排查常见问题及解决方案数据值异常检查XML元数据是否完整验证QualifyValue是否为有效数值几何校正偏差确认RPC文件与影像匹配检查目标坐标系设置内存不足分块处理大数据量文件使用rasterio.windows进行分块读取处理不同极化数据时需要特别注意交叉极化(HV/VH)与同极化(HH/VV)的定标参数差异DH模式数据的特殊处理方式各极化通道的独立校正需求