Порядок полос
Порядок полос имеет значение, и их можно заказать по-разному в зависимости от TIFF.В документации данных должно быть указано, каков порядок полос, и, надеюсь, его можно прочитать из самих данных (мой опыт показывает, что это часто не так).
Сначала вы можете попробовать проверить метки полос (хотя,вы все еще хотите обратиться к документации).
>>>src.descriptions
(None, None, None, None)
Если там ничего не помечено, вам следует обратиться к документации по данным.
Допустим, есть 4 полосы, заказанные как BGRN (какв ближнем инфракрасном диапазоне - ближний ИК-порт);тогда вы захотите первые три полосы, но в обратном порядке.
data = src.read([3,2,1])
Нормализация и типы данных
Если ваши полосы не в порядке RGB, вероятно,что он имеет 16-битный целочисленный тип данных, и вам нужно 8 бит для рисования через imshow
(или записи в другую кодировку изображений, например, PNG и JPEG).Сначала нормализуйте данные до 0-255, затем приведите от uint16
к uint8
.Обратите внимание, что при этом вы теряете точность, поэтому вы хотите провести анализ исходных данных.
import numpy
def normalize(x, lower, upper):
"""Normalize an array to a given bound interval"""
x_max = numpy.max(x)
x_min = numpy.min(x)
m = (upper - lower) / (x_max - x_min)
x_norm = (m * (x - x_min)) + lower
return x_norm
# Normalize each band separately
data_norm = numpy.array([normalize(data[i,:,:], 0, 255) for i in range(data.shape[0])])
data_rgb = data_norm.astype("uint8")
Библиотеки изображений и измерения данных
Если вы используетебиблиотека, отличная от rasterio
, например, cv2
или PIL
, порядок считывания полос из изображений RGB (A) может отличаться, а также порядок размеров.Если вам нужно изменить порядок размеров для вашего метода построения графика, вы можете сделать следующее
# Make the first (band) dimension the last
plt.imshow(numpy.moveaxis(data, 0, -1))