Segmentace obrazu

Segmentace obrazu je metoda, která slouží k automatickému rozdělení vlastního obrazu na oblasti se společnými vlastnostmi, které obvykle mají nějaký smysluplný význam. Výsledky segmentace jsou využitelné například při analýze obrazů získaných při dálkovém průzkumu Země (citace z české wikipedie).

Vstupní data

  • letecké snímky viditelného (RGB) a blízkého infračerveného spektra (NIR)
  • digitální model reliéfu (DMR) a povrchu (DMP)
  • stíny (shadows)

Todo

Najít otevřená data pro tuto úlohu.

Import dat

Po spuštění systému GRASS vytvoříme novou lokaci buď na základě vstupních dat anebo pomocí EPSG kódu (v našem případě jde o S-JTSK EPSG:5514).

Vstupní data naimportujeme do mapsetu PERMANENT, viz poznámky k importu rastrových dat ze školení GRASS GIS pro začátečníky.

../_images/segment-import.png

Obr. 54 Ukázka importu vstupních dat.

Poznámka

RGB snímek se po importu rozpadne na tři rastrové mapy (rgb.1, rgb.2 a rgb.3), které jsou registrovány v obrazové skupině rgb, viz příkaz i.group. Jednotlivé obrazové kanály lze složit do barevné kompozice příkazem d.rgb, viz vizualizace dat.

../_images/segment-rgb.png

Obr. 55 Ukázka vizualizace vstupních dat, složení barevné syntézy v pravých (skutečných) barvách.

Proces segmentace obrazu

Do segmentace obrazu bude vstupovat kromě pásem viditelného spektra (rgb.1, rgb.2 a rgb.3) také pásmo blízkého infračerveného spektra (nir). Vytvoříme obrazovou skupinu, která bude tyto vrstvy obsahovat. Nástroj pro správu obrazových skupin je dostupný z menu Imagery ‣ Develop images and groups ‣ Create/edit group anebo jako příkaz i.group.

../_images/segment-group.png

Obr. 56 Vytvoření obrazové skupiny pro segmentaci dat. Zadání názvu (1) a přidání rastrových map do skupiny (2).

Důležité

Před dalším výpočtem je nutné nastavit korektní výpočetní region (viz školení GRASS GIS pro začátečníky). Vzhledem k tomu, že mají vstupní vrstvy RGB a NIR stejné prostorové umístění a rozlišení, stačí zvolit libovolnou vrstvu, např. nir.

../_images/segment-region.png

Nástroj pro segmentaci obrazu i.segment je dostupný v menu Imagery ‣ Clasify image ‣ Object segmentation.

Segmentaci obrazu budeme provádět v několika krocích. Výsledek prvního běhu s práhem (threshold) 0.01 použijeme pro další krok, kde navýšíme práh na hodnotu 0.05. Výsledky první segmetace využijeme v druhém běhu pomocí parametru seeds. Objekty se společnými spekrálními a geometrickými vlastnosti se spojí, jejich počet se zmenší, viz :num:`segment-1-2`.

# první běh (~ 4 350 000 objektů)
i.segment group=seg output=seg1 threshold=0.01
# druhý běh (~ 440 000 objektů)
i.segment group=seg output=seg2 threshold=0.05 seeds=seg1
../_images/segment-1-2.png

Obr. 57 Porovnání objektů vzniklých po prvním a druhém běhu segmentace obrazu.

Ve třetím kroku zvýšíme práh na hodnotu 0.09 a zároveň nastavíme minimální počet pixelů, které formují objekt na 15. Výsledek segmentace je znázorněn :num:`segment-3`.

../_images/segment-rgb-3.png

Obr. 58 Ukázka výsledku segmentace obrazu (třetí běh) a kanálu leteckého snímku.

# třetí běh (~ 25 000 objektů)
i.segment group=seg output=seg3 threshold=0.09 minsize=15 seeds=seg2

Výsledek segmentace převedeme do vektorové reprezentace pomocí modulu r.to.vect (Raster ‣ Map type conversions ‣ Raster to vector). Jako kategorie objektů použijeme rastrové hodnoty, viz přepínač -v.

r.to.vect -v input=seg3 output=seg3 type=area
../_images/segment-vect.png

Obr. 59 Ukázka vizualizace hranic objektů na podkladové vrstvě barevné kompozice v pravých barvách.

Do atributové tabulky můžeme přidat nový atribut výměry objektů. Objekty by měly mít výměru větší než 0,9375m 2 (vstupní data mají prostorové rozlišení 0,25m, minimální velikost objektu byla nastavena na 15 pixelů). Tuto operaci můžete provést ze správce atributových dat anebo pomocí kombinace příkazů v.db.addcolumn a v.to.db:

v.db.addcolumn map=seg3 columns="area double"
v.to.db map=seg3 option=area columns=area
../_images/segment-area.png

Obr. 60 Výběr objektů s minimální výměrou.

Filtrace objektů

Jako podkladové vrstvy pro filtraci objektů využijeme vrstvu normalizovaného diferečního vegetačního indexu (NDVI) vypočteného z vrstev červeného (rgb.1) a blízkého infračerveného (nir) pásma viz. návod na jeho výpočet. Produkt NDVI můžeme vytvořit univerzálním nástrojem mapové albegry anebo přímo pomocí nástroje i.vi.

i.vi red=rgb.1 output=ndvi viname=ndvi nir=nir
../_images/segment-ndvi.png

Obr. 61 Vrstva normalizovaného diferenčního vegetačního indexu.

Dále pomocí nástroje mapové albegry r.mapcalc (Raster ‣ Raster map calculator) vypočteme rastrovou mapu rozdílu výšek digitalního modelu povrchu a terénu:

r.mapcalc exp="diff = dmp - dmr"
../_images/segment-diff.png

Obr. 62 Rastrová mapa rozdílu výšek digitálního modelu povrchu a terénu (tabulka barev: differences).

Statistiku objektů odvozenou z vrstev NDVI a rozdílu výšek určíme pomocí specializovaného modulu i.segment.stats.

i.segment.stats map=seg3 rasters=ndvi,diff raster_statistics=mean area_measures=area vectormap=seg3

Poznámka

Nástroj i.segment.stats není standardní součástí systému GRASS, ale je distrubován jako tzv. addons - rozšíření. Modul nainstalujeme z menu Settings ‣ Addons extensions ‣ Install extensions from addons.

../_images/segment-stats-install.png

Obr. 63 Instalace nástroje i.segment.stats.

Modul i.segment.stats pro svůj běž vyžaduje rozšíření r.object.geometry, které je nutné nainstalovat taktéž.

../_images/segment-ndvi-diff.png

Obr. 64 Objekty s atributy průměrné hodnoty NDVI a rozdílu výšek.

Poznámka

Namísto specializovaného modulu lze využít standardní nástroj zonální statistiky v.rast.stats (Vector ‣ Update attributes ‣ Update area atributes from raster). Ze statistických ukazatelů vybereme průměrnou hodnotu (method=average).

v.rast.stats map=seg3 raster=ndvi column_prefix=ndvi method=average
v.rast.stats map=seg3 raster=diff column_prefix=diff method=average

Na základě těchto atributů můžeme provést jednoduchou klasifikaci objektů. Např.

  • budovy
diff_mean > 2.5 AND ndvi_mean < 0.1

Výběr objektů splňujících dané atributové podmínky můžeme provést pomocí správce atributových dat anebo přímo modulem v.extract.

v.extract input=seg3 where="diff_mean > 2.5 AND ndvi_mean < 0.1" output=budovy
../_images/segment-budovy.png

Obr. 65 Vizualizace výsledku filtrace objektů budov na základě NDVI a rozdílu výšek.