
SAR 遥感在农业监测里是一个既经典又不断翻新的方向。很多做农作物分类、长势监测的同学一开始接触的都是光学影像到了雨季或者多云地区光学数据常常断档这时候 SAR 的穿透能力就非常有价值。SAR2Agri 这个方向核心就是围绕 SAR 强度数据Intensity设计更有效的表示方法从而服务于农业地块识别、作物分类和长势监测。本文将围绕 SAR2Agri 的技术思路展开讲解 SAR 强度数据的基础概念、预处理流程、特征提取方法以及如何用公开的 Sentinel-1 数据和 Python 工具复现一套基础的农业监测实验。内容尽量完整代码可以直接复制适合刚接触 SAR 农业应用的开发者按步骤操作。1. 背景与核心概念1.1 SAR 到底是什么SAR 是 Synthetic Aperture Radar 的缩写中文叫合成孔径雷达。它属于主动遥感机载或星载平台主动发射微波脉冲接收地面反射回来的回波信号通过合成孔径技术提高方位向分辨率从而生成高分辨率影像。和光学遥感相比SAR 有几个明显特点不受云雨天气影响具备全天时、全天候观测能力。对地表的几何结构、粗糙度、介电特性敏感。信号能够穿透一定厚度的植被冠层对作物结构变化有响应。这些特点决定了 SAR 在农业监测里特别适合作为光学数据的补充或者独立承担监测任务。1.2 SAR 强度数据指的是什么SAR 影像产品通常可以分成两类信息强度Intensity反映地物反射微波能量的强弱单位是幅度或功率。相位Phase反映回波信号的相位信息常用于干涉测量。SAR2Agri 这个方向关注的主要是强度信息。后向散射系数Sigma Noughtσ⁰是强度数据中最重要的物理量它表示单位面积上的雷达反射截面通常用 dB 表示。不同类型的地物其强度特征存在差异。比如裸露土壤后向散射受土壤水分和表面粗糙度控制。水稻田受淹水条件和植株密度影响时间序列上呈现特殊的散射变化。玉米、小麦等作物随生长阶段不同冠层结构和含水量变化后向散射也会周期性变化。1.3 SAR2Agri 要解决什么问题SAR2Agri 是 ESA欧洲空间局支持下的一个研究项目全称可以理解为“面向农业监测的 SAR 强度表示学习方法”。它的核心目标是如何从 Sentinel-1 的 SAR 强度数据中提取更稳定、更有效的特征表达进而实现大范围、高精度的农业监测。在实际项目里SAR 强度数据面临几个痛点单个时相的强度影像难以区分复杂作物类型。斑点噪声严重影响分类精度。不同极化、不同入射角的特征需要设计融合策略。传统特征工程依赖专家经验跨区域泛化能力弱。SAR2Agri 的研究思路就是围绕强度数据的特征表达做文章既包括基于物理意义的极化特征和纹理特征也包括结合时间序列的统计特征以及深度学习的自动特征提取。简单来说SAR2Agri 不是指某一个单一算法而是指一套“从 SAR 强度数据到农业监测应用”的技术方案和学习框架。1.4 为什么现在关注这个方向近年来Sentinel-1 卫星提供了大量免费、开放、重访周期稳定的 C 波段 SAR 数据这为 SAR 农业应用的规模化研究提供了数据基础。加上深度学习在遥感图像处理方面的快速发展SAR2Agri 这类方向受到越来越多的关注。对于开发者而言掌握 SAR 强度数据的处理和农业监测应用意味着能够在光学数据不足时仍然保持监测能力。在作物分类、面积估算、长势监测等需求中提供多源数据支撑。深入理解微波遥感与农业生态参数之间的物理关系。2. 环境准备与数据获取在开始动手之前先把工具链和数据获取渠道理清楚。SAR 数据处理有几个常用工具组合使用会比较顺手。2.1 软件环境SNAPSentinel Application Platform是 ESA 官方发布的遥感数据处理平台支持 Sentinel-1 数据的读取、预处理、可视化。它既提供图形界面也提供 Python 接口snappy。Python 环境建议使用 Python 3.8 或以上版本配合以下库numpymatplotlibrasteriosnappySNAP 的 Python 接口scikit-learn用于分类实验如果只是做简单的后向散射系数提取和可视化GDAL 也够用但完整的预处理建议还是走 SNAP。2.2 数据获取渠道Sentinel-1 数据可以免费获取主要有几个官方渠道Copernicus Data Space Ecosystem欧空局官方的数据分发平台支持按区域、时间、轨道检索。Alaska Satellite FacilityASFData Search北美常用的哨兵数据镜像检索方便。国内一些科研机构也提供数据共享服务具体可以结合自己单位的数据资源。在 Copernicus Data Space 上检索 Sentinel-1 数据的策略是选择 S1A 或 S1B注意 S1B 已于 2022 年退役现在主要用 S1A。选择 IW 模式Interferometric Wide Swath。选择 GRD 产品Ground Range Detected这是已经做过距离向压缩和多视处理的地距产品适合强度分析。设置时间范围和区域范围。2.3 数据产品说明Sentinel-1 的 IW GRD 产品单景数据包含多个条带sub-swath每个条带内有多个极化通道。常见的极化组合是 VVVH。对于农业监测任务VV 和 VH 极化都很常用VV 极化对土壤水分、作物行结构比较敏感。VH 极化对植被体散射更敏感常用于作物识别和生物量估算。下载后的数据是 zip 包里面包含manifest.safe产品主文件。measurement/各条带和极化的 tiff 数据。annotation/标注文件包含轨道和校准信息。preview/快速预览图。3. SAR 强度数据的预处理SAR 原始数据不能直接用于分析需要经过一系列预处理才能得到有物理意义的后向散射系数。这里以 SNAP 处理流程为主。3.1 预处理整体流程标准的 Sentinel-1 强度数据预处理流程包括热噪声去除Thermal Noise Removal。轨道文件更新Apply Orbit File。辐射定标Radiometric Calibration。斑点滤波Speckle Filter。地形校正Range Doppler Terrain Correction。转换为 dB 单位。每一步都有明确的物理意义下面分别说明。3.2 热噪声去除与轨道修正热噪声去除是为了消除传感器自身热噪声对信号的影响这一步对低后向散射区域尤其重要比如平静水面。轨道文件更新是使用精确轨道数据Precise Orbit EphemerisPOD替代文件内的预测轨道信息从而提高几何定位精度。在 SNAP 图形界面中对应的操作位置在Radar Radiometric Thermal Noise Removal Radar Orbit Apply Orbit File3.3 辐射定标辐射定标将 DN 值转换为后向散射系数。对于 GRD 产品SNAP 的 Calibration 工具支持输出 Sigma Nought、Beta Nought 和 Gamma Nought。农业监测常用 Sigma Nought。在 SNAP 中操作Radar Radiometric Calibrate关键设置选择输出 Sigma Nought。选择 VV 和 VH 极化。输出类型选择浮点型数据。3.4 斑点滤波斑点噪声Speckle是相干成像系统固有的乘性噪声会严重影响影像质量。滤波目的就是降低斑点噪声同时尽量保留边缘和纹理信息。常用滤波器包括中值滤波。Lee 滤波。Refined Lee 滤波。Frost 滤波。改进型 Sigma 滤波。在农业应用中Refined Lee 滤波是比较常用的选择能够在抑制噪声和保持边缘之间取得平衡。在 SNAP 中操作Radar Speckle Filtering Refined Lee3.5 地形校正地形校正用于消除地形起伏引起的几何畸变和辐射畸变。对于平坦地区该步骤影响较小对于丘陵和山地必须进行地形校正。在 SNAP 中操作Radar Geometric Terrain Correction Range Doppler Terrain Correction关键设置DEM 选择 SRTM 3Sec 或更高精度的数据。像素分辨率可以设置为 10 米或 20 米。重采样方法选择 Bilinear 或 Cubic Convolution。3.6 将流程串联执行在实际工程中没有必要手动点击每一步。SNAP 支持 Graph Processing ToolGPT可以通过命令行批量处理。下面是一个预处理流程的 XML 图定义你可以保存为preprocess_s1.xml然后用 GPT 执行?xml version1.0 encodingUTF-8? graph idS1_Preprocess version1.0/version node idRead operatorRead/operator sources/ parameters file${inputFile}/file /parameters /node node idThermalNoiseRemoval operatorThermalNoiseRemoval/operator sources sourceProduct refidRead/ /sources /node node idApplyOrbitFile operatorApply-Orbit-File/operator sources sourceProduct refidThermalNoiseRemoval/ /sources parameters orbitTypeSentinel Precise/orbitType polyDegree3/polyDegree /parameters /node node idCalibration operatorCalibration/operator sources sourceProduct refidApplyOrbitFile/ /sources parameters outputSigmaBandtrue/outputSigmaBand outputBetaBandfalse/outputBetaBand outputGammaBandfalse/outputGammaBand sourceBands/ selectedPolarisationsVV,VH/selectedPolarisations /parameters /node node idSpeckleFilter operatorSpeckle-Filter/operator sources sourceProduct refidCalibration/ /sources parameters filterRefined Lee/filter filterSizeX5/filterSizeX filterSizeY5/filterSizeY /parameters /node node idTerrainCorrection operatorTerrain-Correction/operator sources sourceProduct refidSpeckleFilter/ /sources parameters demNameSRTM 3Sec/demName pixelSpacingInMeter10.0/pixelSpacingInMeter resamplingMethodBILINEAR_INTERPOLATION/resamplingMethod saveProjectedLocalIncidenceAnglefalse/saveProjectedLocalIncidenceAngle /parameters /node node idLinearToFromdB operatorLinearToFromdB/operator sources sourceProduct refidTerrainCorrection/ /sources parameters sourceBands/ /parameters /node node idWrite operatorWrite/operator sources sourceProduct refidLinearToFromdB/ /sources parameters file${outputFile}/file formatNameGeoTIFF/formatName /parameters /node /graph然后通过命令行执行gpt preprocess_s1.xml -PinputFilesentinel1_zip_file.zip -PoutputFileresult_vv_vh.tif这里需要说明的是XML 中的 operator 名称在不同版本的 SNAP 中可能略有差异如果你的版本提示找不到某个 operator可以在 SNAP 图形界面中打开 Graph Builder重新添加对应节点后导出 XML。3.7 预处理结果验证预处理完成后检查结果打开 GeoTIFF确认空间参考和范围正确。查看 VV 和 VH 通道的数值范围理论上前者通常大于后者。检查水体、城区、农田区域是否有明显可区分性。下面是一个简单的 Python 脚本来读取结果import rasterio import numpy as np with rasterio.open(result_vv_vh.tif) as src: data src.read() meta src.meta print(影像尺寸:, meta[width], x, meta[height]) print(波段数量:, meta[count]) vv data[0] # 假设第一个波段是 VV vh data[1] # 假设第二个波段是 VH print(VV 均值: {:.2f} dB.format(np.nanmean(vv))) print(VH 均值: {:.2f} dB.format(np.nanmean(vh)))如果输出结果中 VV 均值比 VH 均值高几个到十几个 dB说明定标和转换通常是正确的。4. SAR 强度特征提取与农业监测实战预处理好数据后下一步是提取强度特征并构建农业监测模型。下面用一个简化流程演示从哨兵数据到作物分类的完整过程。4.1 时间序列构建农业监测往往需要时间序列数据。单一时相影像只能反映瞬时状态时间序列才能捕捉作物生长周期。获取覆盖同一区域多个日期的 Sentinel-1 数据分别执行上述预处理流程然后将不同日期的影像叠加起来形成时间序列立方体。日期作物状态期望的 VH 强度规律播种期裸露土壤较低营养生长期植被覆盖增加逐渐升高抽穗期冠层结构复杂达到较高值收获期冠层移除下降时间序列构建的代码示意import glob import rasterio import numpy as np tiff_files sorted(glob.glob(preprocessed/*.tif)) time_series [] for f in tiff_files: with rasterio.open(f) as src: vh_band src.read(2) # 第二个波段为 VH time_series.append(vh_band) time_series np.stack(time_series, axis0) print(时间序列维度: , time_series.shape)4.2 强度特征提取基于预处理后的强度数据可以提取多种特征。4.2.1 单时相后向散射特征直接用 VV 和 VH 的 dB 值作为特征。这是最简单的特征但当作物类型相似时区分度可能不够。4.2.2 极化比值特征极化比值VV/VH或极化差值VV-VH是常用的组合特征可以在一定程度上反映地物散射机制。ratio vv - vh # 单位均为 dB4.2.3 雷达植被指数RVIRVI 是常用于植被监测的指数基于 VH 和 VV 极化强度计算。对于 C 波段 SAR 数据RVI 与植被生物量有一定的相关性。RVI 的一种简化形式def calculate_rvi(vv_linear, vh_linear): 计算雷达植被指数 输入需为线性强度非 dB rvi (4 * vh_linear) / (vv_linear vh_linear) return rvi注意计算 RVI 时必须使用线性强度不能直接使用 dB 值。4.2.4 纹理特征GLCM灰度共生矩阵是常用的纹理特征提取方法。SNAP 中可以直接生成 GLCM 纹理特征包括对比度、相关性、能量、同质性等。在 SNAP 中操作Raster Image Analysis Texture Analysis GLCM4.2.5 时间序列统计特征时间序列的统计特征对作物分类很有用生长季最大值。生长季最小值。变化幅度。增长速率。峰值时间。# 以 VH 时间序列为例 vh_ts time_series[:, 100, 200] # 示例某个像元的 VH 时间序列 max_value np.max(vh_ts) min_value np.min(vh_ts) amplitude max_value - min_value mean_value np.mean(vh_ts) std_value np.std(vh_ts) print(最大值: {:.2f}.format(max_value)) print(最小值: {:.2f}.format(min_value)) print(变化幅度: {:.2f}.format(amplitude)) print(均值: {:.2f}.format(mean_value)) print(标准差: {:.2f}.format(std_value))4.3 构建一个简化的作物分类实验下面用一个随机森林分类器来演示分类流程。假设我们已有标注好的样本点。特征矩阵构建import pandas as pd # 假设 features.csv 包含样本点的特征和标签 df pd.read_csv(features.csv) # 特征列 X df.drop(class, axis1).values # 标签列 y df[class].values print(特征矩阵形状:, X.shape) print(类别标签:, np.unique(y))训练与评估from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, accuracy_score X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) clf RandomForestClassifier( n_estimators200, max_depth10, random_state42, n_jobs-1 ) clf.fit(X_train, y_train) y_pred clf.predict(X_test) acc accuracy_score(y_test, y_pred) print(测试集准确率: {:.4f}.format(acc)) print() print(classification_report(y_test, y_pred))如果相对某一作物类别的分类效果不理想可以从几个方向尝试增加时间序列观测数量。加入纹理特征。调整滤波窗口大小。使用更复杂的分类模型。4.4 深度学习方法的初步尝试SAR2Agri 的一个研究重点是用深度学习从强度数据中自动学习表征。相比手工特征深度学习模型可以自动学习空间和时间特征。一个简单的 CNN 思路以每个像素为中心的图像块作为输入输出作物类别。import torch import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self, in_channels, num_classes): super(SimpleCNN, self).__init__() self.conv1 nn.Conv2d(in_channels, 32, kernel_size3, padding1) self.conv2 nn.Conv2d(32, 64, kernel_size3, padding1) self.pool nn.MaxPool2d(2) self.fc1 nn.Linear(64 * 4 * 4, 128) self.fc2 nn.Linear(128, num_classes) self.relu nn.ReLU() self.dropout nn.Dropout(0.3) def forward(self, x): x self.relu(self.conv1(x)) x self.pool(self.relu(self.conv2(x))) x x.view(x.size(0), -1) x self.relu(self.fc1(x)) x self.dropout(x) x self.fc2(x) return x这里给出的代码只是一个模型定义片段实际训练还需要构建数据集、定义损失函数、设置优化器这些会根据具体数据和硬件环境变化需要按实际情况调整。需要注意的是深度学习在 SAR 影像上容易遇到过拟合问题因为标注样本通常较少。SAR 影像存在噪声。不同区域的数据分布差异较大。实践中通常会使用图像块采样增强样本数量或者使用预训练模型做迁移学习。5. 常见问题与排查思路SAR 强度数据处理过程中容易遇到各种问题。下面整理了一些高频问题。问题现象常见原因解决思路定标后的后向散射系数范围异常未正确输出 Sigma Nought或混用了 Beta Nought重新检查 Calibration 输出设置确认选择 Sigma NoughtVV 和 VH 数值非常接近滤波过度或定标错误检查中间结果对比定标前后数值合理选择滤波参数地形校正后影像出现大片空白DEM 数据缺失或范围不匹配检查 DEM 覆盖范围更换 DEM 源或调整分辨率时间序列影像对齐不准各景影像采用不同轨道或处理参数统一使用相同处理流程校正后检查各景之间的偏移分类结果噪声大斑点噪声未有效抑制增加滤波强度或在特征中引入时序平滑下载的 Sentinel-1 数据无法读取下载不完整或格式错误检查 zip 包完整性确认 manifest.safe 存在GPT 执行时报 operator 名称错误SNAP 版本不同导致节点名称变化在图形界面生成 XML再在命令行执行5.1 定标数值异常排查当你发现定标后的数值明显不在合理范围内时先做以下检查确认是否选择了正确的极化通道。确认输出是否有 NaN 或 Inf。查看原始数据中对应区域是否有重叠条带。检查 LUT查找表是否存在异常。一个常见的坑是某些区域的 Sigma Nought 值在转 dB 前已经出现了 0 值或负数这通常发生在数据边缘或低散射区域。处理时可以用一个小量替代 0 值避免 dB 转换出错# 将线性强度中的 0 或负值替换为极小量 linear_data np.where(linear_data 0, 1e-6, linear_data) db_data 10 * np.log10(linear_data)5.2 GPT 调用 SNAP 失败如果gpt命令无法识别确认 SNAP 安装目录下的bin目录已加入系统 PATH。在 Linux 环境下可能需要执行source /etc/profile或者重启终端。在 Windows 环境下可以尝试直接在 SNAP 安装目录下的bin目录中执行gpt.exe。如果 Python 调用 snappy 失败pip install snappy实际上snappy 并不通过 pip 直接安装而是由 SNAP 安装包自带。正确做法是在 SNAP 安装目录中找到bin/snappy文件夹。运行snappy-conf生成对应的 Python 模块。将生成的模块路径加入 Python 环境。具体命令根据操作系统略有不同建议查阅本地 SNAP 版本的官方文档。6. 最佳实践与工程建议6.1 数据管理SAR 数据量很大一个 IW GRD 产品通常几百 MB解压后更大。建议在项目中建立清晰的目录结构sar2agri_project/ ├── data/ │ ├── raw/ # 原始 zip 数据 │ ├── processed/ # 预处理后的单景数据 │ └── timeseries/ # 时间序列合成数据 ├── scripts/ │ ├── preprocess.py │ ├── feature_extract.py │ └── classify.py ├── output/ │ ├── features/ │ └── results/ └── labels/ └── sample_points.shp6.2 预处理参数的选择预处理参数不是固定的需要根据区域和用途调整平坦地区可以适当降低地形校正的依赖但不要完全省略。斑点滤波器窗口大小3x3 保留更多细节5x5 或 7x7 平滑更强但可能损失边界。时间序列数据尽量使用相同轨道和相同处理参数以保持一致性。6.3 特征与模型的配合手工特征适合小样本场景解释性好。深度学习适合大数据量、复杂场景但需要大量标注和计算资源。实际工程项目里两者结合往往效果好于单一方法。6.4 验证与评估农业监测项目通常需要与地面调查数据对比。在验证分类精度时注意验证样本和训练样本要空间分离避免空间自相关导致精度虚高。使用分层抽样保证每个类别有足够样本。不仅关注总体精度还要关注各类别的生产精度和用户精度。6.5 生产环境的稳定性如果要在生产环境中做长期监测建议将预处理流程固化为脚本或服务减少人工干预。定期检查数据源的时间一致性。建立异常检测机制比如某个时相出现大面积无效值需要自动告警。保存每个处理步骤的中间结果便于回溯定位问题。7. 总结与学习路线本文围绕 SAR2Agri 方向系统梳理了 SAR 强度数据在农业监测中的应用链路从 SAR 基础概念、强度数据预处理到特征提取、分类实验再到常见问题排查和工程化建议。核心知识点可以归纳为SAR 强度数据是农业监测中重要的微波遥感信息源。预处理是强度数据应用的基础热噪声去除、辐射定标、斑点滤波、地形校正缺一不可。强度特征包括单时相后向散射、极化比值、雷达植被指数、纹理特征和时间序列统计特征。传统机器学习与深度学习方法都可以应用于强度特征具体选择取决于标注数据和计算资源。工程化落地时需要关注数据管理、参数一致性、验证可靠性和流程自动化。下一步如果想把 SAR2Agri 方向做得更深入可以参考下面几条路径学习更多关于 Sentinel-1 数据格式和处理细节熟悉 SNAP 的批量处理。阅读 SAR2Agri 相关的公开技术报告和论文了解不同地区的实验结果。尝试复现经典的 SAR 作物分类论文比较不同特征组合的效果。探索多源数据融合比如 SAR 与光学影像的联合分类。研究深度学习中更先进的结构如图神经网络、Transformer 在 SAR 时间序列分类中的应用。实际项目中最需要注意的是数据的时空一致性。如果你在跑 SAR 数据时发现某个环节不符合预期建议不要急着调算法先回到数据本身检查预处理中间结果是否合理。大部分分类问题根源往往是前期处理不够扎实。动手跑通一条完整的数据链路会比只看文章有更深的体会。先从一景数据开始把预处理流程跑通再逐步扩展到一个区域、一个生长季的时间序列慢慢就能掌握 SAR 强度数据在农业监测中的完整玩法。