Использование Rasterio для сохранения изображения окна (как jpg) - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь открыть jpg (01.jpg), используя Python Rasterio, и сохранить окно как jpg. Я могу сделать это для 1 полосы, а не для 3 полос исходного изображения RGB. проблема в перестановке полосы. под моим кодом и ошибкой:

Исходная форма (2000, 2000, 3) несовместима с заданными индексами 1

Я пытался изменить линейный код sr c = np.moveaxis (sr c, [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)

1 Ответ

1 голос
/ 23 июня 2020

Вы пытаетесь сохранить 3-полосное изображение (которое вы читаете из 01.JPG) в 1-полосное изображение (которое вы открыли с помощью count=1). np.moveaxis просто сдвигает позиции осей, но у вас все еще есть три оси (поскольку сообщение об ошибке сообщает вам, что форма (2000, 2000, 3)).

Если вы хотите сохранить все три полосы, но с измененным порядком (возможно, чтобы создать изображение псевдоцвета / псевдоцвета ), вам нужно будет изменить count=1 на count=3.

Если вам нужно написать только одну полосу

Есть два способа сделать это: вы можете прочитать только одну полосу, когда читаете растр 01.JPG, , передав индекс полосы в качестве первого аргумента функции read() , или оставив чтение всех трех диапазонов и индексация диапазона, который вы хотите при сохранении, поэтому вы получаете массив с формой (2000, 2000) (возможно, src[i], если вы хотите прочитать диапазон i).

Обратите внимание, что этот индекс будет начинаться с нуля в соответствии с соглашением numpy вместо 1 при чтении из rasterio (что соответствует соглашению GDAL о начале номеров полос с 1 ).

...