简体   繁体   中英

Python 3: How to change image data in GDAL?

I have a GeoTIFF image that contains a color table and a single raster band with 8-bit table keys, and that uses LZW compression, that I load with gdal.Open . I also have a numpy array containing 24-bit RGB-values (for a blurred version of the image), corresponding to three 8-bit raster bands. I need to substitute these three raster bands for the raster band that is currently in the image, and then save the image (preferably as a new file if possible). How do I do that?

I would like to keep the data in the numpy array in RGB form, so I would like to end up with three raster band instead of one. I see that there is an AddBand method, but how do I remove an existing band (or modify it, since the bands happen to have the same bit-depth)? Also, if I make the image contain three bands instead of just one, do I need to do something more to specify that the three bands represent R, G and B?

The way I would do it, to just create a fresh copy of your template raster with the new values ... If you want to avoid having copies at all costs, you could also overwrite. But creating a copy is less error prone, and you can retain the original.

This function assumes that you have an array arr , which has three bands in the third dimension (so 2nd axis).

import gdal

def createRGB(template,arr,filename):
    '''Creates a copy of a 3-band raster with values from array

    Arguments:

        template: Path to template raster
        arr: Value array with dimensions (r,c,3)
        filename: Output filename for new raster 
    '''

    # Open template
    t = gdal.Open(template)

    # Get geotiff driver
    driver = gdal.GetDriverByName('GTiff')

    # Create new raster
    r = driver.Create(filename, t.RasterXSize, t.RasterYSize, 3, gdal.GDT_Byte,['COMPRESS=LZW'])

    # Set metadata
    r.SetGeoTransform(t.GetGeoTransform())
    r.SetProjection(t.GetProjection())

    # loop through bands and write new values
    for bix in range(3):

        rb = self.raster.GetRasterBand(bix+1)

        # Write array
        rb.WriteArray(arr[...,bix])

    # Close datasets
    t = None
    r = None
    rb = None

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM