我正在尝试获取tif光栅文件的最大和最小像素值。
我正在使用GetMaximum()和GetMinimum()方法,但它们什么也没有返回,因此我得到的错误是:
TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'
in文件是一个用于测试目的的小型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
...
我用这个来对光栅进行分类。所以有更多的代码实际上对它进行了分类。此片段旨在获取相等的间隔。
我错过了什么?
答案 0 :(得分:1)
我不确切地知道为什么RasterBand.GetMaximum()
和RasterBand.GetMinimum()
会返回None
。也许在GTiff可以动态访问该值之前需要计算栅格属性表吗?
您可以对numpy.ndarray
变量barray
执行类似的操作。
import numpy as np
# ...
max_value = np.amax(barray)
min_value = np.amin(barray)
这里显而易见的问题是,如果nodata值是最小值或最大值,在这种情况下,这将返回到您的不满。 Landsat有nodata = 0。
您可以通过制作蒙版数组并使用蒙版数组的min
和max
方法来解决这个问题。
import numpy as np
# ...
masked_arr = np.ma.MaskedArray(barray, mask=(barray==0))
max_value = masked_arr.max()
min_value = masked_arr.min()
答案 1 :(得分:0)
为了使gdal的.GetMinimum()和.GetMaximum()返回值,您首先必须计算频段上的统计信息。否则,它将显示为无。至少,这就是我对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())