Interpretace NDVI¶
Jedním z možných postupů je reklasifikace vstupních dat do uživatelem definovaných tříd.
Reklasifikací se přiřadí nové hodnoty vstupním datům, v našem příkadě bychom rádi identifikovali vodní tělesa, ostatní objekty nás nezajímají.
Jak jsme si řekli výše, vodní tělesa by měly mít hodnotu NDVI okolo 0, shodněme se, na hodnotách <-0.1; 0.1>. Výsledný rastrový soubor bude obsahovat 2 hodnoty: 1 a NULL (tedy žádná data), která bude reprezentována číslem -9999.
import rasterio
with rasterio.open('outputs/ndvi.tif') as ndvi:
water = ndvi.read()
limit = 0.1
water[water < -1*limit] = -9999
water[water > limit] = -9999
water[(water >= -1.0*limit) & (water <= 0.1)] = 1
kwargs = ndvi.meta
kwargs.update(dtype=rasterio.int32, count=1, compress='lzw', nodata=-9999)
with rasterio.open('outputs/water.tif', 'w', **kwargs) as dst:
dst.write_band(1, water[0].astype(rasterio.int32))
Poznámka
Takováto identifikace vodních ploch je samozřejmě velmi nepřesná. V DPZ se používají většinou jiné techniky.
Úkol
Pokuste se podobným způsobem do snímku přidat kategorii s hustou vegetací a další kategorie, podle klíče:
- voda
- hustá vegetace
- zástavba
- …
Rozdělíme NDVI do tříd podle jejich hodnoty. NDVI nabývá hodnot od -1 do 1, rozdělíme je na 3 skupiny „od oka“:
1 | Stromy | 1 - 0.4 |
2 | Tráva | 0.4 - 0.2 |
3 | Suchá půda, sníh | 0.1 - -0.1 |
4 | Voda | -0.1 - -1 |
import rasterio
with rasterio.open("outputs/ndvi.tif") as src:
data = src.read(1)
# reklasifikace začíná
data[data > 0.6] = 1
data[(data <= 0.6) & (data > 0.2)] = 2
data[(data <= 0.2) & (data > -0.1)] = 3
data[(data <= -0.1)] = 4
# zápis do souboru
meta = src.meta
meta.update(dtype=rasterio.int16, count=1, compress='lzw')
with rasterio.open('outputs/ndvi-classes.tif', 'w', **meta) as dst:
dst.write_band(1, data.astype(rasterio.int16))
Výsledný soubor obsahuje pouze 4 hodnoty reprezentující jednotlivé třídy.