close
Vážení uživatelé,
16. 8. 2020 budou služby Blog.cz a Galerie.cz ukončeny.
Děkujeme vám za společně strávené roky!
Zjistit více

Vážení uživatelé,
16. 8. 2020 budou služby Blog.cz a Galerie.cz ukončeny.
Děkujeme vám za společně strávené roky!

Matematika v robotice 19. Laterální inhibice 2.

8. května 2014 v 5:46 | Petr |  Roboti a Matematika
Minule jsem zase pustil šílenství na špacír a probíral kde všude matička příroda (a programátoři) používají "Unsharp Mask". A nakonec jsme skončili u toho že laterální inhibice - to jest když silně osvětlená buňka sítnice blokuje své sousedky - není z matematického hlediska zase taková sranda.
Nyní tedy jsme ve stavu kdy máme buffer s daty, kde potřebujeme zaostřit (nebo vyhledat) hrany a pak si do druhého bufferu připravíme masku kterou od původních dat odečteme aby nám "hrany vystoupily".


Naivní přístup jak připravit neostrou masku je průměrování sousedních hodnot. Jak vidíte z grafu - tak maska se svými monotónně stoupajícími a klesajícími hranami není nic moc - a asi by se nám v Photoshopu takto zaostřený obrázek nelíbil. Proto se jako zdroj masky používá Gaussovský rozptyl. I my vidláci si můžeme zpracovat gaussovskou masku, pokud počítáme pomocí váženého průměru podle vzorečku

Y (n) = A1 * X(n-3) + A2 * X(n-2) + A3 * X(n-1) + A4 * X(n) + A5 * X(n+1) + A6 * X(n+2) + A7 * X(n+3)

Kde A1-A7 jsou koeficienty tvaru gaussovy křivky jsou to členy tzv. Pascalových trojúhelníků. Konkrétně v našem případě tedy vzoreček bude :

Y (n) = ( X(n-3) + 6 * X(n-2) + 15 * X(n-1) + 20 * X(n) + 15 * X(n+1) + 6 * X(n+2) + X(n+3) ) / 64

Jistě jste pochopili že tuto metodu generování masky nezvládne ani má milovaná nadupaná ATMega8 na 16 MHz. Proto je třeba na věc jít švindlem.


Co je to Gaussova křivka - bratři anglosassové říkají "bell curve" - zvonovitá křivka (ne oblíbená lehká děva A. G. Bella !!). tak si ke zvonovité masce dopomůžeme fintou. Jak vidíte na obrázku nahoře máme krásnou plynulou masku a taky zaostřování hran funguje, že by se ani Photoshop nemusel stydět.


Zbývá jenom otázka jakou nečestnou finotu jsme si pomohli ? Exponenciálním klouzavým průměrem, který má ale tu nevýhodu, že neprodukuje tak pěkně symetrické masky, tak jsem musel udělat nečestnou fintu na druhou - to jest spočítat dva exponenciální průměry - jeden "ve směru času" a druhý "proti směru času" a sečíst je dohromady. Podrobným průzkumem obrázku nahoře zjistíte, že je to skutečně tak.
Matematici sice křičí, že to není pravá Gaussova křivka, ale lepší aproximaci za cenu tak nepatrného výpočetního výkonu se mi prostě nepodařilo objevit - čímž dávám příležitost diskutujícím.

Další věc, na které moje milované AVR už nestačí - je totéž ale ve 2 rozměrech - jak bych postupoval tam - netuším - možná bych dělal dva průměry ve směru řádků a dva ve směru sloupců ? Nebo bych vymyslel něco na principu error diffusion při vykreslování obrázků ? Nevím, ale doufám, že insiprování tímto článečkem vám to nebude činit problémy.Což mě přivádí k myšlence, že výroba gaussovských neostrých masek asi nebude taková sranda, když to výrobci grafických karet kdysi inzerovali jako výhodu CUDA - tedy počítání matematiky na grafické kartě.

Dalších pár počítacích fintiček jsme probrali - zbývá už jenom tradiční rada pro brunety - Chcete dohnat ženskou mrchovitost a mužský stres do krajnosti ? Nechte těhotné kamárádce počůrat těhotenský test a ukažte jej miláčkovi jako svůj vlastní - možná teprve potom pochopíte co je to Richterova škála u zemětřesení.
 

Buď první, kdo ohodnotí tento článek.

Komentáře

1 Petr G. Petr G. | 9. května 2014 v 16:11 | Reagovat

Zajímavé, vyzkouším.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.
 

Aktuální články

Reklama