3. 遥感图像增强与变换:让地物特征“现出原形”

拿到一幅遥感影像,第一件事是什么?

我个人习惯,不是急着分类,而是先做增强和变换。为什么?因为原始影像就像一块璞玉,信息都藏在里面,但肉眼和算法都看不清楚。你想想看,如果影像灰蒙蒙的,或者植被和土壤混在一起分不开,那后续的分类精度肯定惨不忍睹。

这一章,我们就来聊聊怎么把这些隐藏的信息“挖”出来。我会结合自己踩过的坑,给你讲透对比度拉伸、滤波锐化、PCA、缨帽变换和植被指数计算。

核心思想:增强不是“造假”,而是让地物的光谱差异更明显,便于人眼判读和算法识别。

3.1 对比度拉伸:把灰蒙蒙变成层次分明

我记得刚入行时,处理过一景Landsat影像,整张图看起来像蒙了一层雾。当时我直接拿去分类,结果精度只有60%多。后来老工程师告诉我:“你先拉伸一下对比度试试。”

对比度拉伸,说白了就是把影像的灰度值重新映射,让亮的地方更亮,暗的地方更暗,中间层次更丰富。常用的方法有三种:

  • 线性拉伸:最简单,直接拉伸到0-255范围。适合直方图分布均匀的影像。
  • 百分比截断拉伸:去掉两端各2%的极值,再线性拉伸。能有效避免个别异常值的影响。
  • 直方图均衡化:让直方图分布更均匀,增强对比度。但有时会过度增强噪声。

我的经验:做土地覆盖分类前,我一般先用百分比截断拉伸(2%-98%),效果最稳定。直方图均衡化慎用,容易把噪声也增强了。

# Python实现:百分比截断拉伸
import numpy as np
from osgeo import gdal

def percent_stretch(band, lower=2, upper=98):
    """百分比截断拉伸"""
    band = band.astype(np.float32)
    p_low = np.percentile(band, lower)
    p_high = np.percentile(band, upper)
    # 截断并拉伸到0-255
    stretched = np.clip((band - p_low) / (p_high - p_low) * 255, 0, 255)
    return stretched.astype(np.uint8)

3.2 滤波与锐化:去噪还是提边?

滤波这玩意儿,我刚开始总搞混。低通滤波是平滑去噪,高通滤波是锐化边缘。你想想看,一个像“磨皮”,一个像“描边”。

低通滤波(平滑):用均值滤波或高斯滤波,去除椒盐噪声和斑点噪声。但代价是边缘会变模糊。

高通滤波(锐化):用拉普拉斯算子或Sobel算子,增强地物边界。适合提取道路、建筑物边缘。

避坑指南:我曾经在分类前对整景影像做了锐化,结果把农田纹理也增强了,导致分类时把玉米地错分成了林地。记住:锐化要谨慎,最好只针对特定地物。

# 使用scipy进行高斯滤波和拉普拉斯锐化
from scipy.ndimage import gaussian_filter, laplace

# 平滑去噪
smoothed = gaussian_filter(band, sigma=1.5)

# 锐化:原图 + 拉普拉斯边缘
sharpened = band - laplace(band) * 0.5

3.3 主成分分析(PCA):降维去冗余

多光谱影像有多个波段,波段之间往往高度相关。比如近红外和红波段,在植被区相关性很高。PCA的作用,就是把相关的波段信息压缩到几个主成分里。

我做过一个实验:用Landsat 8的7个波段做PCA,前3个主成分就包含了95%以上的信息。这意味着什么?你后续分类只需要用3个波段,而不是7个,计算量大大减少,而且噪声也被去掉了。

主成分 方差贡献率 累计贡献率 主要信息
PC1 72.3% 72.3% 整体亮度
PC2 18.6% 90.9% 植被与土壤对比
PC3 4.8% 95.7% 湿度信息

我的习惯:做PCA前一定要标准化数据,否则亮度高的波段会主导第一主成分。标准化后,每个波段贡献才公平。

# PCA实现(使用sklearn)
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 假设data是 (n_samples, n_bands) 的数组
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

pca = PCA(n_components=3)
pca_result = pca.fit_transform(data_scaled)

print(f"各主成分方差贡献率: {pca.explained_variance_ratio_}")

3.4 缨帽变换(Tasseled Cap):专门为Landsat设计的变换

缨帽变换,名字听着玄乎,其实就是一种线性变换,专门针对Landsat数据设计的。它把原始波段变换到三个分量:亮度、绿度、湿度。

  • 亮度分量:反映土壤和裸地的反射率。
  • 绿度分量:反映植被覆盖度和生长状况。
  • 湿度分量:反映土壤和植被的水分含量。

我记得在做一个干旱区土地覆盖项目时,缨帽变换的湿度分量帮我准确区分了干河床和湿润农田,这是单纯用NDVI做不到的。

# Landsat 8 OLI缨帽变换系数(部分)
# 亮度 = 0.3029*B2 + 0.2786*B3 + 0.4733*B4 + 0.5599*B5 + 0.5080*B6 + 0.1872*B7
# 绿度 = -0.2941*B2 - 0.2430*B3 - 0.5424*B4 + 0.7276*B5 + 0.0713*B6 - 0.1608*B7
# 湿度 = 0.1511*B2 + 0.1973*B3 + 0.3283*B4 + 0.3407*B5 - 0.7117*B6 - 0.4559*B7

def tasseled_cap(bands):
    """bands: [B2, B3, B4, B5, B6, B7]"""
    brightness = (0.3029*bands[0] + 0.2786*bands[1] + 0.4733*bands[2] +
                  0.5599*bands[3] + 0.5080*bands[4] + 0.1872*bands[5])
    greenness = (-0.2941*bands[0] - 0.2430*bands[1] - 0.5424*bands[2] +
                 0.7276*bands[3] + 0.0713*bands[4] - 0.1608*bands[5])
    wetness = (0.1511*bands[0] + 0.1973*bands[1] + 0.3283*bands[2] +
               0.3407*bands[3] - 0.7117*bands[4] - 0.4559*bands[5])
    return brightness, greenness, wetness

3.5 植被指数计算:NDVI、EVI、SAVI

植被指数,是遥感分类中最常用的特征。为什么?因为植被在近红外波段反射率高,在红波段吸收率高,这个差异就是植被的“身份证”。

NDVI(归一化植被指数):最经典,公式是 (NIR - Red) / (NIR + Red)。范围-1到1,植被通常大于0.2。

EVI(增强型植被指数):改进了NDVI在高植被覆盖区的饱和问题,加入了蓝波段校正大气影响。

SAVI(土壤调节植被指数):引入土壤调节因子L,减少土壤背景干扰。L一般取0.5。

选哪个?我的建议:

  • 一般区域用NDVI,简单有效。
  • 高植被覆盖区(如热带雨林)用EVI。
  • 半干旱区、稀疏植被区用SAVI。
# 植被指数计算
def vegetation_indices(nir, red, blue=None, L=0.5):
    ndvi = (nir - red) / (nir + red + 1e-10)
    
    if blue is not None:
        # EVI: G=2.5, C1=6, C2=7.5
        evi = 2.5 * (nir - red) / (nir + 6*red - 7.5*blue + 1)
    else:
        evi = None
    
    # SAVI
    savi = (nir - red) / (nir + red + L) * (1 + L)
    
    return ndvi, evi, savi

3.6 知识体系总览

说了这么多,你可能有点晕。没关系,我画了一张图帮你理清思路:

遥感图像增强与变换知识体系 原始遥感影像 对比度拉伸 线性拉伸 百分比截断 直方图均衡化 滤波与锐化 低通滤波(平滑) 高通滤波(锐化) 主成分分析(PCA) 降维去冗余 前3个PC占95%信息 缨帽变换 亮度、绿度、湿度 植被指数 NDVI / EVI / SAVI 增强后的影像 → 土地覆盖分类

嗯,这张图把本章的核心内容串起来了。从原始影像出发,经过对比度拉伸、滤波锐化、PCA、缨帽变换和植被指数计算,最终得到增强后的特征影像,用于后续分类。

最后提醒一句:增强和变换不是越多越好。我见过有人把PCA、缨帽变换、NDVI全堆在一起,结果特征维度爆炸,分类精度反而下降了。记住:针对性选择,够用就好


公众号:蓝海资料掘金营,微信deep3321