简介:面向 SAR 遥感初学者的 GF-3 高分三号卫星影像处理资料,服务于需要使用 SARscape 完成 SAR 数据预处理的学生、科研人员与工程技术人员,解决从 GF-3 原始数据到可分析强度影像的流程落地问题。文档围绕完整作业链展开:先介绍系统参数设置,再说明 GF-3 数据导入与极化选择,接着处理多视和单通道强度滤波,并延伸至地理编码、辐射定标及 DEM 使用;对入射角、分辨率换算、视数、滤波方法、窗口大小等关键参数均有具体说明,也提示了制图网格尺寸、输出文件后缀等易错细节。资源包仅 1 个 docx 文件,大小 4.58MB,图文结合、步骤清晰,适合边看边操作,也可作为课堂实训或课题实验的参考手册。目前已有 1573 人学习浏览,可视为 GF-3 预处理入门与排错参考。读者可据此快速搭建处理链路,减少参数试错,得到更规范的强度产品和地理编码结果。
1. 高分三号影像处理:从原始信号到能用的地物产品要走完哪几步
用过光学影像的人第一次拿到GF3卫星影像时,十有八九会把它当成一张“能看的图”直接拉伸、裁剪、分类,然后发现结果五花八门:水面一片白、山体严重变形、城市像被揉过一样。这不是数据质量差,而是GF3作为一颗C波段SAR卫星,成像原理和光学完全不同,处理链路也完全不同。GF3卫星影像的详细处理步骤,本质上是一条从原始信号走向定量产品的流水线:产品分级识别、辐射定标、滤波去斑、地形校正,再到极化分解或时序分析。这篇文章会把这条流水线上的每一步拆开,说清参数怎么设、为什么这么设、哪些环节最容易翻车。适合刚拿到GF3数据准备做地物分类、地表形变或海洋监测的从业者,也适合已经处理过几景但总在定标或几何校正环节反复踩坑的人。
2. 拿到GF3数据先别急着定标:产品分级与数据目录里有什么
2.1 GF3产品分级:你手里的数据能做什么,不能做什么
GF3的标准产品按处理深度分为原始回波数据、单视复数影像、多视距影像和地理编码影像等几个级别。实际分发到用户手里的最多的是单视复数产品,也就是SLC,它保留了每个像元的相位信息,是后续做InSAR形变测量、极化分解的底线数据。如果平台直接给了你已经完成几何校正的地理编码产品,那相当于别人替你走完了后处理,拿来可以直接分类或反演,但代价是相位信息往往已经被破坏,形变类任务基本做不了。
拿到数据后第一件事是看产品文档里的“Product Level”字段。SLC产品的特征是保留了复数相位、像元在斜距成像平面上排列,直接打开看到的强度图还会带明显的几何变形。如果你只需要一张用于目视解译的假彩色图,可以找平台同时分发的多视产品;如果你要做的是滑坡形变、地面沉降这类毫米级测量,必须用SLC。另一点注意:GF3的模式决定了分辨率范围很大,条带模式下的1米分辨率影像和扫描模式下的几十米分辨率影像,处理参数差别很大,不要用同一套流程跑。
2.2 数据包目录解读:product.xml里藏着处理的关键参数
GF3数据包通常是一个以GF3开头的文件夹,里面是产品说明XML、各极化波段的栅格文件、轨道参数文件和坐标参考信息。不要一上来就把栅格文件拖进GIS软件,先把XML读一遍。XML里记载着极化方式、中心入射角、轨道方向、成像时间、定标常数等字段,这些参数决定了后面处理链路怎么选。我在处理一景数据时,习惯先写个脚本把关键字段抽出来,确认没拿错极化、入射角是否适合当前地形。
下面这段Python代码可以快速提取GF3产品XML里的关键字段,不依赖固定XML schema,遇到版本差异也稳:
import xml.etree.ElementTree as ET import re def parse_gf3_xml(xml_path: str) -> dict: tree = ET.parse(xml_path) root = tree.getroot() raw_text = ET.tostring(root, encoding='unicode') fields = {} patterns = { 'polarization': r'polarization[^>]*>([A-Z]{2})', 'incidence_angle': r'incidenceAngle[^>]*>([\d.]+)', 'orbit_pass': r'passDirection[^>]*>([A-Z]+)', 'product_level': r'productLevel[^>]*>([A-Z0-9_]+)', 'start_time': r'startTime[^>]*>([\dTZ:.\-]+)', } for key, pattern in patterns.items(): matched = re.search(pattern, raw_text, re.IGNORECASE) if matched: fields[key] = matched.group(1) return fields if __name__ == '__main__': info = parse_gf3_xml('product.xml') print(info)这段代码的核心思路是用正则表达式在整份XML文本里找目标字段,而不是按固定层级解析。因为GF3不同批次的产品XML标签层级有差异,但有意义的字段名比较稳定。输出结果里应至少看到极化方式为HH或HV这类双字母,入射角是一个十几到五十几的数值,轨道方向是ASCENDING或DESCENDING。如果入射角是空值,说明XML解析路径不对,打开XML原文查看字段的真实大小写再改正则。提取出的极化方式和入射角,直接影响到第4章里滤波窗口和地形校正的参数选择。
2.3 SNAP里检查数据的两个动作:导入确认与轨道状态
拿到数据后先别急着跑定标。用SNAP的File → Open Product打开数据包,观察Product Explorer里的元数据树。重点看两点:一是极化通道是否全部正确加载,GF3全极化数据应该有HH、HV、VH、VV四个强度图层;二是轨道信息是否被识别。SNAP读取GF3产品时有概率出现轨道状态显示为空的情况,也就是Orbit节点下没有任何辅助数据。轨道缺失不会立刻让定标报错,但后面一旦要做地形校正或InSAR配准,几何关系就对不上,成品会偏出几百米。
如果轨道信息为空,常规做法是先在Radar菜单中选择Apply Orbit File。弹出的对话框里如果列出可用的外部轨道,优先选用;如果提示无法匹配轨道文件,说明数据自带轨道格式与当前软件版本不完全兼容。这时候不要恋战,换ENVI SARscape或PIE-SAR读同一包数据,看轨道是否解析成功。这个检查动作只用两分钟,却能避免后面跑完一整套流程才发现定标结果全是无效值这种尴尬。
3. SNAP里跑通GF3标准处理链路:定标、滤波、地形校正
3.1 为什么必须辐射定标:DN值不是后向散射系数
GF3原始SLC影像里的像元值不是地物真实的微波散射强度。它只是传感器记录的DN值,混合了系统增益、距离衰减、天线方向图等因素。不同时间去观测同一片农田,DN值可能差一大截,但这不代表地物真的变了。所以做定量分析的第一步是把DN值转化为后向散射系数,常见的有β0、σ0、γ0三种。σ0是地物在水平面上的散射截面,适合平原和缓坡;β0直接用斜距几何,适合陡峭山区;γ0把参考面转到垂直于雷达视线方向,是地形起伏剧烈区域相对合理的归一化基准。
SNAP里的Calibrate算子会自动读取GF3产品XML里的定标常数,不需要你手动套公式。但输出选择上要动一下脑筋:如果后续做地物分类,选σ0就行,单位建议选dB;如果目标是山区地表形变或复杂地形反演,用β0或γ0更稳妥。此外,定标必须逐极化进行。很多人图省事只定标HH通道,认为HV是辅助信息,结果做极化分解时缺了关键通道而被迫返工,这是最常见的流程翻车点。
3.2 十步出图:定标到地形校正的完整参数表
下面这套流程是我处理GF3单景影像的常用链路,以SNAP界面操作为例,参数按多数场景预设:
- File → Open Product,选择GF3数据包,确认四个极化通道都出现在Product Explorer里。
- Radar → Apply Orbit File,若轨道识别失败则手动指定数据包内轨道文件。
- Radiometric → Calibrate,Output选择Sigma0,单位dB,选中所有极化通道。
- Filtering → Speckle Filter,滤波器选Refined Lee,窗口大小按用途决定。
- Geometric → Terrain Correction,DEM选SRTM 3Sec或Copernicus 30m,像素网格重设为10米。
- Raster → Convert to GeoTIFF,导出为单波段或多波段GeoTIFF。
| 步骤 | 关键参数 | 建议值 | 设计理由 |
|---|---|---|---|
| 定标 | 输出类型 | Sigma0 + dB | 常规分类和统计反演的最直观形式 |
| 定标 | 极化通道 | 全部 | 后续极化分解需要完整矩阵 |
| 滤波 | 窗口大小 | 3x3或5x5 | 3x3保留细节用于形变,5x5压噪声用于分类 |
| 地形校正 | DEM | SRTM 3Sec | 30米网格与GF3常用分辨率匹配,兼顾精度和内存 |
| 地形校正 | 像素网格 | 10米 | 避免过度采样导致文件膨胀,也与多数GF3标称分辨率对齐 |
| 地形校正 | 重采样方法 | Bilinear | 对定标后连续值影像平滑,避免最近邻产生锯齿 |
这套流程跑完,你会得到一幅已经归一到UTM投影、像元大小为10米的后向散射强度图。把它叠加到光学影像上,水库、农田、城市的基本轮廓应当大致吻合。如果山体像被扭成麻花,说明地形校正时DEM没有正确参与计算,回到第5步检查DEM选择。如果影像看起来像蒙了一层白纱,噪声严重,说明滤波环节没生效或者窗口太小。
3.3 gpt批处理:一景一景手动操作太慢时的自动化方案
SNAP的手动操作适合单景调试,但做区域级项目时,一二十景影像全手动跑会占用大量时间。SNAP提供了命令行工具gpt,配合Graph Builder保存的处理图,可以在服务器上批量跑同一套流程。先在Graph Builder里把定标、滤波、地形校正串成一个处理图,导出为XML,然后用下面的脚本批量执行:
#!/bin/bash DATA_DIR="/data/GF3_scenes" GRAPH="/graphs/gf3_chain.xml" for scene in "$DATA_DIR"/*/product.xml; do out_dir="$(dirname "$scene")/output" mkdir -p "$out_dir" gpt "$GRAPH" \ -Pinput="$scene" \ -Poutput="$out_dir/sigma0_utm.tif" \ -q 4 -c 8G echo "done: $scene" done这里的-Pinput和-Poutput是覆盖处理图里的源数据路径和输出路径,-q 4表示用4个线程并行计算,-c 8G是给gpt分配8GB内存上限。在线程数和内存分配上,别贪大。GF3全极化数据一景就有好几个波段,地形校正阶段内存占用会突然冲高,经常出现整机内存还剩下几个G却已经卡死的情况。我的习惯是先拿一景跑通,确认处理图没有问题后再放开循环批量处理。另外,批量脚本每跑完一景就打印一行提示,方便定位哪一景出了问题。
4. 参数与几何失真:处理完不代表能用
4.1 叠掩与阴影:山区SAR影像里的“揉过”现象
SAR是侧视成像,雷达波从侧面照射地面,这导致山区影像里出现三类光学影像没有的几何畸变:透视收缩、叠掩、阴影。面向卫星的陡坡在影像上会被压缩成一片高亮的窄条,严重时还会产生顶部和底部颠倒的叠掩现象;背向卫星的坡面则收不到雷达波,直接形成黑色阴影。很多人第一次处理GF3山地数据,看到这两类区域会以为定标失败,其实这是正常的SAR几何特性。
判断畸变区域的方法不靠肉眼猜,而是看地形校正时生成的局部入射角图。SNAP的Terrain Correction可以输出经DEM修正后的局部入射角图层,把它和强度图叠加查看。平坦地面、面向雷达的坡、背向雷达的坡,入射角差异非常明显。处理原则是:叠掩区和阴影区的后向散射系数不可信,后续做定量反演时必须掩膜掉,否则统计出的均值、方差全是错的。我一般建议坡度大于30度的地区不要完全依赖单一轨道的GF3数据,至少加一个反向轨道的数据做互补。
4.2 滤波核的选择:把斑点噪声滤掉还是把目标滤掉
SAR影像天然带斑点噪声,这是相干成像造成的,本质上是一种乘性噪声。光学图像上常用的高斯滤波对SAR是灾难:它会把一片均匀水面的波动抹成平滑区,同时把建筑纹理也一并擦掉。常见的SAR专用滤波有Lee、Refined Lee、Frost、Gamma-MAP。Lee是基础款,简单有效但保边一般;Refined Lee在保持边缘方面更好,适合建成区和道路场景;Frost是自适应的,窗口内均质性不同时滤波强度也不同;Gamma-MAP对纹理丰富的区域效果较好,适合植被分类。
参数上最敏感的是窗口大小。3x3滤波保留细节,但斑点噪声残余明显;5x5是分类场景的平衡点;7x7以上能获得很“干净”的影像,代价是小目标被吞掉。用等效视数来定量判断滤波效果:ENL等于影像均值除以标准差的平方,数值越大代表斑点抑制越好。但不要只追求ENL高,滤波后的纹理信息损失是隐性的。我的经验是:如果目标是把林地、农田、水面分开,5x5 Refined Lee够用;目标是提取道路和建筑边缘,3x3更好;后续要做目标检测,宁可不滤波,靠极化信息去噪也别用大窗口毁细节。
4.3 地形校正后影像还是“阴阳脸”:局部入射角归一化
地形校正处理完成后,还有人会发现山体两侧亮度明显不一致,迎坡面亮、背坡面暗,这不是校正没做干净,而是后向散射强度本来就受局部入射角影响。雷达波照射方向与坡面法线的夹角越小,回波越强,反之越弱。SRTM DEM参与地形校正是解决几何位置的错位,但它不解决辐射亮度随地形起伏的不均匀。
一个常见做法是做局部入射角归一化,公式为:σ_norm = σ_local × (cos θ_ref / cos θ_local)ⁿ。其中θ_ref是参考入射角,一般取影像中心入射角,θ_local是地距DEM算出的每个像元的局部入射角,指数n通常取1或2。通俗讲,就是把每个像元的散射强度折算成“如果这里没有地形起伏,应该是什么值”。SARscape里有专门做辐射地形校正的工具,原理就是这个归一化。需要提醒的是,这个公式在坡度超过40度的区域会失效,局部入射角接近90度的地方归一化后的值会爆炸,仍要结合掩膜使用。做完这一步,同一轨影像内同类地物亮度分布会稳定得多,分类模型也能少学一些伪特征。
5. GF3处理避坑指南:五条经典翻车记录
5.1 SNAP闪退或内存爆掉:全分辨率一起处理的代价
现象:处理到地形校正阶段时,SNAP界面先是长时间无响应,接着直接退出,或者gpt进程卡死不动。很多人的第一反应是电脑太差,其实多数情况是SNAP默认的Java堆内存太小。
原因:GF3全极化SLC数据包含多个复数波段,导入后SNAP会在内存里同时维持复数、强度、定标后多个中间结果。一景数据可能吃掉十几个G内存,而SNAP默认只分配2到4G。
解决:打开SNAP安装目录下的etc/snap.conf文件,找到maxMemory这一行,把值调成物理内存的一半左右。调整后重启SNAP再跑流程。同时控制并行度,gpt命令里的-q不要超过4,-c不要超过物理内存的60%。我一景全极化数据从SLC到地形校正,分配8G堆内存时基本能平稳跑完,超过这个数反而会触发系统级别的内存抖动。
5.2 轨道信息匹配不上:定标输出全零值的元凶
现象:Calibrate算子执行完,输出图象限值全是0或极小负值,几何信息看着也不对。检查原数据时,SNAP的Orbit节点是空的,没有任何轨道状态矢量。
原因:GF3数据包中轨道参数的存储格式与SNAP当前版本不能完全兼容,软件没有自动解析出来。没有轨道信息,定标算子无法计算准确的天线方向图修正,某些版本会直接输出失败或者不可用值。
解决:遇到轨道为空不要硬跑,先用Apply Orbit File尝试匹配外部轨道。如果界面里没有候选轨道,打开数据包里的metadata文件,确认轨道参数是否写在里面。如果软件确实无法识别,常见做法是把数据交给ENVI SARscape读取,或者使用PIE-SAR的GF3专用插件处理,二者对国产SAR数据的兼容性更友好。在项目周期上,这个坑建议提前排查,不要等批量处理跑到一半才发现整批数据都缺轨道。
5.3 水面亮斑被当成舰船目标:虚警的锅不该全让算法背
现象:海面或大型水库影像上出现很亮的目标点,形状像船。自动检测程序也把它标出来,但现场核查发现什么都没有。
原因:C波段SAR对水面粗糙度极其敏感。平静水面在低入射角下可能产生布拉格共振,形成强后向散射区;风吹过水面形成的辐合带也会让大片水面变亮。加上GF3的入射角覆盖范围大,在低入射角模式下水面亮度和金属目标差异并不明显。
解决:不要只用单极化强度图做舰船检测。全极化数据下,船舶目标在HH极化中呈亮斑,交叉极化HV中也有一定信号,而水面亮斑在HH中亮,但HV通道往往很暗。把HH和HV两张定标图叠加判断,或者直接用Pauli分解后的偶次散射通道,可以有效滤掉大部分水面虚警。如果是单极化数据,保守做法是结合风速预报数据和入射角图,入射角小于25度时的水面亮斑都不建议直接判定为船。
5.4 滤波核开得太大:分类精度反向下降
现象:滤波后的影像目视效果很好,斑点压得很干净,但跑分类或分割时精度反而比不滤波还差。建筑区和小型水体大量错分。
原因:大窗口滤波器把同质区域的纹理也一起抹掉了。SAR影像里的建筑区恰恰靠高纹理特征来区分于裸地,滤完之后信息熵下降,分类器的区分依据被削弱。
解决:滤波参数跟着用途走。做面向对象分类时,窗口控制在5x5以内,并且用保边类的Refined Lee或Frost;做像元级统计反演时,3x3足够。如果你想确认滤波有没有过度平滑,别只看ENL,把滤波前后的影像做逐像元差值图,如果差值图里出现了明显的建筑轮廓和道路线,说明有用的边缘信息已经被当噪声滤掉了。
5.5 地形校正后影像偏移几百米:坐标系没有对齐
现象:把GF3地形校正结果叠加到光学底图上,发现山脊、河道的位移达到几百米,山区更明显。流程和数据都重跑过,依旧偏。
原因:一是GF3自身的定位精度本身在几十米量级,不加控制点只靠轨道和DEM做地形校正,不可能和已经做过正射校正的光学影像完全重合。二是DEM的高程基准问题,SRTM和我国常用的85高程基准存在差值,山区这种差几米到几十米的高程差就会带来明显的平面位移。
解决:精度要求不高、只做目视叠加的话,地形校正后加一个影像配准步骤,用二次多项式把SAR影像扭到光学底图上。精度要求高、后面还要做时序分析的话,最好用地面控制点做精轨修正,控制点选在道路交叉口、孤立建筑物、人工角反射器这些强散射且点位明确的特征上。两幅影像叠加后残留位移控制在1个像元内再进入下一步。
6. 成果验证与极化后处理
6.1 用已知地物验证定标结果:水体、角反射器与GDAL采样
处理完的影像不能只看颜色。一个快速且有效的验证方法是抽几个已知目标点,把影像上的后向散射值和理论值对比。水体在C波段HH极化下的σ0通常在-16到-20dB之间;城市密集区的σ0大约在-5到-8dB;裸地一般处于-12到-16dB。如果水体区取值-9dB,定标或滤波环节大概率有问题。
用GDAL从成果影像上取点值,比用GIS软件逐个点鼠标高效得多。下面的脚本实现经纬度到像元坐标的转换并读取定标值:
from osgeo import gdal, osr def sample_sigma0(tif_path: str, lon: float, lat: float) -> float: ds = gdal.Open(tif_path, gdal.GA_ReadOnly) gt = ds.GetGeoTransform() img_srs = osr.SpatialReference() img_srs.ImportFromWkt(ds.GetProjection()) wgs84 = osr.SpatialReference() wgs84.ImportFromEPSG(4326) transform = osr.CoordinateTransformation(wgs84, img_srs) x, y, _ = transform.TransformPoint(lon, lat) col = int((x - gt[0]) / gt[1]) row = int((y - gt[3]) / gt[5]) band = ds.GetRasterBand(1) value = band.ReadAsArray(col, row, 1, 1)[0, 0] ds = None return value print(sample_sigma0('sigma0_HH_utm.tif', 112.3456, 33.4567))有条件的团队可以布设角反射器做更严格验证。方形三面角反射器的理论雷达散射截面为σ = 4πA⁴/λ²,其中A是角边长度,λ是雷达波长。GF3的C波段波长约5.6厘米,边长为1.5米的角反射器理论RCS值约55.3dBsm,影像上提取的σ0与理论值之差在±1dB以内,说明定标链路可靠。这个验证方法特别适合InSAR项目前期评估GF3数据质量。
6.2 多极化合成与Pauli分解:把GF3的全极化信息彻底用起来
GF3全极化数据的四个极化通道是它区别于多数商业SAR卫星的优势。把定标后的HH、HV、VV做RGB合成,R放HH、G放HV、B放VV,默认颜色关系里植被呈绿色,城市呈粉红色,水面呈深色,地物区分度比单极化灰度图高一个量级。这个合成图可以直接作为底图用于目视解译,也能作为训练样本标注的参考。
进一步的做法是Pauli分解,SNAP里通过Radar → Polarimetric → Polarimetric Matrix生成极化协方差矩阵,再运行Decomposition选Pauli基,输出三个通道:HH+VV对应单次散射、HH-VV对应偶次散射、2HV对应体散射。分解后,城市建筑物在HH-VV通道上呈现强信号,林地植被在2HV通道占优,裸地和水面在HH+VV通道更明显。结合第4章的局部入射角图和坡度掩膜,Pauli分解对岩性识别和受灾评估的用处很大。需要提醒的是,Pauli分解对配准精度敏感,四个极化通道之间必须严格配准,好在GF3产品在同一数据包内的通道一致性通常比较好。
6.3 把处理链沉淀成可复用脚本:先小窗口测试,再全量跑
做了几景GF3数据处理后,最值得花的力气是把SNAP处理图、gpt批处理脚本、GDAL验证脚本固定下来,放进项目仓库里版本管理。处理图里的DEM类型、滤波方法、输出分辨率这些参数要写清楚默认值和理由,这样项目换人接手时不会凭感觉乱改。
我的习惯是先在一个包含山地、水体、建成区的小窗口范围内跑完整条链路,确认定标值合理、几何偏移小于一个像元、滤波没有抹掉关键纹理,然后再放全图。批量处理时每跑完一景自动生成一个质量报告,包含各极化通道的均值、标准差和已知水体点采样值。这套习惯帮我避开了很多后续重算的坑,也希望GF3数据的新用户能少走一点当初我走过的弯路——希望帮到你。
本文还有配套的精品资源,点击获取