我正在尝试使用Python Rasterio打开一个jpg(01.jpg并将窗口另存为jpg 我可以为 1 个波段执行此操作,而不是为 RGB 源图像的 3 个波段执行此操作。 问题在于乐队重新排列。 在我的代码和错误下面:
源形状 (2000, 2000, 3( 与给定索引 1 不一致
我试图修改行代码 src = np.moveaxis(src, [0, 1, 2], [2, 1, 0]( 但我仍然有错误.. 你能提供建议吗?
import cv2
import numpy as np
import rasterio
from rasterio.plot import show
w =2000
h = 2000
tile = np.ones((w,h))
cv2.imwrite('tile.jpg', tile)
with rasterio.open('01.JPG') as src:
src = src.read(window=Window(0, 0, w, h))
show(src)
with rasterio.open('tile.jpg', 'w', driver='GTiff',width=w, height=h, count=1,dtype=src.dtype) as tile:
src = np.moveaxis(src, [0, 1, 2], [2, 1, 0])
tile.write(src)
您正在尝试将 3 波段影像(从01.JPG
读取(保存到 1 波段影像(使用count=1
打开(。np.moveaxis
只是移动轴位置,但您仍然有三个轴(因为错误消息告诉您形状(2000, 2000, 3)
(。
如果要保存所有三个波段,但顺序已更改(可能是为了创建假彩色/伪彩色影像(,则需要将count=1
更改为count=3
。
如果你只需要写一个乐队
有两种方法可以做到这一点:您可以在读取01.JPG
栅格时仅读取一个波段,方法是将波段索引作为第一个参数传递给read()
函数,或者继续读取所有三个波段并在保存时对所需波段进行索引,从而获得形状为(2000, 2000)
的数组(如果要读取波段i
,可能src[i]
(。
请注意,按照 numpy 约定,此索引将从零开始,而不是从 rasterio 读取时从 1 开始(遵循从 1 开始波段编号的 GDAL 约定(。