Search code examples
percentagestatic-analysisgdal

Using GDAL and python to calculate statistics of pixel value


I have a geotiff image created using GDAL. I would like to know if it is possible using GDAL and Python (or only one of them) to extract the pixel percentage of specific value.

In particular, if I do:

gdalinfo -hist input.tif

I get all the metadata info and, in particular,

Size is 4901, 2867
...
Band 1 Block=4901x1 Type=Byte, ColorInterp=Palette
  Minimum=0.000, Maximum=5.000, Mean=2.263, StdDev=1.135
0...10...20...30...40...50...60...70...80...90...100 - done.
  256 buckets from -0.5 to 255.5:
  1740973 365790 6385650 3688110 1757506 113138 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Is there a way to calculate the pixel percentage of the 6 values defined in the histogram?

The size of the .tif file is 4901x2867 so if I can extract each of those fields using GDAL and/or Python then I can calculate something like this:

pixel_value_0 = 1740973/(4901x2867)

and get the percentage of the pixel value 0


Solution

  • You can convert raster image to a Numpy array and then do the calculation if using Python

    from collections import Counter
    from osgeo import gdal_array
    
    # Read raster data as numeric array from file
    rasterArray = gdal_array.LoadFile('RGB.byte.tif')
    
    # The 3rd band
    band3 = rasterArray[2]
    # Flatten the 2D array to 1D and count occurrences of each values
    # Then simple to get the stat for a pixel value in particular
    print(Counter(band3.flatten()))