Python 如何读取PNG,将tiff文件中的数据添加到PNG中,并将其另存为另一个tiff?
我有两个文件。一个是PNG,另一个是TIFF(或.jp2)。我想从卫星图像(.jp2或.tif)中读取地理空间数据并将其“放入”png文件,然后将其另存为新的tif 我对使用光栅数据非常陌生。我正在使用rasterio,到目前为止,我已成功获取tif文件的元数据:Python 如何读取PNG,将tiff文件中的数据添加到PNG中,并将其另存为另一个tiff?,python,tiff,gdal,rasterio,satellite-image,Python,Tiff,Gdal,Rasterio,Satellite Image,我有两个文件。一个是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 = ti
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的地理空间数据合并
我一直在寻找这个,但无法理解我在中发现了什么,所以:
如何实现这一点?首先,重要的是,从你的帖子中可以看出,图像似乎没有相同的形状,因此可能更具挑战性,需要更多的处理 不过,我将回答您在文章标题中定义的问题-如何读取这两个文件并将其保存为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。
然而,为了使这项工作,你将需要有两个图像相同的大小,这似乎利克你现在没有。
如果您提供更多关于您拥有的文件的数据-它们是否重叠?它们有不同的空间分辨率吗?为什么它们的尺寸不同?你的目标是什么?也许我能帮上更多的忙。非常感谢您的帮助。我想我被它启发了。我可以使用相同大小的图像。让我多读一读,然后试一下,很快就会回复你。@ 0xMTH,如果你觉得答案有用,请考虑接受,谢谢!哦,这是个打字错误,我的意思是“谢谢妈妈!”,我的错:好吧,你不知道