我之前使用 Sentine-2 的两幅图像(波段 4 和波段 8)计算归一化植被指数 (NDVI),这两个图像的分辨率均为 10m,但是现在我想计算归一化差异红边指数 (NDRE),但是对我来说问题是这个指数,根据公式:
NDRE = (NIR - RED EDGE) / (NIR + RED EDGE)
问题不在于公式,问题在于来自 Sentinel-2 的图像分辨率,频带 5(红边)的分辨率为 20m,频带 8(NIR)的图像分辨率为 10m:
是否可以使用两个不同分辨率的图像计算 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还是其他库来实现它?
您可以使用其他方式。首先,您将从 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。