Визуализация геопространственных изображений .tiff с помощью Rasterio - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь визуализировать изображение .tiff в Jupiter Notebook с помощью Rasterio. Я младший специалист по данным в компании AgriTech, и мы только что получили доступ к 8 уровням данных (NDVI et c.) Для двух ферм в формате .tiff.

Вот метаданные для одного изображения:

{'driver': 'GTiff', 'dtype': 'float32', 'nodata': -125125.0, 'width': 72, 'height': 87, 'count': 1, 'crs': CRS.from_epsg(32734), 'transform': Affine(20.0, 0.0, 364480.0,
       0.0, -20.0, 6292100.0), 'blockxsize': 256, 'blockysize': 256, 'tiled': True, 'compress': 'lzw', 'interleave': 'band'}

Когда я запускаю следующее:

ax = plt.figure(figsize=(15,10))

pic = rasterio.open('/content20180109_biow_Meerlust.tif','r',driver='GTiff',width=72,
      height=87,count=1, nodata=-125125.0)

show(pic,with_bounds=False)

, я получаю очень пиксельное изображение:

test image

Как визуализировать изображение, чтобы оно не было пиксельным? Мои знания о настройках массива за этими изображениями .tiff ограничены, поскольку я только начал заниматься агрономией. Открыт для любых предложений.

Моя цель - создать веб-приложение с использованием Streamlit, в котором я могу наложить эти изображения и создать короткое видео о том, как слои меняются с течением времени.

1 Ответ

2 голосов
/ 29 июня 2020

Вот несколько решений, которые могут помочь визуализировать многополосные растры с большей ясностью. В обоих примерах raster - это rasterio.DatasetReader с несколькими полосами ( проиндексировано как 1 ).

1. Одно изображение

Чтобы просмотреть все слои в одной 2D-плоскости, полосы должны быть объединены:

import numpy as np
import matplotlib.pyplot as plt

bands = []
for i in range(raster.count):
    bands.append(raster.read(i+1, out_dtype=np.intc))

plt.title("Full Color Raster")
plt.imshow(np.array(bands))
plt.show()

К сожалению, из-за ограничений imshow() pyplot , этот метод работает только с несколькими слоями (традиционно RGB). Не стесняйтесь использовать типы данных, отличные от np.intc.

2. Отдельная визуализация слоев

Модуль earthpy.plot имеет несколько чистых опций для визуализации растровых слоев, включая удобный plot_bands():

import numpy as np
import earthpy.plot as ep

bands = []

# Read the raster's bands to an array
for i in range(raster.count):
    bands.append(raster.read((i+1), out_dtype=raster.dtypes[i]))

# Convert to an iterable np.ndarray and plot in a 3-column grid
ep.plot_bands(np.array(bands), cols=3) 

Очень надеюсь, что это поможет! Это мой первый ответ о переполнении стека , поэтому дайте мне знать, если что-то важное я пропустил.

...