153YZOD Zpracování obrazových dat 2006 - 6. cvičení
Detekce hran, ostřící operátory, prahování
osnona
V tomto kurzu budeme pokračovat v tématu lokálního zvýraznění obrazu. Zaměříme se na filtry určené pro detekci hran a ostřící operátory. Na jednoduchých příkladech bude předvedena metoda práhování.
seznam příkazů
detekce hran
Hranu lze definovat jako diskontinuitu obrazové funkce (tj. signifikatní změnu digitálních hodnot). Hrana je tedy oblast v obraze, kde se výrazně nebo skokově mění hodnota stupňů šedi. Hrany lze rozdělit na tři základní typy:
- střechová hrana (roof edge) - světlější liniový útvar na tmavším pozadí (např. polní cesta, betonová silnice)
- příkopová hrana (ditch edge) - tmavší liniový útvar na světlejším pozadí (např. vodní tok)
- stupňová hrana (step edge) - rozhraní mezi tmavějším a světlejším objektem (např. rozhraní pole-les)
Filtry určené k detekci hran jsou založeny na principu plovoucího okna. Tím se vyhledávají lokální hrany, v další fázi je nutno rozhodnout, zda jde o skutečné hrany či pouhé vnitřní nespojitosti obrazu. Zde se obvykle používá metoda práhování. Nakonec se provádí ztenčení hran a konečná filtrace.
Následuje výběr hranových operátorů a jejich definice pro GRASS.
Tento filtr nejdříve operuje ve směru sever-jih (N-S) a následně ve směru východ-západ (E-W), jeho definice pro r.mfilter je následující (sobel.txt):
TITLE Sobel (3x3) MATRIX 3 -1 0 1 -2 0 2 -1 0 1 DIVISOR 1 TYPE P MATRIX 3 1 2 1 0 0 0 -1 -2 -1 DIVISOR 1 TYPE P
Následují již dobře známe příkazy:
GRASS > g.region rast=tm1 GRASS > r.mfilter input=tm1 output=tm1_sobel filter=sobel.txt GRASS > r.colors map=tm1_sobel color=grey.eq # #nutno otevřít alespoň jeden GRASS monitor # GRASS > d.rast tm1_sobel

Dále můžeme provést práhování obrazu
pokud je DH kladná, ulož do výstupní vrstvy hodnotu "1", v opačném případě "žádná data" (null data)
v zápisu pro r.mapcalc vypadá podmínka if takto:
GRASS > r.mapcalc 'tm1_hrana=if (tm1_sobel > 0, 1, null())' GRASS > d.rast tm1_hrana
Nakonec můžeme provést ztenčení detekovaných hran pomocí modulu r.thin:
#ztenčení hran # GRASS > r.thin input=tm1_hrana output=tm1_hrana1 GRASS > d.rast tm1_hrana1

#barevná syntéza ve skutečných barvách # GRASS > d.rgb red=tm3 green=tm2 blue=tm1 # #zobrazení rastrové vrstvy se ztenčenými hranami (pozor na přepínač -o: transparetní mód) # GRASS > d.rast -o tm1_hrana1

#aplikace Robertsova grafientu # GRASS > r.mapcalc 'tm1_roberts = abs (tm1[0,0]-tm1[1,1]) + abs (tm1[1,0]-tm1[0,1])' GRASS > r.colors tm1_roberts col=grey.eq
Definice pro r.mfilter (prewitt.txt):
TITLE Prewittuv operator (3x3) MATRIX 3 -1 -1 -1 0 0 0 1 1 1 DIVISOR 1 TYPE P MATRIX 3 -1 0 1 -1 0 1 -1 0 1 DIVISOR 1 TYPE P
GRASS > r.mfilter in=tm1 out=tm1_prewitt filter=prewitt.txt GRASS > r.colors map=tm1_prewitt color=grey.eq

práhování
Práhováním se rozumí převod DH do množiny o malém počtu prvků, zpravidla do množiny {0,1} (v tomto případě můžeme mluvit o binarizaci obrazových dat). V jistém ohledu lze práhování považovat za segmentaci či velmi jednoduchý způsob klasifikace obrazu.
Této metody se často používá k vytvoření masky, kde oblasti s hodnotou "0" (nebo "žádná data") jsou maskovány a do dalších analýz vstupují pouze oblasti s hodnotou masky "1" (či zcela obecně s nenulovou hodnotou).
Nalezení práhu se většinou děje "empericky", jeho automatické určení je poměrně obtížné. Rozlišuje dva základní typy:
- jednoduchý práh
p(i,j) = 1: f(i,j) >= q p(i,j) = 0: f(i,j) < q
Příklad - vytvoření masky pevniny:
Čtvrté pásmo LandSat-TM5 (IR) lze použít pro velmi jednoduché určení vodních ploch:
DH < 40 vodní plocha DH >= 40 pevnina
#v případě předešlé změny aktivního regionu, je nutné jej znovu přenastavit... # GRASS > g.region rast=tm4 # #vytvoření masky pevniny (rastrová vrstva 'pevnina') # GRASS > r.mapcalc 'pevnina = if(tm4 >= 40, 1, 0)' # #aktivace masky (vytvoření kopie s unikátním jménem 'MASK') # GRASS > g.copy rast=pevnina,MASK
Vizualizace této velmi jednoduché klasifikace (vodní plochy a pevnina):
#zobrazit RGB syntézu ve skutečných barvách, barva pozadí modrá # GRASS > d.erase blue GRASS > d.rgb -o red=tm3 green=tm2 blue=tm1

Masku deaktivujeme odstraněním rastrové vrstvy 'MASK'.
GRASS > g.remove rast=MASK
- vícenásobný práh
p(i,j) = 0: f(i,j) <= q1 p(i,j) = 1: q1 < f(i,j) <= q2 ... p(i,j) = n: qn1 < f(i,j) < qnn
Příklad: V kurzu [Zpracování obrazových dat - cvičení č.4] byla provedena jednoduchá reklasifikace NDVI podle následujícího reklasifikačního pravidla:
-100 thru 5 = 1 bez vegetace, vodni plochy 5 thru 35 = 2 plochy s minimalni vegetaci 35 thru 87 = 3 plochy pokryte vegetaci
Podobnou reklasifikaci lze provést přímo pomocí r.mapcalc a vícenásobného práhu (navíc se obejdeme bez nutnosti vytvářet celočíselnou mapu pro r.reclass.
#klasifikace NDVI # GRASS > r.mapcalc 'r_ndvi1 = eval( \ a=if(ndvi >= -1.0 && ndvi < 0.05, 1, 0), \ b=if(ndvi >= 0.05 && ndvi < 0.35, 2, 0), \ c=if(ndvi >= 0.35 && ndvi < 0.87, 4, 0),a+b+c)'
ostření obrazu
Ostřící operátory ve své podstatě zvyšují lokální maxima a snižují lokální minima. Přičemž vycházejí z myšlenky první a druhé derivace, kterou lze v diskrétním obraze přibližně provádět pomocí diferencí.
Jako příklad můžeme uvést La Placeův modifikovaný filtr (mlp.txt):
TITLE modifikovany La Placeuv (3x3) MATRIX 3 0 -1 0 -1 4 -1 0 -1 0 DIVISOR 1 TYPE P
#raději nastavit aktivní region... # GRASS > g.region rast=tm1 GRASS > r.mfilter input=tm1 output=tm1_mlp filter=mlp.txt # #nastavit tabulku barev na vyrovnané odstíny šedi # GRASS > r.colors map=tm1_o1 color=grey.eq
Alternativně lze použít operátor definovaný vztahem:
Rovnice pro r.mapcalc:
GRASS > tm1_o2 = tm1[0,0] + tm1[0,0] - \ (tm1[-1,-1]+tm1[-1,0]+tm1[-1,1] + \ tm1[0,-1]+tm1[0,0]+tm1[0,1] + \ tm1[1,-1]+tm1[1,0]+tm1[1,1] * 1)/9 + 2