
直接开场不绕弯子。全极化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-15m x 20m条带模式6天双极化为主公开免费ALOS-2 PALSAR-23m-10m14天全极化需申请RADARSAT-23m-8m24天全极化需购买国产高分三号1m-8m单星视场灵活全极化需申请如果你的目标是学习全极化分类流程最理想的数据源其实是机载SAR数据比如AIRSAR、UAVSAR这些公开数据集空间分辨率高、地物类型丰富非常适合做算法验证。不过现实中大部分人手上只有Sentinel-1注意Sentinel-1默认是双极化VVVH或HHHV真正的全极化数据需要专门获取IGM模式才有四极化。这篇文章的流程对四极化数据通用你拿ALOS-2或者高分三号的全极化数据来跑操作完全一样。1.3 原始数据格式那些事全极化SAR数据一般以SLCSingle Look Complex格式存储每个极化通道都是复数数据包含了幅度和相位信息。SNAP能直接读的格式包括Sentinel-1SAFE格式文件夹里面带manifest.safe主文件ALOS-2CEOS格式一般是一堆二进制文件高分三号常用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。参数设置FilterRefined LeeWindow size5x5或7x7Number of looks填多视后的等效视数多视设为2x2时等效视数约4窗口大小建议先用5x5看看效果如果噪声还明显再调大到7x7。但7x7以上的窗口会明显模糊小地物比如农村的房屋、小型水体不推荐。2.4 地形校正把雷达几何变成地图几何SAR影像是侧视成像存在叠掩、阴影、透视收缩等几何形变特别是山区直接拿斜距坐标的影像去做分类会跟真实地理坐标匹配不上后续跟光学影像或其他数据源叠加分析就很困难。地形校正的目的就是利用外部DEM把雷达坐标下的影像重采样到地图坐标系如UTM。SNAP操作路径Radar - Geometric - Terrain Correction - Range-Doppler Terrain Correction或SAR Simulation地形校正。参数设置是重点DEMSRTM 3Sec全球覆盖精度够用Image resamplingBilinear双线性内插兼顾速度和精度Pixel spacing根据你需要的最终分辨率设置比如10m、20m、30mMap projectionUTM / 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、VV3个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_estimators200, max_depth20, min_samples_leaf3, random_state42, 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 GDEMH/A/Alpha分解报错输入数据类型不是复数SLC确认使用的是定标后的复数据产品而不是多视后的强度图分类结果出现“椒盐”噪声随机森林过拟合或训练样本太少增加训练样本数量或对分类结果做多数滤波后处理特征图波段间分辨率不一致预处理各步骤没有统一重采样参数在地形校正时统一Pixel spacing5.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/α平面上的体散射区域辅助划定森林范围——这个区域通常在H0.5、α在40°-50°结合HV极化通道的强度值——HV通道对森林冠层的体散射非常敏感如果能把森林细分为针叶林、阔叶林、混交林建议加入多时相数据不同季节的雷达特征差异对树种识别有帮助。单景全极化数据对树种定到“种”级别精度有限但分个针叶/阔叶问题不大。6. 写在后面做全极化SAR分类这件事最大的感受是慢工出细活。SNAP本身不复杂每个算子单独看都不难但把这些算子正确串起来、理解每一步为什么这样做才是真正拉开差距的地方。我个人建议第一次跑通流程时不要急着追求精度先把“定标→多视→滤波→地形校正→极化分解→分类”这条链子完整走一遍哪怕分类精度差一点至少保证整个流程跑通了。第二遍再回头调参数、做特征筛选、优化训练样本。最后分享一个小技巧SNAP的Graph Builder做好XML流程后可以把它当一个“预处理模板”复用每次拿到新数据只需要修改Read节点的文件路径就能批处理。配合Python的随机森林分类这一套组合拳能解决绝大多数全极化SAR地物分类需求而且完全免费、可复现。