直接开场,不绕弯子。全极化SAR图像分类,说白了就是把雷达影像里每个像素归到地物类别里,比如农田、森林、水体、建筑。这事儿的难点不在分类算法本身,而在前处理——极化SAR数据比光学影像麻烦得多,又是定标又是滤波又是地形校正,一步没做好,后面分类精度直接拉胯。SNAP是欧空局开源的SAR处理平台,全名叫SeNtinel Application Platform,当年主要给Sentinel系列数据配套用的,但现在大多数星载SAR数据它都能读,全极化处理链路也很完整。这篇文章我按自己的实操经验,从数据准备、预处理、极化分解到分类实现,把整条流程串起来讲一遍。适合刚接触极化SAR、被SNAP里一堆算子搞得晕头转向的科研人员和工程师。
先说结论:SNAP做全极化SAR分类,核心思路是“预处理 + 特征提取 + 分类器”三段式,预处理用SNAP的Graph Builder串联,特征提取用极化分解生成特征图,分类可以留在SNAP里做,也可以导出到Python里跑随机森林或者深度学习模型。下面每一段我都给出参数和理由,照着做就能跑通。
1. 打基础:SNAP、全极化SAR和你要准备的数据
1.1 为什么非要用SNAP
行业内做极化SAR处理的工具其实有不少,PCI、PolSARPro、ENVI的SARscape模块都有人用,但SNAP有它独特的优势:
第一是免费开源,这对高校和科研院所特别友好,没有license限制,装几台机器都行。第二是处理链路完整,从原始SLC数据读取、定标、滤波、地形校正,到极化分解、分类,全都在一个软件里完成,不需要在多个软件之间导来导去。第三是Graph Builder这段设计很巧妙,你可以把整条处理链保存成XML流程,批量跑数据的时候一劳永逸——这个后面我会重点讲。
当然SNAP也有缺点,最大的问题是处理大影像时内存开销大,处理一景全极化Sentinel-1 SLC数据,建议电脑内存至少16GB起步,否则会卡到你怀疑人生。
1.2 全极化SAR数据从哪来
全极化SAR数据源目前用下来,市面上比较主流的公开数据有这么几类:
| 数据源 | 分辨率 | 重访周期 | 极化方式 | 获取难度 |
|---|---|---|---|---|
| Sentinel-1 | 5m x 20m(条带模式) | 6天 | 双极化为主 | 公开免费 |
| ALOS-2 PALSAR-2 | 3m-10m | 14天 | 全极化 | 需申请 |
| RADARSAT-2 | 3m-8m | 24天 | 全极化 | 需购买 |
| 国产高分三号 | 1m-8m | 单星视场灵活 | 全极化 | 需申请 |
如果你的目标是学习全极化分类流程,最理想的数据源其实是机载SAR数据,比如AIRSAR、UAVSAR这些公开数据集,空间分辨率高、地物类型丰富,非常适合做算法验证。不过现实中大部分人手上只有Sentinel-1,注意Sentinel-1默认是双极化(VV+VH或HH+HV),真正的全极化数据需要专门获取,IGM模式才有四极化。这篇文章的流程对四极化数据通用,你拿ALOS-2或者高分三号的全极化数据来跑,操作完全一样。
1.3 原始数据格式那些事
全极化SAR数据一般以SLC(Single Look Complex)格式存储,每个极化通道都是复数数据,包含了幅度和相位信息。SNAP能直接读的格式包括:
- Sentinel-1:SAFE格式文件夹,里面带manifest.safe主文件
- ALOS-2:CEOS格式,一般是一堆二进制文件
- 高分三号:常用GeoTIFF或HDF5封装,SNAP新版基本都支持
打开SNAP后,在“File”菜单里选“Open Product”,把数据文件夹或主文件选上,SNAP会自动识别。加载成功后会看到产品树里有不同极化通道,比如HH、HV、VH、VV,还会有一个复杂的复数矩阵结构。
提示:如果你手头只有单视复数数据,先别急着做任何处理,老老实实检查一下数据能不能正常显示。加载后随便选一个极化通道,用“RGB”窗口或“Band”窗口看一眼实时显示,如果影像有黑色条纹或者噪声一片,可能是数据读取有问题,先换其他文件格式试试。
2. 预处理全流程:拿到原始数据先别急着分类
很多人拿到SLC数据直接就想做分类,这是个常见误区。全极化SLC数据里有大量的相干斑噪声,而且受地形、轨道参数影响,像素值本身不是标准化的地物散射特征。不经过预处理直接分类,结果基本没法用。
标准预处理流程按顺序是:辐射定标 → 多视 → 极化滤波 → 地形校正。下面我把每一步的原理、参数和操作都讲清楚。
2.1 辐射定标:把数字信号变成后向散射系数
雷达传感器记录的是地物回波的电压信号,经过系统处理后得到DN值(Digital Number)。这个DN值跟地物真实的雷达后向散射截面之间有一个复杂的映射关系,受天线增益、传输损耗、系统增益等因素影响。辐射定标就是把DN值转换成归一化的后向散射系数,通常用sigma nought(σ⁰)或gamma nought(γ⁰)表示。
在SNAP里操作路径是:Radar -> Radiometric -> Calibrate。参数设置上我一般这样选:
- Output sigma band:勾选,输出σ⁰
- Output gamma band:可选,一般不需要
- Output beta band:不勾选
- Selected source band:全选所有极化通道
注意,全极化数据定标时,SNAP会同时输出复数形式的定标后数据(保留相位信息)和幅度数据。定标后数据在内存中以复数形式存储,后面做极化分解必须依赖复数值。Sigma nought是投影到地表的雷达截面与入射角的函数,在平坦地形下是最常用的输出形式。地形起伏大的山区,建议同时勾选输出gamma nought,它的投影基准是垂直于视线方向的平面,对地形影响更稳健。
2.2 多视处理:降低相干斑噪声的经典手段
雷达影像天然存在相干斑噪声,这是SAR成像原理决定的——雷达发射的相干电磁波在目标表面发生随机干涉,形成了颗粒状的噪声纹理。相干斑的存在会让同质地物的像素值剧烈抖动,直接干扰分类。多视处理的作用就是在距离向和方位向分别做平均,以降低空间分辨率换取辐射分辨率。
SNAP里的操作路径是:Radar -> SAR Utilities -> Multilooking。关键参数就两个:
- Number of looks in range:距离向视数
- Number of looks in azimuth:方位向视数
视数的选取需要平衡空间分辨率和斑点噪声抑制效果。我做的全极化Sentinel-1数据,通常设置距离向视数为2、方位向视数为2,这样把原始约5m x 20m的分辨率变成约10m x 10m的近似正方形像元。如果是ALOS-2这种本来就接近正方形像元的数据,可以设置1视或者2视,主要看你需要的分类最小制图单元。从原理上说,多视的视数越多,等效视数越大,噪声方差越小,但边缘也会越模糊。全极化分解对噪声敏感程度比单极化高得多,所以滤波之前先多视,效果会好很多。
注意:多视处理务必在定标之后做,不能在原始DN值上做。定标后的数据值是实数级的散射系数,平均才有物理意义;拿DN值直接平均,因为系统增益在不同距离门不一样,得到的均值会发生畸变。
2.3 极化滤波:精修细节的最后一道防线
多视之后,零星的斑点噪声依然存在,再用极化滤波做一次精修。全极化SAR滤波跟普通SAR滤波不同,它不能各通道独立滤波,因为极化通道之间存在相位关系,独立滤波会破坏极化信息。这也是为什么前面强调“全极化数据必须用极化滤波”。
SNAP里可选的极化滤波算子有这么几个:Refined Lee、Lee Sigma、Boxcar滤波。实测下来Refined Lee效果最稳定,它的原理是在保持极化散射特性的前提下,对同质区域做边缘保护滤波——先判断当前像素是平坦区域还是边缘区域,平坦区域用较大的窗口平均,边缘区域沿着边缘方向做细长窗口平均,这样降噪能力不错,地物边界也不会糊成一团。
操作路径:Radar -> Polarimetric -> Polarimetric Speckle Filter。参数设置:
- Filter:Refined Lee
- Window size:5x5或7x7
- Number of looks:填多视后的等效视数(多视设为2x2时,等效视数约4)
窗口大小建议先用5x5看看效果,如果噪声还明显再调大到7x7。但7x7以上的窗口会明显模糊小地物,比如农村的房屋、小型水体,不推荐。
2.4 地形校正:把雷达几何变成地图几何
SAR影像是侧视成像,存在叠掩、阴影、透视收缩等几何形变,特别是山区,直接拿斜距坐标的影像去做分类会跟真实地理坐标匹配不上,后续跟光学影像或其他数据源叠加分析就很困难。地形校正的目的就是利用外部DEM,把雷达坐标下的影像重采样到地图坐标系(如UTM)。
SNAP操作路径:Radar -> Geometric -> Terrain Correction -> Range-Doppler Terrain Correction(或SAR Simulation地形校正)。参数设置是重点:
- DEM:SRTM 3Sec(全球覆盖,精度够用)
- Image resampling:Bilinear(双线性内插,兼顾速度和精度)
- Pixel spacing:根据你需要的最终分辨率设置,比如10m、20m、30m
- Map projection:UTM / WGS84
这一步做完,你就得到了一组经过辐射定标、多视、滤波、地理编码的极化后向散射系数图像,波段名称通常是Sigma0_HH、Sigma0_HV、Sigma0_VH、Sigma0_VV,坐标已经是标准的地图坐标,可以直接叠加到GIS里看。
2.5 Graph Builder一键串联整个预处理流程
预处理流程的每一步参数都调好后,手动一步步跑太慢了,尤其是要处理多景影像时,会把人累死。SNAP的Graph Builder就是为这个设计的。
操作路径:Tools -> Graph Builder。在左侧“Operators”列表里依次找到:
Read:读取SLC数据Calibrate:辐射定标Multilook:多视Polarimetric Speckle Filter:极化滤波Terrain Correction:地形校正Write:输出数据(建议GeoTIFF格式)
每个算子拖到画布上,连线连成一条串行链路,双击每个节点设置参数。全部设置完后,在Graph Builder菜单里点File -> Save Graph,保存为XML文件,以后跑数据直接在命令行里输入:
snap graph-process /path/to/preprocess.xml或者用SNAP桌面版菜单Processing -> Process from XML来批量执行。实测这个方案处理一景全极化Sentinel-1数据大约需要20-40分钟,具体取决于机器性能。
提示:Graph Builder里最容易出错的是操作顺序。定标必须在多视前面,多视必须在滤波前面,这三个顺序反了,后面的极化分解特征值会完全失真。我见过不少人在多视之前做了滤波,虽然结果也能出图,但极化通道间的相位关系被破坏,后面算H/A/Alpha分解时误差明显。
3. 极化特征提取:让分类器看到雷达的“多彩世界”
预处理完成后,你已经有了4个极化通道的后向散射系数。但直接把这4个通道扔给分类器,效果往往一般。原因在于:雷达对地物的区分能力,不只是“回波强弱”,更重要的是回波的极化散射机制——光滑表面产生单次散射,二面角结构产生二次散射,植被冠层产生体散射,这些机制在HH/VV/HV这些原始通道里是混在一起的。极化分解就是把混合的散射机制分离出来,形成物理意义明确的新特征。
3.1 Pauli分解:第一张能看的彩色合成图
Pauli分解是最直观的极化分解方法。它将散射矩阵S分解到Pauli基上,得到三个分量:
- 奇次散射分量(对应水面、裸地等表面散射)
- 偶次散射分量(对应建筑物、树干-地面二面角)
- 体散射分量(对应森林、植被冠层)
数学上Pauli基分解的表达式是:
对于散射矩阵 S = [S_HH, S_HV; S_VH, S_VV],Pauli基分解得:
- k1 = (S_HH + S_VV) / √2,对应奇次散射
- k2 = (S_HH - S_VV) / √2,对应偶次散射
- k3 = 2 * S_HV / √2,对应体散射
在SNAP里的操作是:Radar -> Polarimetric -> Polarimetric Decomposition -> Pauli Decomposition。输出三个波段,通常用RGB合成:R对应偶次散射(|k2|²)、G对应体散射(|k3|²)、B对应奇次散射(|k1|²)。
这张RGB合成图能非常直观地看地物类型:森林区域呈现绿色(体散射强),城区呈现红色(偶次散射强),水面呈现蓝色(奇次散射强),农作物区域则混合了绿色和蓝色。做分类之前先输出一张Pauli RGB图做目视解译,既能检查前面的预处理有没有问题,也能为后面选训练样本提供依据。
3.2 H/A/Alpha分解:极化熵和散射角是分类的“黄金组合”
Cloude-Pottier分解是极化SAR分类中使用最广泛的分解方法之一,它把极化相干矩阵T(或协方差矩阵C)进行特征值分解,得到三个参数:
- 极化熵H:取值范围0到1,反映散射机制的随机程度。H接近0表示散射机制单一,如水面、裸地;H接近1表示散射机制高度随机,如森林冠层。
- 极化各向异性A:反映第二和第三特征值之间的相对差异,对区分H中等值的不同地物类型有帮助。
- 平均散射角α:取值范围0到90度,反映主导散射机制的物理类型。α接近0度对应表面散射,α接近45度对应体散射,α接近90度对应二面角散射。
SNAP操作路径:Radar -> Polarimetric -> Polarimetric Decomposition -> H-Alpha Decomposition(或Eigenvalue Decomposition)。参数设置里通常选默认值即可,但要注意选对输入数据——需要输入定标后的复数SLC产品,SNAP会自动计算相干矩阵T。
分类中使用H/Alpha特征时,传统的做法是把H和α画成二维散点图,根据散射机制的物理区域划分地物类别。H值高且有代表性的区域(H > 0.5,α在40°-45°之间)通常是森林;H低且α低(H < 0.5,α < 30°)通常是裸地或水面;H中等且α高(0.5 < H < 0.7,α > 45°)可能是城区。不过实际使用时,我一般不会只靠H/A/Alpha一个组合做分类,而是把它跟Pauli分解结果、后向散射系数合并成一个多波段特征向量,输入到分类器里。
3.3 Freeman-Durden分解与特征栈构建
Freeman-Durden三分量分解是另一种经典方法,它假设地物散射由表面散射、体散射、二面角散射三种机制线性叠加,通过三个方程解出三个分量功率。跟H/A/Alpha分解的最大区别是:Freeman-Durden是模型驱动的确定性分解,输出的是有物理单位的功率值,适合定量分析;H/A/Alpha是特征值驱动的统计性分解,输出的是无量纲参数,适合分类判别。
SNAP路径:Radar -> Polarimetric -> Polarimetric Decomposition -> Freeman-Durden Decomposition。输出三个波段:Odd(表面散射)、Dbl(二面角散射)、Vol(体散射)。
到此为止,你的特征库里已经有了:
- 4个后向散射系数波段(HH、HV、VH、VV)
- 3个Pauli分解波段(奇次、偶次、体散射)
- 3个H/A/Alpha分解波段(H、A、α)
- 3个Freeman分解波段(Odd、Dbl、Vol)
总共13个特征波段。把这些波段合并成一个多波段GeoTIFF,是分类前的标准动作。SNAP里用Raster -> Data Conversion -> Stack Tools,把前面生成的所有波段合并成一个产品。输出格式建议选GeoTIFF,因为后面Python处理最方便。
注意:特征波段合并时千万注意分辨率一致性。如果滤波和重采样参数不一致,不同分解结果的像元大小可能有细微差别,合并时会对不齐。统一在最后的地形校正步骤把Pixel spacing设为相同值(比如10m),可以避免这个问题。
4. 分类实现:从SNAP内置分类器到Python自定义模型
特征图准备好之后,分类这道工续就有两条路可选:一是在SNAP内部直接跑分类器,简单快捷适合快速看结果;二是把特征图导出到Python,用更灵活的开源库跑随机森林或深度学习模型,适合正式科研出图。我先讲SNAP内置路线,再做Python扩展。
4.1 SNAP内置分类器:快速出结果的过渡方案
SNAP的Machine Learning菜单下带几个分类器,包括K-Means、Random Forest、Maximum Likelihood等。其中Random Forest在大多数情况下精度最稳,推荐优先尝试。
使用步骤:
- 先做训练样本:在SNAP主界面加载特征图产品,点击
Vector -> New Vector Data Container,新建一个形状图层,然后用多边形工具在图像上勾选不同地物类型的训练区。每类地物至少勾选20个样本区,样本区的像素总量建议在每类5000像素以上。 - 接着在
Machine Learning -> Classification里选择Random Forest分类器。 - 输入训练矢量和待分类的特征图,设置分类参数。
- 运行分类得到类别图。
SNAP内置Random Forest的好处是跟其他算子无缝集成,几秒钟就能出结果。缺点是超参数调整空间不大,不能灵活调树的数量、特征采样策略,也不方便做定量精度评估。所以我个人的做法是:拿SNAP的快速分类结果做初步验证,确认特征有效后再用Python精细建模。
4.2 Python路线:用随机森林正式出图
Python处理极化SAR分类的流程是:读取特征图 → 提取训练样本 → 训练随机森林 → 预测所有像素 → 输出分类图。这个流程里最关键的技能是“怎么高效处理超大影像”。
通常用rasterio库读GeoTIFF特征图:
import rasterio import numpy as np import pandas as pd from sklearn.ensemble import RandomForestClassifier # 读特征图 with rasterio.open('feature_stack.tif') as src: features = src.read() # shape: (n_bands, height, width) profile = src.profile height, width = features.shape[1], features.shape[2] # 转成像素-特征矩阵 n_bands = features.shape[0] features_2d = features.reshape(n_bands, -1).T # shape: (n_pixels, n_bands)训练样本的提取得在GIS软件(比如QGIS)里完成,或者用已有的地物分类矢量。核心步骤是提取样本点的特征向量和类别标签:
# 假设sample_coords是样本像素坐标,sample_labels是对应类别 train_features = features_2d[sample_flat_indexes] train_labels = sample_labels # 训练随机森林 clf = RandomForestClassifier( n_estimators=200, max_depth=20, min_samples_leaf=3, random_state=42, n_jobs=-1 ) clf.fit(train_features, train_labels) # 对整个影像预测 pred = clf.predict(features_2d) pred_image = pred.reshape(height, width) # 写GeoTIFF with rasterio.open('classification_result.tif', 'w', **profile) as dst: dst.write(pred_image[np.newaxis, :, :].astype(np.uint8))这个代码框架可以适配无数变体,换分类器只需要改clf = ...这一行。随机森林对极化SAR特征特别友好的一个原因是:极化特征之间往往存在复杂的非线性关系,树模型天然能捕捉特征交互,而且对特征尺度不敏感——不用做归一化,省了不少事。
实测下来,200棵树的随机森林加上13个极化特征波段,在0.5m分辨率的高分三号数据上做地物分类,总体精度能到85%-90%,在1km x 1km范围的特征图上跑一遍不超过2分钟。性能瓶颈主要在特征读取和内存占用上,如果影像太大可以分块预测。
4.3 进阶路线:深度学习语义分割与Transformer
热词里提到了“最新的图像分类模型”和“transformer图像分类”,这里我多写一段。传统随机森林在特征工程完善的情况下已经够用,但这两年用CNN或Transformer做SAR语义分割的趋势很明显。核心做法是把前面生成的特征图当成多通道图像(类似光学影像的R/G/B多波段),直接输入语义分割网络。
实测可行的简化流程是:
- 在Python里用rasterio或gdal把特征图裁剪成固定大小的图像块,比如256x256像素。
- 人工标注一部分图像块对应的类别真值(像素级标签)。
- 用训练集训练一个语义分割模型,比如U-Net、DeepLabV3+,或者基于Transformer架构的SEGFormer、Swin Transformer。
- 用预测窗口遍历整幅图,完成全图分类。
这个方案的优势是省去了手工提取特征聚合的过程,模型能自动学习像素空间上下文,在纹理复杂的区域(比如城区内部、森林与农田交错带)往往比随机森林更准。缺点是样本需求量巨大,训练时间以小时计,而且对显存要求高。如果你电脑只有一块普通消费级显卡,建议先从随机森林入手;等你有数百张标注图块,再上Transformer。
深度学习题材太大,这里我不展开写完整训练代码,一句话总结:SAR图像的语义分割框架和光学图像基本通用,但预处理阶段的极化特征图通常比只有VV/VH两个通道的输入效果好得多。
5. 常见问题与排查实录
预处理和分类过程中踩过的坑,比正常跑通流程花的时间还多。我把高频问题整理成一张速查表,再挑几个典型场景展开说说。
5.1 快速排查表
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 打开SLC后图像全黑或显示异常 | 复数数据需要选择正确的波段显示方式 | 在Band窗口里选Intensity或Amplitude显示,不要显示原始复数 |
| 定标后出现大量异常值(负值或极值) | 定标参数里选择了错误的输出类型 | 改为输出sigma nought,并勾选保存复数数据 |
| 多视后分辨率不是预期值 | 视数设置过大致使像元合并过度 | 根据原始分辨率计算,使输出像元接近正方形 |
| 滤波后地物边缘模糊严重 | 窗口设置过大 | Refined Lee窗口回退到5x5 |
| 地形校正后影像有黑边 | DEM范围覆盖不足 | 更换范围更大的DEM,如SRTM 3Sec换为ASTER GDEM |
| H/A/Alpha分解报错 | 输入数据类型不是复数SLC | 确认使用的是定标后的复数据产品,而不是多视后的强度图 |
| 分类结果出现“椒盐”噪声 | 随机森林过拟合或训练样本太少 | 增加训练样本数量,或对分类结果做多数滤波后处理 |
| 特征图波段间分辨率不一致 | 预处理各步骤没有统一重采样参数 | 在地形校正时统一Pixel spacing |
5.2 几个我踩过的坑
第一个坑是复数数据的处理顺序。我最早做的时候,想着先滤波降噪再做定标是不是效果更好,结果发现定标前的DN值滤波、和定标后的σ⁰滤波,得到的极化分解结果差异非常大。根本原因在于,DN值的噪声分布跟σ⁰值的噪声分布不是同一模型,滤波器假设的统计模型不匹配会造成偏差。所以,一定要严格按“定标→多视→滤波”的顺序走,不要自己调整顺序。
第二个坑是训练样本的选取方式。用随机森林分类时,样本的质量直接决定精度。我试过直接在SNAP里手工勾选训练区,结果分类精度只有70%多一点。后来改成先在Pauli RGB图上做目视解译,选择典型地物,同时避免把不同地物的过渡区选成样本(比如农田到林地的边缘地带),精度提升到90%左右。样本区域要尽量选取“纯地物”像素,宁可少选,不能滥选。
第三个坑是特征选择。我最初把13个波段全部喂给随机森林,发现分类精度反而不如只用其中8个波段。原因是H/A/Alpha里的“各向异性A”在多数区域噪声很大,尤其是低熵区域,A值不稳定,加入这个特征反而干扰分类器。后来我做了简单的特征重要性分析,发现最有用的特征是Pauli体散射、Freeman体散射、VV后向散射系数和极化熵H这四个。所以建议你用clf.feature_importances_跑一下,把重要性极低的特征剔除,效果通常更好。
第四个坑是后处理必不可少。分类结果图即使精度很高,也难免有零星分布的孤立像素点,看起来像盐粒一样。我的习惯是对分类结果做一次众数滤波,比如用3x3或5x5窗口,把中心像素替换为窗口内的众数类别。这个操作对最终制图效果提升明显,而且成本极低,几行代码就能完成。
5.3 小技巧:森林分类场景怎么调参数
热搜词里有个“森林图像分类”,这里补充一条针对森林场景的实战经验。全极化SAR对森林分类有天然优势,因为森林冠层对雷达波的体散射响应显著,体散射分量、极化熵H、平均散射角α这三个特征对森林类型区分非常敏感。做森林分类时,我建议特别关注:
- 用Freeman-Durden分解的Vol分量区分不同密度的森林——密度越大,体散射越强
- 用H/α平面上的体散射区域辅助划定森林范围——这个区域通常在H>0.5、α在40°-50°
- 结合HV极化通道的强度值——HV通道对森林冠层的体散射非常敏感
如果能把森林细分为针叶林、阔叶林、混交林,建议加入多时相数据,不同季节的雷达特征差异对树种识别有帮助。单景全极化数据对树种定到“种”级别精度有限,但分个针叶/阔叶问题不大。
6. 写在后面
做全极化SAR分类这件事,最大的感受是慢工出细活。SNAP本身不复杂,每个算子单独看都不难,但把这些算子正确串起来、理解每一步为什么这样做,才是真正拉开差距的地方。
我个人建议,第一次跑通流程时不要急着追求精度,先把“定标→多视→滤波→地形校正→极化分解→分类”这条链子完整走一遍,哪怕分类精度差一点,至少保证整个流程跑通了。第二遍再回头调参数、做特征筛选、优化训练样本。
最后分享一个小技巧:SNAP的Graph Builder做好XML流程后,可以把它当一个“预处理模板”复用,每次拿到新数据,只需要修改Read节点的文件路径就能批处理。配合Python的随机森林分类,这一套组合拳能解决绝大多数全极化SAR地物分类需求,而且完全免费、可复现。