Python 3:如何在GDAL中更改图像数据? [英] Python 3: How to change image data in GDAL?
问题描述
我有一个GeoTIFF图像,其中包含一个颜色表和一个带有8位表键的光栅带,并使用LZW压缩,并通过
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?
我想将数据以RGB形式保存在numpy数组中,所以我想以三个光栅带代替一个.我看到有一个 AddBand 方法,但是如何删除现有频段(或修改频段,因为这些频段恰好具有相同的位深度)?另外,如果我使图像包含三个带而不是一个带,我是否需要做更多的工作来指定三个带代表R,G和B?
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.
此函数假定您有一个数组arr
,该数组在第三维(即第2轴)上具有三个带.
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
这篇关于Python 3:如何在GDAL中更改图像数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!