GDAL:GetMaximum 和 GetMinimum returns 没有值

GDAL: GetMaximum and GetMinimum returns no values

我正在尝试获取 tif 光栅文件的最大和最小像素值。

我正在使用 GetMaximum() 和 GetMinimum() 方法,但它们 return 什么都没有,因此我得到的错误是: TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'

输入文件是用于测试目的的小型 tif 光栅。我确实遇到了与几天前实际工作的其他栅格相同的错误。

这是我一直在尝试的:

from osgeo import gdal

driver = gdal.GetDriverByName('GTiff')
in_file = gdal.Open("L8_field.tif")
band1 = in_file.GetRasterBand(1)
barray = band1.ReadAsArray()

# Getting the interval value and setting the classes
max_value = band1.GetMaximum()
min_value = band1.GetMinimum()

tot_classes = 5
class_1 = class_x + min_value
class_x = (max_value - min_value) / tot_classes
class_2 = (class_x * 2) + min_value
class_3 = (class_x * 3) + min_value
class_4 = (class_x * 4) + min_value
class_5 = max_value
...

我正在使用它对栅格进行分类。所以实际上对它进行分类的代码更多。此代码段旨在获取相等的间隔。

我错过了什么?

我不知道为什么 RasterBand.GetMaximum()RasterBand.GetMinimum() return None。在 GTiff 可以动态访问该值之前,可能需要计算栅格属性 table?

您可以对numpy.ndarray变量barray进行类似的操作。

import numpy as np
# ...
max_value = np.amax(barray)
min_value = np.amin(barray)

这里的明显问题是 nodata 值是最小值还是最大值,在这种情况下 return 会让您不高兴。 Landsat 没有数据=0。

您可以通过制作一个屏蔽数组并使用屏蔽数组的 minmax 方法来解决这个问题。

import numpy as np
# ...
masked_arr = np.ma.MaskedArray(barray, mask=(barray==0))
max_value = masked_arr.max()
min_value = masked_arr.min()

为了使 gdal 的 .GetMinimum() 和 .GetMaximum() 达到 return 值,您首先必须计算波段的统计数据。否则,它显示为 none。至少,这是我对 Sentinel1 雷达图像和干涉图的体验。
一些示例代码。

raster = gdal.Open('YourRasterFile.tiff') # open raster file
band = raster.GetRasterBand(1) # get data into varialbe 'band' so we can actually look at it. 

band.GetMetadata()
if band.GetMinimum is None or band.GetMaximum() is None:
    print("\nGDAL thinks this file has no values: ", file)
    print("[ MAX ] =", band.GetMaximum())
    print("[ MIN ] =", band.GetMinimum())

if band.GetMinimum() is None or band.GetMaximum() is None:
    band.ComputeStatistics(0)

band.GetMetadata()
if band.GetMinimum is None or band.GetMaximum() is None:
    print("\nBollucks to this: ", file)
    print("[ MAX ] =", band.GetMaximum())
    print("[ MIN ] =", band.GetMinimum())
else: 
    print("\nHey, it worked.")
    print("[ MAX ] =", band.GetMaximum())
    print("[ MIN ] =", band.GetMinimum())