python - 使用 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)
解决方案
您正在尝试将 3 波段图像(您从 中读取01.JPG
)保存到 1 波段图像(您使用 中打开count=1
)。np.moveaxis
只是移动轴的位置,但你仍然有三个轴(因为错误消息告诉你形状是(2000, 2000, 3)
)。
如果您想保存所有三个波段,但更改顺序(可能创建假彩色/伪彩色图像),您需要更改count=1
为count=3
.
如果你只需要写一个乐队
有两种方法可以做到这一点:您可以在读取01.JPG
光栅时只读取一个波段,通过将波段索引作为第一个参数传递给read()
函数,或者继续读取所有三个波段并在保存时索引您想要的波段,所以你得到一个形状的数组(2000, 2000)
(可能src[i]
如果你想阅读 band i
)。
请注意,此索引将从 0 开始,遵循 numpy 约定,而不是从 rasterio 读取时的 1 (遵循GDAL 约定从 1 开始波段编号)。
推荐阅读
- .net-core - WSO2 v5.9.0 SAMLS SSO 与服务提供商 (AD) '用户必须在下次登录时更改密码' 导致身份验证错误而不是重定向到 .NET 应用程序
- google-oauth - 如何从 ASP.NET Core Web API 中的谷歌外部提供者获取标识值
- azure - 在 GitHub 存储库上同步 python 代码并在 Azure 函数上部署
- firefox - 新标签页上的greasemonkey开始刷新功能
- php - 如何让 PHP getter/setter 从他们的领域继承 DocBlock?
- vue.js - vue中可以不显示源代码吗?
- makefile - 如何检查是否设置了在外部文件中定义的目标中使用的变量
- git - Windows 终端 - 通过 oh-my-posh/posh-git 设置主题错误的 PowerShell 自定义?
- python - Python Selenium 无头线程
- git - Docker COPY 使用 git lfs 使 Github 操作失败