3、遥感数据预处理:从原始影像到可用数据

说实话,很多刚入行的朋友觉得遥感数据预处理是个体力活,没什么技术含量。我刚开始也这么想,直到有一次,我用没做大气校正的数据训练模型,结果在另一个地区的影像上完全失效——精度直接从85%掉到了30%。嗯,从那以后,我再也不敢小看预处理了。

今天我们就来聊聊,怎么把原始遥感影像变成模型能用的数据。说白了,就是给数据「洗个澡」,去掉那些不该有的噪声和变形。

遥感数据预处理流程 辐射定标与大气校正 消除传感器误差与大气影响 几何校正与正射校正 纠正影像几何形变 影像裁剪与拼接 获取目标区域与无缝融合 数据增强策略 旋转、翻转、光谱抖动 高质量训练数据集

3.1 辐射定标与大气校正

你想想看,卫星在天上拍到的数据,其实是「DN值」(Digital Number),也就是原始的数字量化值。这个值跟真实的地物反射率之间,还隔着好几层关系。

辐射定标,就是把DN值转换成传感器入瞳处的辐射亮度值。说白了,就是给数据「校准」一下,让不同时间、不同传感器拍的数据有可比性。

核心公式:

L = Gain × DN + Offset

其中 Gain 和 Offset 可以从影像元数据中获取。我个人习惯在定标后先看一眼直方图,如果出现大量饱和或截断,说明原始数据质量有问题。

大气校正就更关键了。大气中的水汽、气溶胶会吸收和散射电磁波,导致影像模糊、对比度下降。我遇到过最典型的案例:用未校正的影像做水体提取,结果把山体阴影误判成了水体——因为大气散射让阴影区的光谱特征跟水体太像了。

常用的方法有几种:

  • 6S模型:物理模型,精度高但参数多,适合科研
  • FLAASH:集成在ENVI中,操作方便,我项目里用得最多
  • 暗目标法:简单快速,适合批量处理

我的经验:如果只是做分类任务,大气校正不是必须的。但如果你要做变化检测或者定量反演,这一步绝对不能省。我曾经偷懒跳过大气校正,结果两个时相的NDVI差值直接差了0.2——这误差大到没法用。

3.2 几何校正与正射校正

卫星影像存在几何形变,原因很多:卫星姿态变化、地形起伏、地球曲率等等。你想想看,一张影像上同一个像素,在不同地形下对应的地面位置可能差几十米。

几何校正,就是通过地面控制点(GCP)来纠正这种形变。我一般会选20-30个均匀分布的控制点,像道路交叉口、建筑物角点这种明显特征点。

# 使用GDAL进行几何校正的示例
from osgeo import gdal

# 读取原始影像
src_ds = gdal.Open('raw_image.tif')
# 设置地面控制点
gcps = [
    gdal.GCP(120.5, 30.2, 0, 100, 200),
    gdal.GCP(120.6, 30.3, 0, 500, 300),
    # ... 更多控制点
]
# 应用校正
gdal.Warp('corrected.tif', src_ds, 
          outputBounds=[120.4, 30.1, 120.7, 30.4],
          xRes=0.0001, yRes=0.0001)

正射校正是在几何校正的基础上,进一步消除地形引起的投影差。说白了,就是把影像从「斜着看」变成「正着看」。对于山区影像,这一步尤其重要。

注意:正射校正需要DEM数据。如果没有高精度DEM,宁可不做也不要随便用低精度数据——我见过有人用30米分辨率的DEM校正0.5米分辨率的影像,结果校正后的影像比没校正还糟糕。

3.3 影像裁剪与拼接

拿到一景影像,通常覆盖范围很大,而我们只需要研究区域。裁剪就是把这个区域「切」出来。

裁剪有两种方式:

  • 按矢量边界裁剪:用Shapefile或GeoJSON文件作为边界
  • 按规则网格裁剪:切成固定大小的图块,适合深度学习训练

我个人更推荐第二种方式。为什么呢?因为深度学习模型通常要求输入尺寸固定,比如256×256或512×512。提前切好,省得训练时反复IO操作。

# 按规则网格裁剪示例
import rasterio
from rasterio.windows import Window

with rasterio.open('large_image.tif') as src:
    for i in range(0, src.height, 256):
        for j in range(0, src.width, 256):
            window = Window(j, i, 256, 256)
            data = src.read(window=window)
            # 保存为单独的图块

影像拼接则是把多景影像拼成一幅。这里有个坑:不同影像的色调可能不一致,直接拼起来会有明显的接缝。我一般会用直方图匹配或者羽化融合来处理。

避坑指南:我曾经在拼接时没注意影像的获取时间,结果把夏天和冬天的影像拼在一起——农田的颜色差异巨大,模型训练出来完全没法用。所以,拼接前一定要检查影像的时相一致性。

3.4 数据增强策略

数据增强,说白了就是「无中生有」。遥感数据标注成本高,样本量往往不够。通过数据增强,我们可以用有限的样本生成更多的训练数据。

常用的策略有:

增强方法 适用场景 注意事项
旋转(90°、180°、270°) 地物方向无关的任务 不要用于有方向性的地物(如道路)
水平/垂直翻转 几乎所有任务 注意标签也要同步翻转
光谱抖动 多光谱影像 抖动幅度不宜过大,否则会改变地物光谱特征
随机裁剪 目标检测、分割 确保裁剪后目标完整

光谱抖动是我特别想强调的。遥感影像有多个波段,每个波段的光谱值都有物理意义。如果抖动太大,比如把近红外波段的值调高20%,植被的光谱特征就完全变了。我一般控制在±5%以内。

# 光谱抖动示例
import numpy as np

def spectral_jitter(image, max_offset=0.05):
    """对每个波段添加随机偏移"""
    jittered = image.copy()
    for band in range(image.shape[-1]):
        offset = np.random.uniform(-max_offset, max_offset)
        jittered[..., band] += offset * image[..., band]
    return jittered

我的建议:数据增强不是越多越好。我见过有人把旋转、翻转、裁剪、抖动全用上,结果模型训练了三天,精度反而下降了。原因很简单——增强过度,样本失去了原始分布特征。一般来说,2-3种增强策略组合就够了。

嗯,到这里,遥感数据预处理的核心内容就讲完了。你可能会问:这些步骤的顺序重要吗?当然重要。我习惯的顺序是:辐射定标→大气校正→几何校正→正射校正→裁剪/拼接→数据增强。这个顺序能最大程度保证数据质量。

下一节我们会聊到模型训练的具体细节,不过在那之前,先把预处理这关过了。相信我,预处理做得好,后面能省80%的麻烦。


专注资料整理