如何读取PNG并将tiff文件中的数据添加到其中并将其另存为另一个tiff?

问题描述

我有两个文件。一种是 PNG,另一种是 TIFF(或 .jp2)。我想从卫星图像(.jp2 或 .tif)中读取地理空间数据并将其“放入”png 文件,然后将其另存为新的 tif。

我对使用栅格数据非常陌生。我正在使用 Rasterio,到目前为止我已经设法获得了 tif 文件的元数据:

import Rasterio as rio
tif = rio.open("TIFFile.tif")
png = rio.open("PNGFile.png")

tif_read = tif.read()
png_read = png.read()

tif_width = tif.width
tif_height = tif.height
tif_dim = (tif_width,tif_height)

png_width = png.width
png_height = png.height
png_dim = (png_width,png_height)

tif_Meta = tif.Meta
png_Meta = png.Meta

print("TIF Meta: ",tif_Meta)
print("PNG Meta: ",png_Meta)

输出

TIF Meta:  {'driver': 'GTiff','dtype': 'float32','nodata': None,'width': 10980,'height': 10980,'count': 4,'crs': CRS.from_epsg(32635),'transform': Affine(10.0,0.0,699965.0,-10.0,4100035.0)}
PNG Meta:  {'driver': 'GTiff','width': 5490,'height': 5490,'count': 1,'crs': None,'transform': Affine(1.0,1.0,0.0)}

我知道我可以像这样使用原始 tif 元创建一个新的 tif 文件

with rio.open('NEWTIF.tif','w',**tif_Meta) as dst:
    dst.write(tif_read.astype(rio.float32))

鉴于此,基本上,我想知道如何创建一个新的 tif 文件,将另一个 tif 的元添加到 png 文件中 - 将 png 的栅格数据与 tif 的地理空间数据合并。

我一直在寻找这个,但无法理解我在 SO 中发现的内容

How to convert png files to geotiff https://gis.stackexchange.com/questions/371065/apply-same-coordinate-system-to-raster-image-and-geojson-with-rasterio https://gis.stackexchange.com/questions/379027/georeferencing-of-png-and-convert-to-tiff-using-python

如何实现这一目标?

解决方法

首先要说的是,从您的帖子看来,图像的形状不一样,因此它可能更具挑战性,需要更多的处理。

但是,我将回答您在帖子标题中定义的问题-如何读取这两个文件并将它们另存为 tiff。为了做到这一点,我将两个图像作为 numpy 数组读取,将它们堆叠在一起,然后使用光栅对它们进行地理配准。

所以你可以尝试类似这样的seomthin:

import rasterio 
import numpy as np

tif = rio.open("TIFFile.tif")
png = rio.open("PNGFile.png")

tif_read = tif.read()
png_read = png.read()

#stack the arrays to have two bands

img=np.stack([tif_read,png_read])

#write teh results
       with rasterio.open('img.tiff','w',driver='GTiff',height=img.shape[1],width=img.shape[2],count=2,#numebr of bands
                           dtype=img.dtype,crs=tif.crs,nodata=None,# change if data has nodata value
                           transform=tif.transform) as dst:
            dst.write(img[0],1)
            dst.write(img[1],2)

这应该将两个图像保存为带有两个波段的新 tiff。 但是,要使其正常工作,您需要为两个图像使用相同的尺寸,这似乎您现在没有。 如果您提供有关您拥有的文件的更多数据 - 它们是否重叠?它们有不同的空间分辨率吗?为什么它们的尺寸不同?你的目标是什么?也许我可以提供更多帮助。