Python 3: Как изменить данные изображения в GDAL? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть изображение GeoTIFF, которое содержит таблицу цветов и одну растровую полосу с 8-битными клавишами таблицы, и использует сжатие LZW, которое я загружаю с помощью gdal.Open. У меня также есть пустой массив, содержащий 24-битные RGB-значения (для размытой версии изображения), соответствующие трем 8-битным растровым полосам. Мне нужно заменить эти три растровые полосы на растровую полосу, которая в данный момент находится на изображении, а затем сохранить изображение (желательно, как новый файл, если это возможно). Как мне это сделать?

Я бы хотел сохранить данные в массиве numpy в виде RGB, поэтому я бы хотел получить три растровые полосы вместо одной. Я вижу, что существует метод AddBand , но как мне удалить существующую полосу (или изменить ее, поскольку полосы имеют одинаковую битовую глубину)? Кроме того, если я сделаю изображение содержащим три полосы вместо одной, нужно ли сделать что-то еще, чтобы указать, что эти три полосы представляют R, G и B?

1 Ответ

0 голосов
/ 14 сентября 2018

То, как я бы это сделал, просто создать новую копию растра шаблона с новыми значениями ... Если вы хотите избежать копий любой ценой, вы также можете перезаписать. Но создание копии менее подвержено ошибкам, и вы можете сохранить оригинал.

Эта функция предполагает, что у вас есть массив arr, который имеет три полосы в третьем измерении (поэтому 2-я ось).

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
...