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

How to read PNG and add data from a tiff file to it and save it as another 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,
   0.0, -10.0, 4100035.0)}
PNG META:  {'driver': 'GTiff', 'dtype': 'float32', 'nodata': None, 'width': 5490, 'height': 5490, 'count': 1, 'crs': None, 'transform': Affine(1.0, 0.0, 0.0,
   0.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

如何实现?

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

但是,我会按照您在 post 的标题中定义的方式回答问题 - 如何读取这两个文件并将它们保存为 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。 但是,要使其正常工作,您需要为两个图像设置相同的大小,这似乎是您现在没有的。 如果您提供有关您拥有的文件的更多数据 - 它们是否重叠?他们有不同的空间分辨率吗?为什么他们的尺寸不同?你的目标是什么?也许我可以提供更多帮助。