100 likes | 282 Views
Vektorizace Bitmapy. 2005 / 2006, ZS, MFF-UK Cyril Höschl , MFF, 3.ro č. web: www.hoschl.cz/cyril email : cyril@hoschl.cz. www.hoschl.cz/cyril/vektorizace. Pozn.: prezentace je animovaná, doporučuji spouštět v PowerPointu 2002 a více. Vektorizace Bitmapy.
E N D
Vektorizace Bitmapy 2005 / 2006, ZS, MFF-UK Cyril Höschl, MFF, 3.roč. web: www.hoschl.cz/cyril email:cyril@hoschl.cz www.hoschl.cz/cyril/vektorizace Pozn.: prezentace je animovaná, doporučuji spouštět v PowerPointu 2002 a více
Vektorizace Bitmapy Doprovodný materiál k prezentaci metory pro vektorizaci bitmapy na semináři z Počítačové Grafiky, MFF-UK. Cílem je poskytnout ukázku, jak pracuje algoritmus pro převod bitmapy na vektorový obrázek (samozřejmě za cenu deformace obrázku). Existuje více způsobů, jak toho docílit, v následující prezentaci jsou zmíněny dva. První používá k proložení bodů Bezierovy křivky kvůli kompatibilitě s formátem EMF, obecně vhodnější matematický aparát pro tvorbu prokládaných hladkých křivek jsou však např. Catmull-Rom, viz. http://cgg.ms.mff.cuni.cz/~pepca/lectures/pdf/hwmath.pdf. Druhý způsob je založen na lineární interpolaci za pomoci triangulace. Prohlášení: Použitý algoritmus jsem vytvořil bez inspirace jinými algoritmy, proto nemusí být zaručeno, že je nejefektivnější – leč funguje celkem rychle. Zájemci si mohou stáhnout plug-in do PowerPointu, který v reálném čase dokáže interpolovat plochu a převést ji na vektory. Odkaz zde: www.hoschl.cz/cyril/vektorizace/plugin.zip.
z [x2,y2,z2] [x3,y3,??] x [x1,y1,z1] y Obrázek 1.1: Červené body jsou zadané, výšku modrého bodu se snažím dopočítat 3D interpolace Popis problému Mám n bodů v rovině, které nejsou rovnoměrně rozprostřeny. Každý bod má nějakou výšku z. Potřebuji dopočítat („domyslet“) výšky ostatních bodů v rovině. Popis řešení(pomocí IDW – Inverse distance weights) Vytvořím pravidelnou síť bodů majících souřadnice x a y. Výšky (z-souřadnice) znám však jen od některých. Pro ostatní je dopočítám níže uvedenou rovnicí: zj…Výška (z-souřadnice) j-tého (neznámého) bodu zi…Výška (z-souřadnice) i-tého (známého) bodu n…počet známých bodů xi…x-souřadnice i-tého bodu yi…y-souřadnice i-tého bodu p…exponent … lze použít např. p=3; pN Poznámka Jedná se o vážený průměr výšek ze zadaných bodů. S určitou mocninou vzdálenosti se zanedbává výška známého bodu.
4 4 4 5 5 5 3 3 3 6 6 2 2 6 2 7 7 7 1 1 1 0 0 0 Princip Tracování I. Okrajový Bod (PB) = TRUE, je-li zelený (ci=TRUE) a jeho buď levý nebo pravý nebo horní nebo dolní soused je bílý (ci=FALSE) Tečkovaný zelený bod … bod na okraji • Krok…najít bod P pro který BP(P)=TRUE; Pfirst:=P • Krok…zkontrolovat bod ležící v Di-témsměru od aktuálního bodu. Pokud pro bod Q:=P+Di je PB(Q)=TRUE, pak P:=Q • Goto Krok 1 dokud P=Pfirst Směry Di NOTE 1: Ne každý bod je nutné si zapamatovat, můžeme ukládat třeba každý 20tý bod (a jimi pak proložit hladkou křivku) NOTE 2: V dalším kroku hledámě body jen v polorovině dané z předchozího směru Vybrali jsme D3 Vybíráme jen ze směrů ležících v polorovině určené posledním směrem D3 Další krok
Hladká křivka Protože jádro Win32 API a formát EMF (Enhanced Meta File) má podporu Beziérových křivek, je užitečné vytvořit hladkou křivku pomocí bez. křivek. Docílí se toho nastavením vzdálenosti řídicích bodů od bodu P na 1/6 délky vektoru (Pi-1, Pi+1). Viz. obrázek: P4 x P2 x d/6 x P3 P1 x d
Hledání vrstevnic: • Myšlenka: • Představíme si barvy obrázku jako výšku. Pro jednoduchost např. šedé obrázky, kde je stupeň šedi převeden na výšku. • Zvolíme počet vrstev, na který chceme obrázek nařezat a postupujeme od spodní (nejnižší): • V nějakém bodě tracujeme okraj bitmapy ve výšce požadované vrstvy. • Ak:= Útvar vzniklý tracováním • Platí: • (Max(Vi) – Min(Vi)) / #vrstev = ΔZ • Vi…výšky všech bodů obrázku • ΔZ…z-ová (výšková) vzdálenost mezi vrstvami • Procházíme další body bitmapy po nějak jemně zvolené mřížce a pokud je výška bodu vyšší, než hladina právě tracované vrstevnice a bod neleží v Ai, i=0..k, provedeme krok 2 a k:=k+1. • Musíme prozkoumat vnitřky oblastí dané tracováním z kroku 2, tj. body uvnitř Ai, i=0..k. • Pokud nalezneme uvnitř Aibod, který má nižší výšku, než výška právě tracované vrstevnice, provedeme opět tracování jako v kroku 2 (nechť tracovaný útvar je B) a nalezený útvar „vykrojíme“ zAi, tj. Ai := Ai \ B • Po projití mřížky do konce pokračujeme další vrstvou, znova od kroku 1.
4 5 3 6 2 7 1 0 Princip Tracování II. Zavede-li nás tracování do slepé uličky, je třeba se vrátit
x x x x x x x x x x x x x x x x x Hledání vrstevnic x • hledání oblastí se stejně vysokým okrajem • - z nalezených oblastí vyříznutí „louží“, tj. míst s okrajem o výšce menší, nežvýška nějaké nižší vrstevnice 60 50 40 30 20 10 Vrstevnice v rastru
? ? ? ? Jednodušší způsob: Lineární hledání vrstevnic Myšlenka: • Vytvoříme triangulaci půdorysů bodů v prostoru • Např. pomocí Delauney triangulace (duální graf k Voronoi diagramu) • Na každé straně vzniklých trojúhelnících nalezneme bod o stejné z-výšce, které propojíme • triangulace např. viz. www.hoschl.cz/cyril/triangulation
Odkazy • Web prezentace: • www.hoschl.cz/cyril/vektorizace • Plugin do PowerPointu: • www.hoschl.cz/cyril/vektorizace/plugin.zip • Matematický aparát ke křivkám: • http://cgg.ms.mff.cuni.cz/~pepca/lectures/pdf/hwmath.pdf • http://www.mvps.org/directx/articles/catmull/ • Jiná metoda vektorizace: • - Albrecht Preusser, Algorithm 684: C1- and C2-interplation on triangles with quintic and nonic bivariate polynomials, ACM Transactions on Mathematical Software (TOMS), v.16 n.3, p.253-257, Sept. 1990 • http://dev.acm.org/pubs/articles/journals/toms/1989-15-1/p79-preusser/p79-preusser.pdf (nutné být zaregistrován)