153YZOD Zpracování obrazových dat 2006 - 2. cvičení
Základy práce s GRASSem, statistika rastrových dat, tabulka barev
osnova
Nejprve si představíme modul d.zoom, který umožňuje interaktivně měnit aktivní region - tzv. transfokaci, "zoomování". Poté si ukážeme, jak vytvářet základní (statistické) charakteristiky mapy, nakonec si objasníme pojem tabulka barev.
seznam použitých příkazů
- g.region
- r.info
- d.mon
- d.rast
- d.zoom
- r.stats
- r.report
- d.rast.num
- d.what.rast
- r.colors
- d.erase
- d.redraw
region
Zvolíme opět location sevcech a mapset student.
Ukážeme si tedy způsob, jak lze interaktivně - pomocí myši měnit aktivní region, tj. přiblížit či oddálit zvolený detail (transfokace, zoom in/out). Pro jistotu nastavíme aktivní region exaktně podle vybraného družicového snímku (zároveň si necháme nastavení regionu vypsat do konzole; viz parametr -p):
#nastavit aktivní region exaktně podle rastrové vrstvy a vypsat nastavení do konzole # GRASS:~ > g.region rast=tm1 -p projection: 99 (krovak) zone: 0 datum: towgs84=570.8,85.7,462.8,4.998,1.587,5.261,3.56 ellipsoid: bessel north: -957500 south: -1007318 west: -830529 east: -763855.0602047 nsres: 29.99277544 ewres: 29.99277544 rows: 1661 cols: 2223
Vše tedy nasvědčuje tomu, že pracujeme s georeferencovanými - souřadnicově připojenými daty. Kromě informace o souřadnicovém systému (v tomto případě jde o S-JTSK) a rozsahu území (severní, jižní, západní a východní souřadnice) si všimneme rozlišení ve směru sever-jih, resp. východ-západ. Jako poslední je uveden odpovídají počet řádků a sloupců. Geometrické rozlišení družicového snímku (LandSat TM5, kanál 1) je tedy 30 m (tj. jeden pixel odpovídá na zemském povrchu čtverci o rozměrech 30 x 30 m).
Základní informace o rastrových datech (metadata - "data o datech") poskytuje modul r.info:
GRASS:~ > r.info tm1 +----------------------------------------------------------------------------+ | Layer: tm1 Date: Thu Oct 21 09:47:24 2004 | | Mapset: PERMANENT Login of Creator: martin | | Location: sevcech | | DataBase: /home/martin/grassdata | | Title: Landsat 5 TM - band 1 ( tm1 ) | |----------------------------------------------------------------------------| | | | Type of Map: raster Number of Categories: 255 | | Data Type: CELL | | Rows: 1661 | | Columns: 2223 | | Total Cells: 3692403 | | Projection: krovak (zone 0) | | N: -957500 S: -1007318 Res: 29.99277544 | | E: -763855.0602047 W: -830529 Res: 29.99277544 | | Range of data: min = 0 max = 255 | | | | Data Source: | | | | | | | | Data Description: | | generated by r.in.gdal | | | | | +----------------------------------------------------------------------------+
Jde především o typ dat (Data Type): CELL (celočíselná mapa, tj. hodnota rastrové buňky je celé číslo), DCELL (mapa s hodnotami s plovoucí desetinnou čárkou); počet kategorií a rozsah dat (Number of Categories, Range of data). V tomto případě snímek obsahuje hodnoty v rozsahu [0; 255]. Další položky, předpokládám, není nutno blíže vysvětlovat.
Poznámka: Družicové snímky jsou tedy kódovány jako celočíselné rastrové soubory.
Nyní si konečně prakticky procvičíme zoomování v grafickém okně. Otevřeme tedy GRASS monitor a zobrazíme zvolený kanál družicové scény, následně spustíme modul d.zoom. Sledujeme nápovědu (funkce tlačítek myši) modulu v konzoli a zkoušíme měnit zobrazený detail (zoom in/out).
GRASS:~ > d.mon x0 GRASS:~ > d.rast tm1 GRASS:~ > d.zoom Buttons: Left: 1. corner Middle: Unzoom Right: Quit
Levým tlačítkem myši vybereme první roh zvoleného detailu.
Buttons: Left: 1. corner (reset) Middle: 2. corner Right: Quit
A středním tlačítkem dokončíme označení výběru. Funkce tlačítek myši se změní.
Buttons: Left: 1. corner Middle: Unzoom Right: Quit
Zmenšení detailu tedy obstará prostřední tlačítko myši, pravé ukončí práci s modulem. Pokud chcete pokračovat v další práci, je nutno tento modul standardně ukončit! V opačném případě zůstane grafické okno blokováno.
Velmi užitečné je spustit tento modul s přepínačem -f, tím je funkčnost modulu rozšířena o posun (centraci pohledu):
Buttons: Left: Zoom menu Middle: Pan Right: Quit menu
Podobně se chová i přepínač -p, který nabízí pouze funkci posunu. Ovládání modulu d.zoom je nutno nacvičit, není to ale nic složitého, stačí sledovat aktuální funkci jednotlivých tlačítek myši v konzoli.
V případě, že chceme zobrazit znovu celou družicovou scénu, použijeme opět modul g.region. Aktivní region v žádném případě nenastavujeme ručně pomocí d.zoom, nýbrž přesně na základně okrajových souřadnic mapové vrstvy (g.region rast=tm1). Způsob ovládání pohledů může začátečníkovi, navyklému na interaktivní práci v jiných produktech, připadat neohrabaný, zastaralý či pomalý. Je si však nutno uvědomit, že potenciál GRASSu neleží v možnostech vizualizace dat, nýbrž jejich zpracování a dalších analýzách!
základní statistika rastrových dat
Předtím než se vrátíme k zobrazování rastrových dat (obrazová data, tedy i družicové snímky, jsou uloženy jako běžné rastrové soubory) v GRASS monitoru si představíme modul r.stats, který poskytuje základní charakteristiky jednotlivých hodnot buněk rastrového souboru. Na standardní výstup (parametr output umožňuje uložit vytvořenou statistiku do souboru) vytiskne na jeden řádek hodnotu buňky a hledanou veličinu (nastaveno pomocí přepínače).
#celkový počet rastrových buněk # GRASS:~ > r.stats tm1 -c # #procenta (přibližně) # GRASS:~ > r.stats tm1 -p # #celková plocha (v mapových jednotkách) # GRASS:~ > r.stats tm1 -a
Např. pro celkový počet buněk:
r.stats: 100% 0 82866 55 3 56 6 57 84 58 1582 59 9348 60 17795 61 63258 62 113037 63 110564 ...
Poznámka: Pokud výpis přesahuje velikost okna, je dobré tento výstup přesměrovat do programu less, který umožňuje pohyb mezi jednotlivými stránkami. Tento program ukončíme klávesou q (quit). V tomto případě by příkaz vypadal takto r.stats tm1 | less.
Výpis je řazen podle hodnot rastrových buněk. Nyní si poprvé ukážeme způsob, jak kombinovat jednotlivé moduly GRASSu s dalšími (systémovými) nástroji OS GNU/Linux. Právě v tom spočívá obrovská síla této koncepce - podle momentální potřeby uživatele spojit do jednoho celku několik malých programů, které si předávají mezivýsledky tzv. rourou.
My tedy chceme seřadit výstup modulu r.stats podle celkového počtu buněk, nikoliv podle jejich hodnot. Jak tedy budeme postupovat? Nejprve prohodíme sloupce (první bude obsahovat počty buněk) - program awk, tento polotovar zpracuje systémová aplikace sort, která provede požadované numerické setřídění. Pokud nás trápí pořadí sloupců, můžeme je na závěr opět prohodit. Poznamenejme, že sort nejsou součástí GRASSu, jde o standardní programy, které naleznete pravděpodobně v každé distribuci GNU/Linuxu. Celý příkaz vypadá asi takto:
GRASS:~ > r.stats tm1 -c | awk '{print $2,$1}' | sort -n | awk '{print $2,$1}'
Uživatel neznalý příkazové řádky, rour, démonů a podobných věcí se děsí, přestává číst a znechuceně odchází. Nic není tak složité jak vypadá! Zde je modifikovaný výstup:
r.stats: 100% 55 3 250 6 56 6 201 10 246 10 225 14 ... 82 67454 0 82866 79 85112 72 104687 63 110564 62 113037 77 129905 76 134776 71 140830 78 143541 68 156477 73 165429 64 174129 67 189458 74 196145 70 201288 75 203466 69 205577 65 220524 66 281680
Podobné charakteristiky mapy poskytuje i modul r.report, jeho výstup má formu úhledně sestavené tabulky. Např.:
#tabulka (celkový počet buněk, procenta, výměra v hektarech) # GRASS:~ > r.report tm1 units=c,p,h +-----------------------------------------------------------------------------+ | RASTER MAP CATEGORY REPORT | |LOCATION: sevcech Sun Oct 16 17:17:05 2005| |-----------------------------------------------------------------------------| | north: -957500 east: -763855 | |REGION south: -1007318 west: -830529 | | res: 29.99277544 res: 30.00630063 | |-----------------------------------------------------------------------------| |MASK:none | |-----------------------------------------------------------------------------| |MAP: Landsat 5 TM - band 1 (tm1 in PERMANENT) | |-----------------------------------------------------------------------------| | Category Information | cell| % | | | #|description | count| cover| hectares| |-----------------------------------------------------------------------------| | 0| . . . . . . . . . . . . . . . . . . . . . . . | 82866| 2.25| 7457.71| | 55| . . . . . . . . . . . . . . . . . . . . . . . | 3| 0.00| 0.27| | 56| . . . . . . . . . . . . . . . . . . . . . . . | 6| 0.00| 0.54| | 57| . . . . . . . . . . . . . . . . . . . . . . . | 84| 0.00| 7.56| | 58| . . . . . . . . . . . . . . . . . . . . . . . | 1582| 0.04| 142.38| | 59| . . . . . . . . . . . . . . . . . . . . . . . | 9348| 0.25| 841.29| | 60| . . . . . . . . . . . . . . . . . . . . . . . | 17795| 0.48| 1601.50| | 61| . . . . . . . . . . . . . . . . . . . . . . . | 63258| 1.71| 5693.04| | 62| . . . . . . . . . . . . . . . . . . . . . . . | 113037| 3.06| 10,173.02| ... |249| . . . . . . . . . . . . . . . . . . . . . . . | 23| 0.00| 2.07| |250| . . . . . . . . . . . . . . . . . . . . . . . | 6| 0.00| 0.54| |251| . . . . . . . . . . . . . . . . . . . . . . . | 18| 0.00| 1.62| |252| . . . . . . . . . . . . . . . . . . . . . . . | 22| 0.00| 1.98| |253| . . . . . . . . . . . . . . . . . . . . . . . | 25| 0.00| 2.25| |254| . . . . . . . . . . . . . . . . . . . . . . . | 14| 0.00| 1.26| |255| . . . . . . . . . . . . . . . . . . . . . . . | 2376| 0.06| 213.83| |-----------------------------------------------------------------------------| |TOTAL |3690742|100.00|332,156.53| +-----------------------------------------------------------------------------+
vizualizace rastrových dat
Vidíme tedy, že nejvíce rastrových buněk obsahuje hodnotu v rozsahu [60; 80]. Nyní si ukážeme, jakým způsobem zobrazit v GRASS monitoru pouze vybrané kategorie (resp. hodnoty buněk) či jejich interval - k tomu slouží parametr catlist modulu d.rast.
#zobrazit pouze rastrové buňky s hodnotou 70 # GRASS:~ > d.rast map=tm1 catlist=70 # #zobrazit rastrové buňky s hodnotou 70 a <75;80>; # GRASS:~ > d.rast map=tm1 catlist=70,75-80 # #zobrazit rastrové buňky mimo interval <75;80>; podkladová barva červená </td></tr> # GRASS:~ > d.rast -i map=tm1 catlist=75-80 bg=red # #zobrazit všechny rastrové buňky v intervalu <60;80> podkladová barva červená (viz obr.) # GRASS:~ > d.rast map=tm1 catlist=60-80 bg=red

Poznámka: V případě práce s mapou obsahující hodnoty s plovoucí desetinnou čárkou použijeme místo parametru vallist.
Hodnotám buněk je pro účel jejich vizualizace přiřazena daná barevná hodnota. Toto pravidlo přiřazení se označuje jako tabulka barev. Směrodatná je přirozeně číselná hodnota buňky, nikoliv barevná hodnota, která je ji na základě nastavené tabulky barev při zobrazení přiřazena. Při změně tohoto pravidla přirozeně nedochází k žádné modifikaci dat, ta jsou jenom odlišně vizuálně interpretována.
Zobrazte např. první kanál družicové scény LandSat-TM5 d.zoom), aby byly zřetelné jednotlivé rastrové buňky. Číselné hodnoty buněk zobrazíme pomocí modulu d.rast.num:
#zobrazit číselné hodnoty buněk (text červeně) # GRASS:~ > d.rast.num map=tm1 text=red
GRASS umožňuje interaktivní dotazování na hodnoty rastrových buněk, jde o modul d.what.rast. Po spuštění modulu se v konzoli objeví nápověda k funkci tlačítek myši.
GRASS:~ > d.what.rast Buttons Left: what's here Right: quit
Klikneme-li na požadovaný pixel rastrové mapy, vypíší se do konzole souřadnice zvoleného bodu a korespondující hodnota buňky.
-806411.7640625(E) -972866.2734375(N) tm1 in PERMANENT (70)
Práci s modulem ukončíme stisknutím pravého tlačítka myši.
univariatní statistika
Na tomto místě si uvedeme ještě jeden statisticky orientovaný modul a to r.univar.
GRASS:~ > r.univar tm1 total null and non-null cells: 1204 total null cells: 0 Of the non-null cells: ---------------------- n: 1204 minimum: 60 maximum: 75 range: 15 mean: 66.1163 standard deviation: 2.28888 variance: 5.23897 variation coefficient: 3.4619 % sum: 79604
Zdůrazněme, že tento modul podobně jako většina modulů pro zpracovaní rastrových/obrazových dat respektuje aktivní region! Výše uvedená statistika se tedy týká pouze části dat zobrazených aktuálně v GRASS monitoru a nikoliv celého družicového snímku. Chceme-li tedy vytvořit
statistiku celého snímku, musíme správně nastavit region.
#vytvořit statistiku pro celý snímek # GRASS:~ > g.region rast=tm1 GRASS:~ > r.univar tm1 total null and non-null cells: 3692403 total null cells: 0 Of the non-null cells: ---------------------- n: 3692403 minimum: 0 maximum: 255 range: 255 mean: 71.1857 standard deviation: 15.094 variance: 227.83 variation coefficient: 21.2037 % sum: 2.62846e+08
Poznámka: Na rozdíl např. od ARC/INFO rozlišuje GRASS hodnotu buňky "0" a "žádná data" (no-data, NULL).
Drobné vysvětlení jednotlivých položek:
n | ... | počet buněk |
minimum | ... | minimální hodnota buňky |
maximum | ... | maximální hodnota buňky |
range | ... | rozsah |
mean | ... | střední hodnota |
standard deviation | ... | směrodatná odchylka |
variance | ... | variance |
variation coefficient | ... | koeficient variace |
sum | ... | suma hodnot |
tabulka barev
Jak již bylo zmíněno výše, tabulka barev představuje předpis, pravidlo na základě něhož je při zobrazení rastrových dat přiřazena rastrové buňce jedinečná barevná hodnota. V případě družicových snímků používáme tzv. odstíny šedi. Změnu tabulky barev provádí modul r.colors, kromě předdefinovaných pravidel (více nápověda modulu) můžeme vytvořit svoji vlastní tabulku. Zajímavou možností může být také zkopírování již existující tabulky barev přiřazené jiné rastrové vrstvě. Několik příkladů (za upozornění stojí, že modul sestaví (např. grey.eq) tabulku barev s ohledem na aktivní region):
#raději přenastavíme aktivní region # GRASS:~ > g.region rast=tm1 # #nastavení předdefinované tabulky barev (červená-žlutá-zelená) # GRASS:~ > r.colors tm1 color=ryg # #vymazat obsah okna # GRASS:~ > d.erase # #zobrazit družicový snímek # GRASS:~ > d.rast tm1 # #definice vlastní tabulky # GRASS:~ > r.colors tm1 color=rules
Pravidla se definují takto (v jednom řádku):
[hodnota buňky] [barva]
jak je vidno z níže uvedeného příkladu, barvu lze definovat pomocí RGB trojice ("0 0 0" - černá) nebo jménem barvy. Každý řádek ukončíme klávesou ENTER, celou tabulku potom klíčovým slovem "end".
Enter rules, "end" when done, "help" if you need it. Data range is 0 to 255 > 0 0 0 0 > 50 red > 60 green > 80 blue > 255 white > end
#překreslit obsah okna # GRASS:~ > d.redraw # #odstíny šedi # GRASS:~ > r.colors tm1 color=grey GRASS:~ > d.redraw # #převzít již existující tabulku barev # GRASS:~ > r.colors tm1 rast=tm2 GRASS:~ > d.redraw # #vyrovnané odstíny šedi # GRASS:~ > r.colors tm1 color=grey.eq GRASS:~ > d.redraw

Na okraj si uvedeme dva pozapomenuté, ale velmi důležité moduly - d.erase, který vyčistí obsah aktuálního grafického okna a d.redraw, který naopak jeho obsah překreslí.