Úloha 076: Demonstrační program na 0D feature warping/morphing

Úkolem je implementovat kompletní ukázkový program pro deformaci rastrového obrázku včetně interaktivního vstupu. Uživatel bude deformaci zadávat interaktivně pomocí posunování významných bodů obrázku ("0D features"). Musí být implementovány všechny funkce důležité pro pohodlné uživatelské experimenty s algoritmem: ukládání a nahrávání deformačních dat, vstupních i výledných rastrových obrázků, nastavování parametrů, interaktivní editace deformace a případně i generování přechodové animace (morphing).

Matematický model

Warping je technika transformující rastrový obrázek pomocí (obecně nelineární) změny souřadného systému obrazu. Zobrazení f: R2 -> R2 mapuje souřadný systém zdrojového obrázku (originálu) do souřadného systému cíle (výsledku). Podle zobrazení f se přednáší barva ze zdroje do cíle (pokud je f identita, zdrojový a cílový obrázek jsou totožné, pokud je např. f( [ x, y ] ) = [ 2x, y ], obrázek se protáhne dvojnásobně ve vodorovném směru, atp.).

Obecný warping

Nejpraktičtější algoritmus potřebuje ke své práci inverzní zobrazení f-1. Prochází jednotlivé pixely výstupního obrázku a pomocí tohoto inverzního zobrazení zjišťuje, odkud ze zdrojového obrázku má přenést barvu do cílového pixelu. Každý cílový pixel je nějak vybarven, přinejhorším barvou za hranicí obrázku (černá - [0,0,0]).

Posunování bodů obrazu

Warping je definován posunutím jednoho konkrétního bodu zdrojového obrazu - bod [x0,y0] se posune v cíli na souřadnice [x1,y1]. I okolní pixely se budou podobným směrem přesunovat, síla "posunovacího" vektoru T = [x0,y0]->[x1,y1] však bude se vzdáleností klesat. V nějaké předem definované vzdálenosti R již nebudou pixely ovlivněny a obrázek tam zůstane nezměněn. Přechody by měly být maximálně plynulé!

Návrh implementace

Výpočet s použitím inverzního zobrazení - bod [x1,y1] se vybarví přímo z bodu [x0,y0]. Bod z blízké vzdálenosti r od [x1,y1] se také přebarví - ale jeho vzor bude posunut o kratší vektor k(r), např by mohlo být k(r) = T * (R - r)/R. Zkoumání nejvhodnějšího vzorce pro vektor posunutí k(r) nechám na vás, musíte jen splnit podmínku k(0) = T. Program by mohl obsahovat implementace několika různých variant k(r), mezi kterými by si mohl uživatel přepínat.

Více posunutí najednou

Jediným posunutým bodem bychom obrázek příliš zajímavě nezdeformovali. Dovolíme uživateli zadat více vektorů posunutí T a tyto budou na obrázek působit současně. Implementace: na každý cílový pixel budou mít vliv všechny blízké vektory posunutí T, jejich účinky se jednoduše sčítají (sčítají se vektory posunutí, až nakonec se zjistí vzor a jeho barva se do cíle přenese). Můžete vymyslet i jiné přístupy, míchání (blending) jednotlivých vlivů, apod.

Základ

Základem vám může posloužit projekt 080warptriangles z repository grcis. Je připravena jednoduchá aplikace, ve které uživatel zadává vstupní obrázek a po reakci na různé události se překresluje uživatelsky definovaná komponenta GUIPictureBox.

Interaktivní práce

Vaše implementace musí mít implementovánu reakci na GUI události - stisk tlačítka myši (OnMouseDown()), tažení (OnMouseMove()) a uvolnění tlačítka (OnMouseUp())... Tak budete implementovat interaktivní editaci všech posunutí, spolu s dalšími samozřejmými funkcemi jako: odstranění posunutí (feature delete), nastavování příp. číselných parametrů, přidávání posunutí (feature insert), apod. Stisk klávesy na klávesnici můžete ošetřit v OnKeyDown(), dle libosti do formuláře přidávejte další ovládací prvky.

Další funkce

Ukládání a nahrávání celých deformačních projektů (vstupní obrázek + sada posunutí), přepínání případných variant výpočtu, za body navíc i morphing (výroba přechodové animace mezi dvěma obrázky). Při morphingu byste měli uvažovat o nějakém kvalitním posunování bodů do mezipoloh.

Termín

Odevzdat do: 7. 1. 2018

Body

Základ: 30 bodů
Bonus: za morphing, komfort ovládání, varianty výpočtů, bohatství funkcí..

Projekt

Počáteční Visual Studio projekt: 080warptriangles

Zdrojové soubory

Je potřeba odevzdat kompletní VisualStudio projekt.


Copyright (C) 2006-2017 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)