153YZOD Zpracování obrazových dat 2006 - 6. cvičení: Porovnání verzí

Z GeoWikiCZ
Skočit na navigaci Skočit na vyhledávání
m (upozorneni)
 
(Není zobrazeno 37 mezilehlých verzí od 2 dalších uživatelů.)
Řádek 1: Řádek 1:
 +
<div class="boilerplate metadata" id="attention" style="border: 3px double #c32c2c; margin-bottom: 2em; padding: 0 .25em; background-color: #f96666;">
 +
<p style="font-size: 150%; text-align: center;"><br/>'''Tento text se vztahuje k akademickému roku 2006/2007. Aktuální stránky cvičení jsou dostupné [[153YZOD Zpracování obrazových dat - cvičení 6|zde]].'''<br/>&nbsp;</p>
 +
<div style="clear: both;"><br style="clear: both; display: none;" /></div>
 +
</div>
 +
{{ZOD}}
 +
[ [[Zpracování obrazových dat]] ]
 +
 
= Detekce hran, ostřící operátory, prahování =
 
= Detekce hran, ostřící operátory, prahování =
 
+
__TOC__
< [[Zpracování obrazových dat]]
 
 
 
 
== osnona ==
 
== osnona ==
  
V&nbsp;tomto kurzu budeme pokračovat v&nbsp;tématu ''lokálního'' zvýraznění obrazu. Zaměříme se na filtry určené pro ''[http://en.wikipedia.org/wiki/Edge_detection detekci hran]'' a ''ostřící operátory''. Na&nbsp;jednoduchých příkladech bude předvedena metoda ''práhování''.
+
V&nbsp;tomto kurzu budeme pokračovat v&nbsp;tématu ''lokálního'' zvýraznění obrazu. Zaměříme se na filtry určené pro ''[http://en.wikipedia.org/wiki/Edge_detection detekci hran]'' a ''ostřící operátory''. Na&nbsp;jednoduchých příkladech bude předvedena metoda ''práhování'' obrazu.
  
 
== seznam příkazů ==
 
== seznam příkazů ==
Řádek 17: Řádek 22:
 
* [http://grass.itc.it/grass60/manuals/html60_user/d.erase.html d.erase]
 
* [http://grass.itc.it/grass60/manuals/html60_user/d.erase.html d.erase]
 
* [http://grass.itc.it/grass60/manuals/html60_user/g.copy.html g.copy]
 
* [http://grass.itc.it/grass60/manuals/html60_user/g.copy.html g.copy]
 +
* [http://grass.itc.it/grass60/manuals/html60_user/g.remove.html g.remove]
  
 
== detekce hran ==
 
== detekce hran ==
Řádek 22: Řádek 28:
 
Hranu lze definovat jako ''diskontinuitu'' obrazové funkce (tj.&nbsp;signifikatní změnu digitálních hodnot). Hrana je tedy oblast v&nbsp;obraze, kde se výrazně nebo skokově mění hodnota stupňů šedi. Hrany lze rozdělit na tři základní typy:
 
Hranu lze definovat jako ''diskontinuitu'' obrazové funkce (tj.&nbsp;signifikatní změnu digitálních hodnot). Hrana je tedy oblast v&nbsp;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ř.&nbsp;polní cesta, betonová silnice)
+
* ''střechová hrana'' (roof edge) - světlejší liniový útvar na tmavším pozadí (např.&nbsp;polní cesta, betonová silnice)
 
* ''příkopová hrana'' (ditch edge) - tmavší liniový útvar na světlejším pozadí (např.&nbsp;vodní tok)
 
* ''příkopová hrana'' (ditch edge) - tmavší liniový útvar na světlejším pozadí (např.&nbsp;vodní tok)
 
* ''stupňová hrana'' (step edge) - rozhraní mezi tmavějším a&nbsp;světlejším objektem (např.&nbsp;rozhraní pole-les)
 
* ''stupňová hrana'' (step edge) - rozhraní mezi tmavějším a&nbsp;světlejším objektem (např.&nbsp;rozhraní pole-les)
  
Filtry určené k&nbsp;detekci hran jsou založeny na principu ''plovoucího okna''. Tím se vyhledávají lokální hrany, v&nbsp;další fázi je nutno rozhodnout, zda jde o&nbsp;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&nbsp;konečná filtrace.
+
Filtry (vysokofrekvenční) určené k&nbsp;detekci hran jsou založeny na principu ''plovoucího okna''. Tím se vyhledávají lokální hrany, v&nbsp;další fázi je nutno rozhodnout, zda jde o&nbsp;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&nbsp;konečná filtrace.
  
 
Následuje výběr hranových operátorů a&nbsp;jejich definice pro GRASS.
 
Následuje výběr hranových operátorů a&nbsp;jejich definice pro GRASS.
Řádek 32: Řádek 38:
 
'''[http://en.wikipedia.org/wiki/Sobel Sobelův filtr]'''
 
'''[http://en.wikipedia.org/wiki/Sobel Sobelův filtr]'''
  
Tento filtr nejdříve operuje ve směru sever-jih (N-S) a&nbsp;následně ve směru východ-západ (E-W), jeho definice pro <tt>r.mfilter</tt> je následující ([http://grass.fsv.cvut.cz/~martin/cv6/sobel.txt sobel.txt]):
+
Tento filtr nejdříve operuje ve směru sever-jih (N-S) a&nbsp;následně ve směru východ-západ (E-W), jeho definice pro <tt>r.mfilter</tt> je následující ([http://gama.fsv.cvut.cz/~landa/geowikicz_data/zod/cv6/sobel.txt sobel.txt]):
  
 
  TITLE Sobel (3x3)
 
  TITLE Sobel (3x3)
Řádek 49: Řádek 55:
 
  TYPE P
 
  TYPE P
  
Následují již dobře známe příkazy:
+
Následují již dobře známé příkazy:
  
  GRASS&nbsp;>&nbsp;g.region rast=tm1
+
  GRASS~&nbsp;>&nbsp;g.region rast=tm1
  GRASS&nbsp;>&nbsp;r.mfilter input=tm1 output=tm1_sobel filter=sobel.txt
+
  GRASS~&nbsp;>&nbsp;r.mfilter input=tm1 output=tm1_sobel filter=sobel.txt
  GRASS&nbsp;>&nbsp;r.colors map=tm1_sobel color=grey.eq
+
  GRASS~&nbsp;>&nbsp;r.colors map=tm1_sobel color=grey.eq
 
  #
 
  #
 
  #nutno otevřít alespoň jeden GRASS monitor
 
  #nutno otevřít alespoň jeden GRASS monitor
 
  #
 
  #
  GRASS&nbsp;>&nbsp;d.rast tm1_sobel
+
  GRASS~&nbsp;>&nbsp;d.rast tm1_sobel
  
 
[[Soubor:ZOD-cv6-tm1_tm1_sobel.png|frame|center|Obr. č.1: Vybraný detail prvního pásma LandSat-TM5, vlevo originální data, vpravo po aplikaci Sobelova filtru]]
 
[[Soubor:ZOD-cv6-tm1_tm1_sobel.png|frame|center|Obr. č.1: Vybraný detail prvního pásma LandSat-TM5, vlevo originální data, vpravo po aplikaci Sobelova filtru]]
  
Dále můžeme provést [[Zpracování obrazových dat - cvičení č.6#Práhování|práhování]] obrazu
+
Dále můžeme provést [[Zpracování obrazových dat - cvičení č.6#práhování|práhování]] obrazu
  
 
  pokud je DH kladná, ulož do výstupní vrstvy hodnotu "1",
 
  pokud je DH kladná, ulož do výstupní vrstvy hodnotu "1",
Řádek 68: Řádek 74:
 
v&nbsp;zápisu pro <tt>r.mapcalc</tt> vypadá podmínka '''if''' takto:
 
v&nbsp;zápisu pro <tt>r.mapcalc</tt> vypadá podmínka '''if''' takto:
  
  GRASS&nbsp;>&nbsp;r.mapcalc 'tm1_hrana=if (tm1_sobel > 0, 1, null())'
+
  GRASS~&nbsp;>&nbsp;r.mapcalc 'tm1_hrana=if (tm1_sobel > 0, 1, null())'
  GRASS&nbsp;>&nbsp;d.rast tm1_hrana
+
  GRASS~&nbsp;>&nbsp;d.rast tm1_hrana
  
 
Nakonec můžeme provést ztenčení detekovaných hran pomocí modulu <tt>r.thin</tt>:
 
Nakonec můžeme provést ztenčení detekovaných hran pomocí modulu <tt>r.thin</tt>:
Řádek 75: Řádek 81:
 
  #ztenčení hran
 
  #ztenčení hran
 
  #
 
  #
  GRASS&nbsp;>&nbsp;r.thin input=tm1_hrana output=tm1_hrana1
+
  GRASS~&nbsp;>&nbsp;r.thin input=tm1_hrana output=tm1_hrana1
  GRASS&nbsp;>&nbsp;d.rast tm1_hrana1
+
  GRASS~&nbsp;>&nbsp;d.rast tm1_hrana1
  
 
[[Soubor:ZOD-cv6-tm1_tm1_hrany.png|frame|center|Obr. č.2: Detekované hrany po binarizaci (vlevo) a&nbsp;jejich ztenčení (vpravo)]]
 
[[Soubor:ZOD-cv6-tm1_tm1_hrany.png|frame|center|Obr. č.2: Detekované hrany po binarizaci (vlevo) a&nbsp;jejich ztenčení (vpravo)]]
Řádek 82: Řádek 88:
 
  #barevná syntéza ve skutečných barvách
 
  #barevná syntéza ve skutečných barvách
 
  #
 
  #
  GRASS&nbsp;>&nbsp;d.rgb red=tm3 green=tm2 blue=tm1
+
  GRASS~&nbsp;>&nbsp;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)
 
  #zobrazení rastrové vrstvy se ztenčenými hranami (pozor na přepínač -o: transparetní mód)
 
  #
 
  #
  GRASS&nbsp;>&nbsp;d.rast -o tm1_hrana1
+
  GRASS~&nbsp;>&nbsp;d.rast -o tm1_hrana1
  
 
[[Soubor:ZOD-cv6-rgb_hrany.png|frame|center|Obr. č.3: Prezentace výsledků Sobelova filtru, na pozadí barevná syntéza ve&nbsp;skutečných barvách]]
 
[[Soubor:ZOD-cv6-rgb_hrany.png|frame|center|Obr. č.3: Prezentace výsledků Sobelova filtru, na pozadí barevná syntéza ve&nbsp;skutečných barvách]]
Řádek 92: Řádek 98:
 
'''[http://en.wikipedia.org/wiki/Roberts_Cross Robertsův gradient]'''
 
'''[http://en.wikipedia.org/wiki/Roberts_Cross Robertsův gradient]'''
  
<math>F(i,j) = |f(i,j) - f(i+1,j+1)| + |f(i+1,j) - f(i,j+1)|</math>
+
Tento operátor je definován vztahem
 +
 
 +
<math>p(i,j) = |f(i,j) - f(i+1,j+1)| + |f(i+1,j) - f(i,j+1)|\,</math>
 +
 
 +
v&nbsp;zápisu pro <tt>r.mapcalc</tt> vypadá takto:
  
 
  #aplikace Robertsova grafientu
 
  #aplikace Robertsova grafientu
 
  #
 
  #
  GRASS&nbsp;>&nbsp;r.mapcalc 'tm1_roberts = abs (tm1[0,0]-tm1[1,1]) + abs (tm1[1,0]-tm1[0,1])'
+
  GRASS~&nbsp;>&nbsp;r.mapcalc 'tm1_roberts = abs (tm1[0,0]-tm1[1,1]) + abs (tm1[1,0]-tm1[0,1])'
  GRASS&nbsp;>&nbsp;r.colors tm1_roberts col=grey.eq
+
  GRASS~&nbsp;>&nbsp;r.colors tm1_roberts col=grey.eq
  
 
'''[http://en.wikipedia.org/wiki/Prewitt Prewittův operátor]'''
 
'''[http://en.wikipedia.org/wiki/Prewitt Prewittův operátor]'''
  
Definice pro <tt>r.mfilter</tt> ([http://grass.fsv.cvut.cz/~martin/vyuka/zod/cv6/prewitt.txt prewitt.txt]):
+
Definice pro <tt>r.mfilter</tt> ([http://gama.fsv.cvut.cz/~landa/geowikicz_data/zod/cv6/prewitt.txt prewitt.txt]):
  
 
  TITLE Prewittuv operator (3x3)
 
  TITLE Prewittuv operator (3x3)
Řádek 118: Řádek 128:
 
  TYPE P
 
  TYPE P
  
  GRASS&nbsp;>&nbsp;r.mfilter in=tm1 out=tm1_prewitt filter=prewitt.txt
+
  GRASS~&nbsp;>&nbsp;r.mfilter in=tm1 out=tm1_prewitt filter=prewitt.txt
  GRASS&nbsp;>&nbsp;r.colors map=tm1_prewitt color=grey.eq
+
  GRASS~&nbsp;>&nbsp;r.colors map=tm1_prewitt color=grey.eq
  
[[Soubor:ZOD-cv6-tm1_roberts_prewitt.png|frame|center|Obr č.5: První kanál LandSat-TM5, Robertsův a Prewittův operátor]]
+
[[Soubor:ZOD-cv6-tm1_roberts_prewitt.png|frame|center|Obr č.4: První kanál LandSat-TM5, Robertsův a Prewittův operátor]]
  
 
== práhování ==
 
== práhování ==
Řádek 129: Řádek 139:
 
Této metody se často používá k&nbsp;vytvoření ''masky'', kde oblasti s&nbsp;hodnotou "0" (nebo "žádná data") jsou maskovány a&nbsp;do&nbsp;dalších analýz vstupují pouze oblasti s&nbsp;hodnotou masky "1" (či zcela obecně s&nbsp;nenulovou hodnotou).
 
Této metody se často používá k&nbsp;vytvoření ''masky'', kde oblasti s&nbsp;hodnotou "0" (nebo "žádná data") jsou maskovány a&nbsp;do&nbsp;dalších analýz vstupují pouze oblasti s&nbsp;hodnotou masky "1" (či zcela obecně s&nbsp;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:
+
Nalezení ''práhu'' se většinou děje "empericky", jeho automatické určení je poměrně obtížné. Rozlišujeme dva základní typy:
  
 
* ''jednoduchý práh''
 
* ''jednoduchý práh''
Řádek 145: Řádek 155:
 
  #v případě předešlé změny aktivního regionu, je nutné jej znovu přenastavit...
 
  #v případě předešlé změny aktivního regionu, je nutné jej znovu přenastavit...
 
  #
 
  #
  GRASS&nbsp;>&nbsp;g.region rast=tm4
+
  GRASS~&nbsp;>&nbsp;g.region rast=tm4
 
  #
 
  #
 
  #vytvoření masky pevniny (rastrová vrstva 'pevnina')
 
  #vytvoření masky pevniny (rastrová vrstva 'pevnina')
 
  #
 
  #
  GRASS&nbsp;>&nbsp;r.mapcalc 'pevnina = if(tm4 >= 40, 1, 0)'
+
  GRASS~&nbsp;>&nbsp;r.mapcalc 'pevnina = if(tm4 >= 40, 1, 0)'
 
  #
 
  #
 
  #aktivace masky (vytvoření kopie s unikátním jménem 'MASK')
 
  #aktivace masky (vytvoření kopie s unikátním jménem 'MASK')
 
  #
 
  #
  GRASS&nbsp;>&nbsp;g.copy rast=pevnina,MASK
+
  GRASS~&nbsp;>&nbsp;g.copy rast=pevnina,MASK
  
 
Vizualizace této velmi jednoduché klasifikace (vodní plochy a&nbsp;pevnina):
 
Vizualizace této velmi jednoduché klasifikace (vodní plochy a&nbsp;pevnina):
Řádek 159: Řádek 169:
 
  #zobrazit RGB syntézu ve skutečných barvách, barva pozadí modrá
 
  #zobrazit RGB syntézu ve skutečných barvách, barva pozadí modrá
 
  #
 
  #
  GRASS&nbsp;>&nbsp;d.erase blue
+
  GRASS~&nbsp;>&nbsp;d.erase blue
  GRASS&nbsp;>&nbsp;d.rgb -o red=tm3 green=tm2 blue=tm1
+
  GRASS~&nbsp;>&nbsp;d.rgb -o red=tm3 green=tm2 blue=tm1
 +
#
 +
#zobrazit vektorovou vrstvu s hranicemi vodních ploch (kromě Nechranické nádrže)
 +
#barva hranic červená
 +
#
 +
GRASS~&nbsp;>&nbsp;d.vect map=voda type=boundary color=red
  
[[Soubor:ZOD-cv6-rgb_voda.png|frame|center|Obr č.x: Maskování vodních ploch určených práhováním tm4, barevná syntéza ve&nbsp;skutečných barvách]]
+
[[Soubor:ZOD-cv6-rgb_voda.png|frame|center|Obr č.5: Maskování vodních ploch určených práhováním tm4, barevná syntéza ve&nbsp;skutečných barvách a&nbsp;vektorová vrstva vodních ploch]]
  
Masku deaktivujeme odstraněním rastrové vrstvy 'MASK'.  
+
Masku deaktivujeme odstraněním rastrové vrstvy <u>MASK</u>.  
 
   
 
   
  GRASS&nbsp;>&nbsp;g.remove rast=MASK
+
  GRASS~&nbsp;>&nbsp;g.remove rast=MASK
  
 
* ''vícenásobný práh''
 
* ''vícenásobný práh''
Řádek 175: Řádek 190:
 
  p(i,j) = n: qn1 < f(i,j) < qnn
 
  p(i,j) = n: qn1 < f(i,j) < qnn
  
Příklad: V&nbsp;kurzu [Zpracování obrazových dat - cvičení č.4] byla provedena jednoduchá reklasifikace NDVI podle následujícího reklasifikačního pravidla:
+
Příklad: V&nbsp;kurzu [[Zpracování obrazových dat - cvičení č.4#reklasifikace rastrových dat|Mapová algebra, sčítání, odčítání rastrových dat, podíl obrazu, NDVI]] byla provedena jednoduchá reklasifikace NDVI podle následujícího reklasifikačního pravidla:
  
 
  -100 thru 5  = 1 bez vegetace, vodni plochy
 
  -100 thru 5  = 1 bez vegetace, vodni plochy
Řádek 181: Řádek 196:
 
   35  thru 87  = 3 plochy pokryte vegetaci
 
   35  thru 87  = 3 plochy pokryte vegetaci
  
Podobnou reklasifikaci lze provést přímo pomocí <tt>r.mapcalc</tt> a&nbsp;vícenásobného práhu (navíc se obejdeme bez nutnosti vytvářet celočíselnou mapu pro <tt>r.reclass</tt>.
+
Podobnou reklasifikaci lze provést přímo pomocí <tt>r.mapcalc</tt> a&nbsp;vícenásobného práhu (navíc se obejdeme bez nutnosti vytvářet celočíselnou mapu pro <tt>r.reclass</tt>).
  
 
  #klasifikace NDVI
 
  #klasifikace NDVI
 
  #
 
  #
  GRASS&nbsp;>&nbsp;r.mapcalc 'r_ndvi1 = eval( \
+
  GRASS~&nbsp;>&nbsp;r.mapcalc 'r_ndvi1 = eval( \
 
  a=if(ndvi >= -1.0 && ndvi < 0.05, 1, 0), \
 
  a=if(ndvi >= -1.0 && ndvi < 0.05, 1, 0), \
 
  b=if(ndvi >= 0.05 && ndvi < 0.35, 2, 0), \
 
  b=if(ndvi >= 0.05 && ndvi < 0.35, 2, 0), \
 
  c=if(ndvi >= 0.35 && ndvi < 0.87, 4, 0),a+b+c)'
 
  c=if(ndvi >= 0.35 && ndvi < 0.87, 4, 0),a+b+c)'
 +
 +
''Poznámka: Během výpočtu se přechodně vytvoří tři rastrové vrstvy <u>a</u>, <u>b</u> a&nbsp;<u>c</u>, výsledná vrstva vznikne součtem těchto tří vrstev.''
  
 
== ostření obrazu ==
 
== ostření obrazu ==
Řádek 194: Řádek 211:
 
Ostřící operátory ve&nbsp;své podstatě zvyšují lokální maxima a&nbsp;snižují lokální minima. Přičemž vycházejí z&nbsp;myšlenky první a&nbsp;druhé derivace, kterou lze v&nbsp;diskrétním obraze přibližně provádět pomocí diferencí.
 
Ostřící operátory ve&nbsp;své podstatě zvyšují lokální maxima a&nbsp;snižují lokální minima. Přičemž vycházejí z&nbsp;myšlenky první a&nbsp;druhé derivace, kterou lze v&nbsp;diskrétním obraze přibližně provádět pomocí diferencí.
  
Jako příklad můžeme uvést La&nbsp;Placeův modifikovaný filtr ([http://grass.fsv.cvut.cz/~martin/vyuka/zod/cv6/mlp.txt mlp.txt]):
+
Jako příklad můžeme uvést La&nbsp;Placeův modifikovaný filtr ([http://gama.fsv.cvut.cz/~landa/geowikicz_data/zod/cv6/mlp.txt mlp.txt]):
  
 
  TITLE modifikovany La Placeuv (3x3)
 
  TITLE modifikovany La Placeuv (3x3)
Řádek 206: Řádek 223:
 
  #raději nastavit aktivní region...
 
  #raději nastavit aktivní region...
 
  #
 
  #
  GRASS&nbsp;>&nbsp;g.region rast=tm1
+
  GRASS~&nbsp;>&nbsp;g.region rast=tm1
  GRASS&nbsp;>&nbsp;r.mfilter input=tm1 output=tm1_mlp filter=mlp.txt  
+
  GRASS~&nbsp;>&nbsp;r.mfilter input=tm1 output=tm1_mlp filter=mlp.txt  
 
  #
 
  #
 
  #nastavit tabulku barev na vyrovnané odstíny šedi
 
  #nastavit tabulku barev na vyrovnané odstíny šedi
 
  #
 
  #
  GRASS&nbsp;>&nbsp;r.colors map=tm1_o1 color=grey.eq
+
  GRASS~&nbsp;>&nbsp;r.colors map=tm1_mlp color=grey.eq
  
[[Soubor:ZOD-cv6-tm1_tm1_o1.png|frame|center|Obr č.x: První pásmo LandSat-TM5 - původní data a&nbsp;po aplikaci modifikovaného La&nbsp;Placeova filtru]]
+
[[Soubor:ZOD-cv6-tm1_tm1_mlp.png|frame|center|Obr č.6: První pásmo LandSat-TM5 - původní data, po aplikaci modifikovaného La&nbsp;Placeova filtru]]
  
 
Alternativně lze použít operátor definovaný vztahem:
 
Alternativně lze použít operátor definovaný vztahem:
  
<math>p(i,j) = f(i,j) + f(i,j) - \frac{1}{9} \big(\sum_{k=-1}^1\sum_{l=-1}^1 f(i+k, j+l)\big) + k_2</math>
+
<math>p(i,j) = f(i,j) + f(i,j) - \frac{1}{9} \bigg(\sum_{k=-1}^1\sum_{l=-1}^1 f(i+k, j+l)\,.\, k_1\bigg) + k_2</math>
  
Rovnice pro <tt>r.mapcalc</tt>:
+
Rovnice pro <tt>r.mapcalc</tt> (''k<sub>1</sub>'' = 1; ''k<sub>2</sub>'' = 2):
  
  GRASS&nbsp;>&nbsp;tm1_o2 = tm1[0,0] + tm1[0,0] - \
+
  GRASS~&nbsp;>&nbsp;r.mapcalc 'tm1_o2 = tm1[0,0] + tm1[0,0] - \
 
  (tm1[-1,-1]+tm1[-1,0]+tm1[-1,1] + \
 
  (tm1[-1,-1]+tm1[-1,0]+tm1[-1,1] + \
 
  tm1[0,-1]+tm1[0,0]+tm1[0,1] + \
 
  tm1[0,-1]+tm1[0,0]+tm1[0,1] + \
  tm1[1,-1]+tm1[1,0]+tm1[1,1] * 1)/9 + 2
+
  tm1[1,-1]+tm1[1,0]+tm1[1,1] * 1)/9 + 2'
 +
#
 +
#nastavit tabulku barev
 +
#
 +
GRASS~&nbsp;>&nbsp;r.colors map=tm1_o2 color=grey.eq
 +
 
 +
[[Soubor:ZOD-cv6-tm1_tm1_o2.png|frame|center|Obr č.7: První pásmo LandSat-TM5 - původní data, po aplikaci ostřícího operátoru]]
 +
 
  
[[Soubor:ZOD-cv6-tm1_tm1_oě.png|frame|center|Obr č.x: První pásmo LandSat-TM5 - původní data a po aplikaci ostřícího operátoru "o2"]]
+
[ [[Zpracování obrazových dat]] ]

Aktuální verze z 19. 11. 2008, 20:55

[ Zpracování obrazových dat ]

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í obrazu.

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ětlejší 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 (vysokofrekvenční) 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.

Sobelův filtr

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ámé 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
Obr. č.1: Vybraný detail prvního pásma LandSat-TM5, vlevo originální data, vpravo po aplikaci Sobelova filtru

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
Obr. č.2: Detekované hrany po binarizaci (vlevo) a jejich ztenčení (vpravo)
#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
Obr. č.3: Prezentace výsledků Sobelova filtru, na pozadí barevná syntéza ve skutečných barvách

Robertsův gradient

Tento operátor je definován vztahem

v zápisu pro r.mapcalc vypadá takto:

#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

Prewittův operátor

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
Obr č.4: První kanál LandSat-TM5, Robertsův a Prewittův operátor

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šujeme 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
#
#zobrazit vektorovou vrstvu s hranicemi vodních ploch (kromě Nechranické nádrže)
#barva hranic červená
#
GRASS~ > d.vect map=voda type=boundary color=red
Obr č.5: Maskování vodních ploch určených práhováním tm4, barevná syntéza ve skutečných barvách a vektorová vrstva vodních ploch

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 Mapová algebra, sčítání, odčítání rastrových dat, podíl obrazu, NDVI 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)'

Poznámka: Během výpočtu se přechodně vytvoří tři rastrové vrstvy a, bc, výsledná vrstva vznikne součtem těchto tří vrstev.

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_mlp color=grey.eq
Obr č.6: První pásmo LandSat-TM5 - původní data, po aplikaci modifikovaného La Placeova filtru

Alternativně lze použít operátor definovaný vztahem:

Rovnice pro r.mapcalc (k1 = 1; k2 = 2):

GRASS~ > r.mapcalc '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'
#
#nastavit tabulku barev
#
GRASS~ > r.colors map=tm1_o2 color=grey.eq
Obr č.7: První pásmo LandSat-TM5 - původní data, po aplikaci ostřícího operátoru


[ Zpracování obrazových dat ]