You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Sentinel-2影像计算NDRE指数的波段选择与重采样问题

Sentinel-2 NDRE计算问题解决方案

1. 不同分辨率波段的运算规则

  • 分辨率不一致的波段不能直接参与栅格代数运算。参与NDRE计算的NIR波段和红边波段必须保证空间参考系、像元大小、行列数、空间覆盖范围完全对齐,否则会出现像元错位,计算结果完全失真。
  • 不需要引入OpenCV等额外第三方库,你正在使用的rasterio+GDAL组合完全可以满足重采样、对齐、指数计算的全流程需求。
  • Sentinel-2各波段原生分辨率参考:
    Sentinel-2各波段分辨率说明

2. NDRE计算的红边波段选择

  • 标准NDRE指数固定选用Sentinel-2的B05波段(中心波长705nm,原生分辨率20m),这是遥感领域通用的标准选择。
  • 其余两个20m分辨率红边波段B06(中心波长740nm)、B07(中心波长783nm)仅适用于改进型红边指数计算,不用于标准NDRE生产。

3. B05波段20m转10m重采样代码修正

你之前的重采样数据读取、仿射变换矩阵计算逻辑没有问题,输出结果始终为20m像元的核心原因是写出文件时没有更新栅格元数据中的高度、宽度、仿射变换参数,直接沿用了原始20m波段的元数据,导致输出文件的像元尺寸没有按重采样结果更新。修正后的完整可运行代码如下:

import rasterio
from rasterio.enums import Resampling

# 重采样参数配置:20m转10m对应放大倍数为2
upscale_factor = 2
input_b05 = "images/B05.jp2"
output_b05_10m = "images/B05_10m.tif"

with rasterio.open(input_b05, driver='JP2OpenJPEG') as src:
    # 按目标分辨率读取重采样数据,植被相关重采样推荐用双线性插值
    resampled_arr = src.read(
        out_shape=(
            src.count,
            int(src.height * upscale_factor),
            int(src.width * upscale_factor)
        ),
        resampling=Resampling.bilinear
    )

    # 计算10m分辨率对应的仿射变换矩阵
    new_transform = src.transform * src.transform.scale(
        (src.width / resampled_arr.shape[-1]),
        (src.height / resampled_arr.shape[-2])
    )

    # 复制原始元数据,更新为10m分辨率对应的参数
    out_profile = src.profile.copy()
    out_profile.update(
        driver="GTiff",
        height=resampled_arr.shape[1],
        width=resampled_arr.shape[2],
        transform=new_transform
    )

    # 写出重采样后的10m分辨率B05波段
    with rasterio.open(output_b05_10m, "w", **out_profile) as dst:
        dst.write(resampled_arr)

操作提示:重采样得到10m分辨率B05后,建议再通过rasterio.warp.reproject做一次和B08波段的逐像元对齐,确保两个波段的空间范围、行列数完全匹配,避免边缘像元错位导致的计算误差。对齐后就可以直接套用NDRE公式完成计算。

内容的提问来源于stack exchange,提问作者FreddicMatters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:03:20