0

我需要开发一个初始 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 的每个像素的值。此时,我几乎肯定输入和输出之间的格式差异是问题所在,但我很难找到解决此问题的方法。如果您有任何建议,或者如果我这样做完全错误,请告诉我您认为可行的方法。

4

0 回答 0