【问题标题】:Does ComputeBandStats take nodata into account?ComputeBandStats 是否将 nodata 考虑在内?
【发布时间】:2016-10-17 20:33:23
【问题描述】:

我正在尝试计算仅部分被数据覆盖的图像的统计信息。我想知道 ComputeBandStats 是否忽略与文件 nodata 具有相同值的像素。

这是我的代码:

inIMG = gdal.Open(infile)

# getting stats for the first 3 bands
# Using ComputeBandStats insted of stats array has min, max, mean and sd values
print "Computing band statistics"
bandas = [inIMG.GetRasterBand(b+1) for b in range(3)]
minMax = [b.ComputeRasterMinMax() for b in bandas]
meanSD = [b.ComputeBandStats(1) for b in bandas]
print minMax
print meanSD

对于没有 nodata 属性的图像,输出为:

Computing band statistics
[(0.0, 26046.0), (0.0, 24439.0), (0.0, 22856.0)]
[(762.9534697777777, 647.9056493556284), (767.642869, 516.0531530834181), (818.0449643333334, 511.5360132592902)]

对于 nodata = 0 的图像,输出为:

Computing band statistics
[(121.0, 26046.0), (202.0, 24439.0), (79.0, 22856.0)]
[(762.9534697777777, 647.9056493556284), (767.642869, 516.0531530834181), (818.0449643333334, 511.5360132592902)]

最小值和最大值已更改,因此 0 不再是最小值,这是有道理的,因为在第二个版本中,它是 nodata,因此不会被 ComputeRasterMinMax() 考虑。但是,均值和标准差没有改变。

这是否意味着 ComputeBandStats 不会忽略 nodata 值?
有什么方法可以强制 ComputeBandStats 忽略 nodata 值?

【问题讨论】:

    标签: python python-2.7 python-3.x numpy gdal


    【解决方案1】:

    设置 NoData 值对数据本身没有影响。你可以这样试试:

    # First image, all valid data
    data = numpy.random.randint(1,10,(10,10))
    driver = gdal.GetDriverByName('GTIFF')
    ds = driver.Create("stats1.tif", 10, 10, 1, gdal.GDT_Byte)
    ds.GetRasterBand(1).WriteArray(data)
    print ds.GetRasterBand(1).ComputeBandStats(1)
    print ds.GetRasterBand(1).ComputeStatistics(False)
    ds = None
    
    # Second image, values of "1" set to no data
    driver = gdal.GetDriverByName('GTIFF')
    ds = driver.Create("stats2.tif", 10, 10, 1, gdal.GDT_Byte)
    ds.GetRasterBand(1).SetNoDataValue(1)
    ds.GetRasterBand(1).WriteArray(data)
    print ds.GetRasterBand(1).ComputeBandStats(1)
    print ds.GetRasterBand(1).ComputeStatistics(False)
    ds = None
    

    请注意ComputeBandStats 返回的统计数据不变,但ComputeStatistics 返回的统计数据是:

    >>> (4.97, 2.451346568725035)
    >>> [1.0, 9.0, 4.970000000000001, 2.4513465687250346]
    
    >>> (4.97, 2.451346568725035)
    >>> [2.0, 9.0, 5.411111111111111, 2.1750833672117]
    

    您可以手动确认统计信息是否正确:

    numpy.mean(data)
    numpy.mean(data[data != 1])
    numpy.std(data)
    numpy.std(data[data != 1])
    
    >>> 4.9699999999999998
    >>> 5.4111111111111114
    >>> 2.4513465687250346
    >>> 2.1750833672117
    

    【讨论】:

    • 谢谢,这正是我所需要的!您将 ComputeStatistics 的参数设置为 False。你知道参数是什么吗?有什么文档可以查到吗?
    • 我发现我通常可以通过查看原始文档来找出 Python 绑定:gdal.org/…。参数为bApproxOK;当True 时,统计数据是从概览或文件的子集计算的,当False 时,它们是使用所有数据实际数据值计算的..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2019-05-06
    相关资源
    最近更新 更多