Python 3: How to change image data in GDAL?

风流意气都作罢 提交于 2019-12-12 09:48:45

问题


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?


回答1:


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


来源:https://stackoverflow.com/questions/52261722/python-3-how-to-change-image-data-in-gdal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!