Cannyho hranový detektor

Cannyho hranový detektor je algoritmus zahrnující několik kroků pro získání co nejlepšího výsledku při detekci hran v dvourozměrném diskrétním obraze.

Požadavky při detekciEditovat

  • Minimální počet chyb (musí být detekovány všechny hrany, nesmí být detekována místa, která hranami nejsou)
  • Přesnost (poloha hrany musí být určena co nejpřesněji)
  • Jednoznačnost (odezva na jednu hranu musí být jedna, nesmí docházet ke zdvojení)

Doporučený postupEditovat

  1. Eliminace šumu (Gaussovým filtrem)
  2. Určení gradientu (první derivace)
  3. Nalezení lokálních maxim (thinning)
  4. Eliminace nevýznamných hran (thresholding)

Jednotlivé krokyEditovat

Eliminace šumu Gaussovým filtremEditovat

Dvourozměrná varianta Gaussova normálního rozdělení je dána vztahem:

 

kde x,y jsou souřadnice pixelu v obraze a sigma je standardní odchylka rozděleni (běžně =1 až 1.4)

Výpočet je vhodné realizovat pomocí konvoluce. Vzorcem je tedy vypočtena pouze konvoluční maska, která se pak aplikuje na celý obraz.

Velikost a směr gradientuEditovat

Tedy standardní detekce hran. Nejvhodnější je využít Sobelův operátor, který není příliš citlivý na šum. Vrací nejen velikost gradientu (hrany) ale i její směr a ten je potřeba pro další kroky.

Ztenčení (Thinning)Editovat

Úkolem této funkce je vybrat z hodnot gradientů (stanovených v předchozím kroku) jen lokální maxima. Respektive odebrat body, které nejsou maximem (nonmaximum suppression). Tím zajistíme, že hrana bude detekována v místě největšího gradientu.

Prakticky to znamená najít pixely, jejichž okolí je ve směru a proti směru gradientu nižší. Máme-li například pixel, jímž prochází svislá hrana, musí být jeho levý a pravý soused nižší hodnoty (rozuměj hodnota jeho gradientu), aby byl „uznán“ jako skutečná hrana. Pokud podmínku nesplňuje,,je označen jako „není hrana“.

 

Které dva okolní pixely zahrnout do porovnávání, je dáno směrem gradientu (určeno v předchozím kroku).

Prahování (Thresholding)Editovat

Funkci můžeme nazývat prahování s hysterezí. V předchozím kroku jsme určili kde přesně leží hrany, ale doposud jsme se nezabývali významem hran. V tuto chvíli jsou označeny i ty nejmenší hrany, protože i ty mají své lokální maximum. Není vhodné určit jeden práh nad kterým budeme gradient považovat za významný, protože hodnota může kolísat například vlivem šumu.

Zvolíme tedy minimální (T1) a maximální (T2) hodnotu (prahy) mezi kterými může gradient kolísat. Pokud hodnota gradientu daného pixelu leží nad větším prahem T2 je přímo označen jako hranový. Pokud posuzujeme bod, jehož hodnota leží mezi T1 a T2 pak je „uznán“ jedině pokud sousedí s bodem který už byl jako hrana označen dříve.

Programátorsky je vhodné použít rekurzivní funkci.