首页 > 解决方案 > 使用 Rasterio 保存窗口图像(作为 jpg 格式)

问题描述

我正在尝试使用 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)

标签: pythonnumpyopencvrasterio

解决方案


您正在尝试将 3 波段图像(您从 中读取01.JPG)保存到 1 波段图像(您使用 中打开count=1)。np.moveaxis只是移动轴的位置,但你仍然有三个轴(因为错误消息告诉你形状是(2000, 2000, 3))。

如果您想保存所有三个波段,但更改顺序(可能创建假彩色/伪彩色图像),您需要更改count=1count=3.

如果你只需要写一个乐队

有两种方法可以做到这一点:您可以在读取01.JPG光栅时只读取一个波段,通过将波段索引作为第一个参数传递给read()函数,或者继续读取所有三个波段并在保存时索引您想要的波段,所以你得到一个形状的数组(2000, 2000)(可能src[i]如果你想阅读 band i)。

请注意,此索引将从 0 开始,遵循 numpy 约定,而不是从 rasterio 读取时的 1 (遵循GDAL 约定从 1 开始波段编号)。


推荐阅读