从sentinel-2图像计算NDRE指数

问题描述 投票:0回答:1

我之前使用 Sentine-2 的两幅图像(波段 4 和波段 8)计算归一化植被指数 (NDVI),这两个图像的分辨率均为 10m,但是现在我想计算归一化差异红边指数 (NDRE),但是对我来说问题是这个指数,根据公式:

NDRE = (NIR - RED EDGE) / (NIR + RED EDGE)

问题不在于公式,问题在于来自 Sentinel-2 的图像分辨率,频带 5(红边)的分辨率为 20m,频带 8(NIR)的图像分辨率为 10m:

enter image description here

是否可以使用两个不同分辨率的图像计算 NDRE 指数?我应该选择 3 个红边带中的哪一个?

我将感谢任何有想法的人通过使用 Sentinel-2 图像来实现此计算。 谢谢

PD:为了计算 ndvi,我使用了 rasterio 库和 gdal

更新:

我从 rasterio.readthedocs.io/en/latest/topics/resampling.html 中完成了这段代码,但是我更改为不同的比例因子,并且总是得到 20m 单元大小或 20m 像素。

import rasterio
from rasterio.enums import Resampling

upscale_factor = 2

# load band 05 from a sentinel2 footprint
# this is 20m resolution I one an output raster of 10m resolution
with rasterio.open("images/B05.jp2", driver='JP2OpenJPEG') as dataset:

    # resample data to target shape
    data = dataset.read(
        out_shape=(
            dataset.count,
            int(dataset.height * upscale_factor),
            int(dataset.width * upscale_factor)
        ),
        resampling=Resampling.bilinear
    )

    # scale image transform
    transform = dataset.transform * dataset.transform.scale(
        (dataset.width / data.shape[-1]),
        (dataset.height / data.shape[-2])
    )

    
    #Finally I want export image.. save in the disk with crs geotiff
    #...

我应该使用opencv还是其他库来实现它?

python image-processing rasterio satellite-image sentinel2
1个回答
1
投票

您可以使用其他方式。首先,您将从 10m 分辨率图像(波段 08)中提取轮廓。然后你需要从20m分辨率的图像(波段06)中提取数据。

import numpy as np
import rasterio as rio
import os

# T34SFH_20230428T092031_B06.jp2  - 10m resolution
# T34SFH_20230428T092031_B08.jp2  - 20m resolution

# Extracting profile of 10m-resolution image
with rio.open('Input_images/T34SFH_20230428T092031_B08.jp2') as f:
    profile = f.profile
    
# Extracting data-table of 20m-resolution image
with rio.open('Input_images/T34SFH_20230428T092031_B06.jp2') as f:
    data = f.read()

下一步是在 np.repeat 的帮助下使用相同的值对数据进行上采样。您可以使用更高级的方法,例如最近邻、双线性和三次重采样。

resampling_factor = 2 # 20m/10m = 2

# upsampling the array using the same value
resampled_table = np.repeat(data[0], resampling_factor, axis=1).repeat(resampling_factor, axis=0)

最后一步是使用之前保存的10m分辨率图像的配置文件写入新的图像文件并检查分辨率。

# Writing new image
with rio.open('T34SFH_20230428T092031_B06_upsample_10m', 'w', **profile) as img:
    img.write(resampled_table, indexes=1)
    
# checking resolution
with rio.open('T34SFH_20230428T092031_B06_upsample_10m', 'r') as img:
    print(img.res)

分辨率也应为10m。然后,您可以使用上面提到的公式来计算NDRE。

© www.soinside.com 2019 - 2024. All rights reserved.