我需要开发一个初始 python 代码来获取具有 RGB 波段的 8 位无符号整数 JPEG 图像,运行 VARI 波段索引:(Vari = (green - red) / (green + red - blue)),然后提供输出图像,其值范围为 -1 到 1。
我曾尝试利用 GDAL 并通过 struct.pack 方法运行该过程,以逐行计算每个像素的索引值,但我认为这使这变得复杂。
目前我有一个使用 Rasterio 编写的代码,但由于格式问题,我找不到正确返回值的方法。- 输入 JPEG 为 8 位 uint 意味着结果值的范围为 0-255 - 如果我尝试除以最大值,则图像中每个像素值的格式都会舍入为 0 - 当我尝试定义输出为 float32 我收到有关 JPEG 格式或 str 格式的错误,具体取决于使用的代码
import rasterio
import numpy
image_file = "input file name"
# We handle the connections with "with"
with rasterio.open(image_file) as src:
band_red = src.read(1)
with rasterio.open(image_file) as src:
band_green = src.read(2)
with rasterio.open(image_file) as src:
band_blue = src.read(3)
# Allow division by zero
numpy.seterr(divide='ignore', invalid='ignore')
# Calculate VARI
vari = (band_green.astype(rasterio.uint8) -
band_red.astype(rasterio.uint8))/ (band_green + band_red -
band_blue.astype(rasterio.uint8))
vari_out = vari
# Set spatial characteristics of the output object to mirror the input
kwargs = src.meta
kwargs.update(
dtype=rasterio.uint8,
count = 1)
# Create the file
with rasterio.open('output file name', 'w', **kwargs) as dst:
dst.write_band(1, vari_out.astype(rasterio.uint8))
VARI 波段索引应返回从 -1 到 1 的每个像素的值。此时,我几乎肯定输入和输出之间的格式差异是问题所在,但我很难找到解决此问题的方法。如果您有任何建议,或者如果我这样做完全错误,请告诉我您认为可行的方法。