Masarykova univerzita v Brně Fakulta informatiky

Škálovací algoritmy 2D obrazu

Bakalářská práce

Jan Rybář

Brno, 2012

Prohlášení

Prohlašuji, že tato práce je mým původním autorským dílem, které jsem vypracoval samo- statně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj.

Jan Rybář Poděkování Chtěl bych tímto poděkovat svému vedoucímu práce, panu doktoru Petru Tobolovi, za umožnění práce na tomto tématu, cenné rady, ale především za nezměrnou ochotu a trpě- livost. Dále bych rád věnoval dík všem svým přátelům a kolegům, jejichž zkušenosti mi pomohly tuto práci sepsat. V neposlední řadě také děkuji své rodině, která respektovala mou dlouhodobou absenci, a dalším lidem, kteří mě nejen v době psaní podporovali. Shrnutí Tato práce se zaměřuje na problematiku změny rozlišení digitálního obrazu, především jeho zvětšení. V úvodní části textu je probrána klíčová teorie a základy zpracování obrazu včetně jeho reprezentace ve výpočetní technice. Jádro textu popisuje nejpoužívanější techniky řešení problému transformace obrazu, jejich princip a způsob užití. Ve zbytku textu je rozebrána programová implementace těchto technik. V závěru je srovnání vzorových obrazů po průchodu programem a efektivita zmíněných metod. Klíčová slova Škálování, transformace obrazu, rozlišení, rastr, bitmapa, převzorkování, interpolace, ob- razový filtr, konvoluce, pixel art Obsah 1 Úvod 9 2 Teorie 10 2.1 Digitální obraz 10 2.2 Škálování obrazu 10 2.3 Převzorkování 11 2.4 Interpolace 11 3 Metody 12 3.1 Konvoluce 12 3.2 Základní interpolace 13 3.2.1 Nearest neighbour interpolace 13 3.2.2 Bilineární interpolace 13 3.3 Funkce vyšších řádů 14 3.3.1 Sinc(x), Windowed funkce 15 3.3.2 Kubická interpolace 16 3.3.3 Lanczosova interpolace 17 3.4 Pixel Art 18 3.4.1 Hq2x 19 3.4.2 2xSaI 19 4 Implementace 21 4.1 Vstupní formáty 21 4.1.1 BMP 21 4.1.2 JPEG a kompresní formáty 22 4.2 Nástroje, knihovny, prostředí 22 4.3 Kód programu 25 4.3.1 Hlavní program 25 4.3.2 Jednoduché interpolace 25 4.3.3 Interpolace konvolucí 26 4.3.4 Optimalizace konvoluce 27 4.3.5 Hq2x 28 4.3.6 2xSaI 28 4.4 Použití programu 30 5 Výsledky 31 5.1 Výstupy 31 5.2 Metoda měření, testovací sestava 31 5.3 Rychlost algoritmů, užití 32 5.3.1 Naměřené časy 32 5.3.2 Užití algoritmů 34 5.4 Plány, budoucí vývoj 35 5.4.1 Program Scale 35 5.4.2 Interpolační metody 35 6 Závěr 36 7 Seznam ilustrací 37

7 8 Seznam tabulek 38 9 Seznam zkratek 39 10 Literatura 40 11 Příloha 42

8 1 Úvod Nejen hollywoodské filmy a moderní počítačová zábava dokazují, že se zlepšila vizuální kvali- ta obrazu. Nejen jeho reprezentace, ale i pořizování. Od konce osmdesátých let se díky novým technologiím povýšilo vnímání obrazových médií na hranici možností lidského oka. Změnou při- tom neprošla jen schopnost zobrazení virtuální reality, ale především samotná výstupní za- řízení, která moderní obraz produkují. Plně se digitalizoval veškerý přenášený signál, zvýšilo se rozlišení obrazovek a větší paměťový prostor počítačů umožnil realističtější vzhled textur a jakýchkoliv modelů. To pevně oddělilo i veškerý obsah, který byl do té doby vytvořen, od moderního pojetí obra- zu vzhledem ke kvalitě zpracování. Přesto je vhodné staré nekvalitní obrazové materiály uchovávat, protože často nadále nacházejí využití. Příkladem může být např. design s retrospek- tivní tématikou. Navíc je pro zobrazování na moderních zařízeních nezřídka kdy nutné jejich kvalitu zvyšovat. Právě schopnost zkvalitnit obraz nebo ho přizpůsobit pro jakékoliv účely je jedním z důleži- tých témat oboru zpracování digitálního obrazu. To se týká nejen starých obrazových děl, ale i těch současných, a to v mnoha odvětvích - počínaje domácí elektronikou, přes běžné fotoapa- ráty a jiné přístroje na snímání obrazu, až po grafický design. Tam jsou obrazové transformace běžnou záležitostí. Jednou z možností zlepšení kvality obrazového materiálu je zvýšit rozlišení, tj. převzorkovat získaná data s ohledem na použitý výstupní hardware. Prakticky každý obrazový výstup musí být upraven na parametry zobrazovacího zařízení nebo média. Operace na rastrových obrazech jsou ale náročné úkony, které s sebou přináší problémy. Ty však mohou být řešeny četnými způ- soby. Cílem této práce je seznámit čtenáře s problematikou úpravy a zvýšení kvality obrazu změnou jeho rozlišení, včetně postupů, kterými se tyto techniky provádějí. Záměrem je pře- devším uvést nejběžnější metody, postupy a algoritmy, které se často používají v akademické, obchodní i zábavní sféře. Dalším důvodem k sepsání tohoto textu je uvést i ty algoritmy, které nejsou běžné vzhledem k počtu implementací, ale přesto bývají rozšířené v úzké skupině uživatelů výpočetní techniky. Tyto jsou v práci zdokumentovány tak, aby byla umožněna jejich integrace do akademické sféry, kde byly dosud opomíjené i přes svůj potenciální přínos. Praktickým přínosem této práce je srovnávací posudek uvedených metodik a algoritmů a jejich programová implementace. Ta slouží především pro demonstrativní účely, ale zároveň je zpřístupněna pro veřejnost, kde je úprava obrazu doménou často pouze profesionálních grafiků.

9 2 Teorie

2.1 Digitální obraz Ve výpočetní technice je dvojrozměrný obraz reprezentován jako diskrétní signál digitálních dat. Tento signál lze získat buď prací s diskrétními hodnotami už při tvorbě výstupního obrazu, jako např. rastrovým kreslením, nebo nejčastěji digitalizací [1], tj. přechodem od spojité ob- razové funkce k diskrétní. Takového přechodu se dosahuje snímáním hodnot spojité funkce v pevných intervalech v čase nebo prostoru, neboli kvantizací (převedení snímaných reálných hodnot na celočíselné) a vzorkováním (angl. sampling). Spojitá obrazová funkce je funkce dvou proměnných, souřadnic x, y, a může být především reprezentací obrazu v reálném světě. Jejími hodnotami jsou pak barvy na daných souřadnicích, vyjádřitelné v teoreticky nekonečně přesných reálných hodnotách. Ve vektorové grafice se pak diskrétní obraz tvoří vzorkováním pa- rametrického zápisu matematických funkcí, které popisují požadované modely (parametrické kružnice, geometrické útvary, linky). Výsledkem je konečná uspořádaná množina digitálních dat, tedy celočíselně vyjádřených barev v rastru. Právě velikost intervalů, neboli frekvence vzorkování, je důležitá pro výslednou reprezentaci digitálního obsahu. Vzorkováním dochází ke ztrátě informací, a to nepřímo úměrně k vzorkovací frekvenci. S vyšší frekvencí je nasnímaný obraz přesnější vůči originální předloze, zato však paměťově náročnější.

2.2 Škálování obrazu U dvojrozměrného obrazu je jeho vzorkování a rozlišení (bodová velikost obrazu) v přímé úměře. V případech, kdy je jeho rozlišení nevyhovující, je možné tuto vlastnost rastru změnit zvětšením (angl. upscaling), nebo zmenšením (angl. downscaling), pokud je na původní obraz I(u,v) aplikována geometrická transformace, jak jak je uvedeno v [1] a následujícím vzorci:

( )=[ ( ) ( )] T u ,v x u ,v , y u ,v , (1) kde u, v jsou celočíselné souřadnice původního obrazu a funkce vrací novou polohu pixelu. Cí- lem je vytvořit nový obraz I'(u', v'), ve kterém budou všechny souřadnice diskrétní [2]. Operací ale mohou vzniknout neceločíselné hodnoty pozic pixelů. K řešení problému se používá tech- nika mapování se dvěma možnými přístupy [2]: • Source-to-Target • Target-to-Source První jmenovaný pro každý pixel původního obrazu vypočítává pozici v novém rastru. Ačkoliv tento přístup vypadá přirozeně, může komplikovat tvorbu cílového obrazu tím, že buď nová

10 hodnota nebude korespondovat se žádným zdrojovým pixelem, nebo bude pro algoritmus ne- snadné rozhodnout, na které celočíselné hodnoty se má zdrojový pixel mapovat. V praxi se častěji používá druhý přístup, který pro každý pixel v novém obraze I'(u', v') hledá zdrojový pixel původního obrázku. Tím je možné se výše zmíněným problémům většinou vy- hnout. Zejména se pak zamezí vzniku prázdných „děr“ v I'(u', v'). Tento druh mapování však pro výpočet původních souřadnic vyžaduje inverzi původní transformace [2]

− (u ,v)=T 1(u' ,v '). (2)

U diskrétního 2D obrazu vzniká problém, kdy transformace, jako např. zvětšení obrazu, odhalí nedostatek informací v původních diskrétních datech, následkem čehož v novém obraze vznika- jí zmíněné díry [1], pixely, které nemohou nést informaci o barvě. Tento problém je způsoben nedostatečným vzorkováním digitalizovaného signálu. Běžně se proto řeší novým sejmutím a digitalizací hodnot původní spojité obrazové funkce (např. nové skenování, nafocení, vykres- lení vektorových dat), nebo rekonstrukcí a převzorkováním [1] (kap. 2.3).

2.3 Převzorkování Při přechodu ze spojité obrazové funkce na diskrétní se ztratí množství dat, která jsou ale dů- ležitá při některých obrazových transformacích, např. při zvětšení rozlišení obrazu. Aby nedo- cházelo ke vzniku prázdných pixelů (kap. 2.2), je nutné původní spojitý obraz rekonstruovat, tj. přejít z diskrétní obrazové funkce zpět na spojitou. Na této funkci je možné provést poža- dovanou geometrickou transformaci. Výsledné neceločíselné hodnoty se poté znovu vzorkují, tentokrát s vyšší frekvencí. Tento proces je nazýván „převzorkováním“ [1].

2.4 Interpolace Spojitou funkci lze z diskrétních dat digitalizovaného obrazu získat už pouze aproximací. Právě způsob aproximace určuje různé metody, které se liší kvalitou a rychlostí [1]. Pro dopočí- tání mezilehlých hodnot mezi jednotlivými pixely vzorkované funkce se používá interpolace. Její účel je co možná nejpřesněji určit optimální hodnotu spojité funkce v jakémkoliv čase mezi body obrazu, aby co nejvíce zachovávala detail spojitého signálu a nezpůsobovala chybné ar- tefakty (šum, hrany u hladké funkce atd.) [2]. Vstupem jsou většinou pouze data dvojrozměrné- ho obrazu (mimo řídící proměnné, kap. 3.3.2), a právě množství poskytnutých dat udává kvalitu výstupu interpolace a zároveň její výpočetní složitost. Většinu interpolačních technik lze vyjádřit v podobě obrazových filtrů, konvolučních jader (kap. 3.3.1), které by měly být spojité. Nespojité filtry způsobují rovněž nespojitosti v rekon- struované funkci, které se v obraze projevují jako hrany [1], tj. body, u kterých je rozdíl barevné nebo jasové složky patrný nebo vyšší než stanovená mez.

11 3 Metody

3.1 Konvoluce Rekonstrukci spojité obrazové funkce f(x, y) lze provést konvolucí

∞ ∞ ( )=( ∗ )( )= ∑ ∑ ( − − ) ( ) f x , y f ' w x , y w x u , y v f ' u ,v , (3) u=−∞ v=−∞ kde f'(x, y) je diskrétní funkce vzorkovaná z f(x,y) a w(m, n) je konvoluční jádro neboli in- terpolační filtr. Je to spojitá funkce, která má na vstupu vzdálenosti vzorkovaných bodů od stře- du jádra w(0, 0). Těmto bodům udává váhy při výpočtu mezilehlé neznámé hodnoty ve spojité doméně. Prakticky se střed jádra posune na pozici cílového bodu a váhy jsou „přiloženy“ na dis- krétní vzorky, se kterými se vynásobí. Výsledkem konvoluce je součet těchto násobků. Integrál konvoluční funkce se musí rovnat jedné, aby aplikace vah nezpůsobila překročení oboru hodnot obrazové funkce a nezesilovala samotný obrazový signál. Konvoluční jádro tedy musí být normalizované. Konvoluce je jako lineární operace separabilní, jádro lze v n rozměrech rozložit na součin uspořádaných n jednorozměrných jader. Ve dvojrozměrném obraze tedy lze provést interpolaci nejprve na jedné ose a z vypočtených hodnot znovu interpolovat výslednou hodnotu dopočí- távané spojité funkce, jak je uvedeno v ilustraci 1. V dalším textu proto budou popsána pouze jednorozměrná konvoluční jádra. Legenda ilustrace 1 je následující: černé body jsou diskrétní vzorky, ze kterých provádíme re- konstrukci. Červený bod je dopočítávaná hodnota spojité obrazové funkce. Modré body znázor- ňují hodnoty vypočítané konvolucí v jedné ose. Zelený bod je výsledná hodnota.

Ilustrace 1: Interpolace ve dvou rozměrech

12 3.2 Základní interpolace Mezi základní a nejjednodušší metody interpolace spadají funkce, které jsou sice velmi jednoduché na implementaci, poměrně rychlé a výpočetně nenáročné, ale přinášejí jen velmi podprůměrné výsledky v tvorbě cílového rastru. Ten pak obsahuje typické vady, např. nespoji- tosti v kresbě, zbytečné a rušivé hrany, ve fotorealistických obrazech jasně viditelné ne- pravidelnosti a často aliasing [1]. Funkce konvolučního jádra takových interpolací je z definice nespojitá.

3.2.1 Nearest neighbour interpolace Nearest neighbour, neboli interpolace nejbližším sousedem, někdy také „point-shift“, je po- važován za nejjednodušší způsob dopočítání chybějících hodnot při rekonstrukci spojité ob- razové funkce z diskrétní. Dosahuje tak zaokrouhlováním souřadnic ve spojitém obraze na nejbližší celé číslo a převzetí hodnoty pixelu na této pozici. Máme-li spojitou funkci f(x, y) (x a y jsou neceločíselné souřadnice) a její diskrétní vzor- kovanou funkci f'(x', y'), pak

( )= (⌊ + ⌋ ⌊ + ⌋) f x , y f ' x 0.5 , y 0.5 . (4)

Jednorozměrné konvoluční jádro interpolace vypadá následovně:

={1 pro −0.5

V naivní implementaci n-násobného zvětšení stačí při procházení pixelů zdrojového obrazu každý bod zapsat n-krát na sousední pozice v cílovém transformovaném obrazu. To vyjadřuje všeobecně nevýhodu této interpolace. Při zvětšení obrazu zvýrazňuje hrany a u hran s malými úhly sklonu silně produkuje alias. Zmenšením obrazu touto metodou se naopak ničí tenké linky [1]. Využití pro svou rychlost i přes popsané nevýhody nachází např. u rychlých náhledů v grafických programech nebo GUI, zvláště pak v zařízeních s méně výkonným hardwarem (mo- bilní telefony) nebo na serverech s vysokou zátěží.

3.2.2 Bilineární interpolace Bilineární interpolace (lineární interpolace v 2D doméně) je často užívaný interpolační po- stup, který je dodnes implementován i v grafických kartách a jejích programových rozhraních (Microsoft DirectX [3], OpenGL [4]). Nabízí rychlý výpočet na malém množství dat, avšak lepší,

13 pro lidské oko přijatelnější podání výsledného obrazu, protože ve výstupu nejsou hrany tak lehce zpozorovatelné jako u interpolace nejbližším sousedem (Ilustrace 2).

Ilustrace 2: Srovnání nearest neighbour a bilineární interpolace Lineární interpolace pro výpočet mezilehlé hodnoty ve spojité doméně využívá lineárního gradientu mezi dvěma nejbližšími diskrétními vzorky. Váha každého vzorku je tedy rovnoměrná a nepřímo úměrná vzdálenosti od cílové neceločíselné souřadnice. Výpočet cílového bodu je popsán vztahem

∣Q−A∣ f (Q)= f ( A)+( f (B)− f ( A)) , ∣B− A∣ (6) kde f(x) je obrazová funkce a Q je mezilehlý bod mezi nejbližšími sousedy A a B [1]. Využití právě dvou sousedních vzorků (na každé ze dvou os) je pro rychlost výpočtu klíčové, ovšem při přechodu mezi dalšími dvěma vzorky je evidentní hrana ve výstupu, jelikož se hodno- ty lineárního gradientu změnily, neboli jednorozměrné konvoluční jádro interpolace [1]

−∣ ∣ ≤∣ ∣< w ={1 x pro 0 x 1 lin 0 pro 1≤∣x∣ (7) je nespojité v druhé derivaci, funkce není hladká.

3.3 Funkce vyšších řádů Viditelnou nevýhodou základních interpolačních funkcí je jejich skokový průběh, který způso- buje hrany na přechodech mezi vzorky. Hladší funkce s vyšším stupněm diferencovatelnosti se chovají daleko lépe, zachovávají přechody mezi hodnotami ve spojité obrazové funkci a ne- zvýrazňují hrany. Avšak při výpočtu mezilehlého bodu uvažují váhy pro více sousedů a jako funkce vyššího řádu se nepohybují jen v mezích lineárních operací, což je složitější pro zpra- cování ve výpočetní technice (počítání mocnin, goniometrických funkcí). Je proto žádoucí rychlost výpočtu zvýšit, např. dopředným vypočítáním hodnot jednotlivých vah konvoluce pro opakující se vzdálenosti vzorků od středu jádra, a uložením těchto hodnot

14 do tzv. look-up tabulky [2]. Místo opakovaného složitého počítání vah lze pak k této tabulce rychleji přistupovat (kap. 4.3.4).

3.3.1 Sinc(x), Windowed funkce Ztráta informací při digitalizaci obrazu vyvolává dojem, že je rekonstrukce původní spojité ob- razové funkce nemožná. Pokud je funkce vzorkovaná podle Shannonova teorému vzorkování [5], je v diskrétní doméně frekvenčně omezená a hranice oboru hodnot spojité funkce jsou schodné s těmi u funkce diskrétní. Nepředpokládá se proto náhlá změna průběhu funkce a mezi jednotlivými vzorky se nemění monotónnost. Tyto vzorky lze proložit nějakou spojitou funkcí. Pokud je třeba při rekonstrukci zachovat hrany (vysoké frekvence ve Fourierově doméně [1]) a zbylé oblasti, jako např. barevné přechody (nízké frekvence) rozprostřít, lze použít ideální níz- kofrekvenční filtr Sinc(x), zadaný konvolučním jádrem

1 pro ∣x∣=0 ( )={ (π ) Sinc x sin x pro ∣x∣>0, (8) π x kde x je vzdálenost od středu jádra. Funkce Sinc je sudá, diferencovatelná, hladká, ale také s nekonečným definičním oborem, což je ve výpočetní technice nereprezentovatelné. Je proto nutné tuto funkci omezit, nebo její váhy opět pouze aproximovat. Omezením ideálního interpolačního filtru jsou tzv. okna, která nejenže umožní kompaktní konvoluci, ale zároveň omezí chyby konvoluce, způsobené oscilací Sinc filtru, která roste se vzdáleností váhy od středu jádra. Právě předpis funkce okna určuje aplikaci interpolačních fil- trů vyšších řádů podle požadovaných výsledků. Výsledný použitý filtr je zadán

( )=ψ ( )⋅ ( ) w x x Sinc x , (9)

ψ(x) je funkce okna.

15 3.3.2 Kubická interpolace Kubická (v 2D obraze bikubická) interpolace je jedním ze způsobů aproximace ideálního Sinc filtru (kap. 3.3.1). Pro výpočet hodnoty využívá nejčastěji kubických křivek. Jako vstup požaduje 4 nejbližší sousedy v jedné ose, tedy 16 v dvojrozměrném obraze (viz ilustraci 1). K rekonstrukci hodnoty bodu x ve spojité doméně tedy potřebuje diskrétní vzorky

( − ) ( ) ( + ) ( + ) =⌊ ⌋ f u0 1 , f u0 , f u0 1 , f u0 2 , kde u0 x . (10)

Kubická interpolace je druhem křivkové interpolace, zadané genericky definicí

(−6a−9b+12)⋅∣x∣3 +(6a+12b−18)⋅∣x∣2−2b+6 pro 1≤∣x∣≤1 ( )= 1⋅ (− − )⋅∣ ∣3 w cs x ,a ,b { 6a b x (11) 6 +(30a+6b)⋅∣x∣2+(−48a−12b)⋅∣x∣+24a+8b pro 1≤∣x∣<2 0 pro ∣x∣≥2, kde řídící parametry a, b udávají sklon křivky v interpolační funkci.

Kubická interpolace wcub se rovná funkci wcs(x, 1, 0) a patří mezi tzv. hlavní křivky (angl. cardi- nal splines), kde b=0. Zřídka se používají mimo jiné i následující funkce [2]: • wcs(x, 0.5, 0) pro interpolaci Catmull-Rom křivkou • wcs(x, 0, 1) při použití kubického B-spline • wcs(x, 1/3, 1/3) podle interpolace Mitchell-Netravali Uvedené funkce křivek se od sebe liší drobnými detaily ve výstupu rekonstrukce. Cat- mull-Rom zachovává ostrost jako kubická křivka, ale podává lepší výsledky při filtrování hladkých oblastí. B-spline výstupem odpovídá konvoluci s Gaussovou křivkou, tedy způsobuje prakticky rozmazání obrazu. V podstatě se ale nejedná o interpolaci, nýbrž o aproximaci signá- lu, protože křivka není definována ve všech bodech mezi hranicemi svého definičního oboru. Mitchell-Netravali je pak empiricky zjištěným kompromisem mezi Catmull-Rom a B-spline in- terpolací. Díky kvalitám obrazového výstupu lze interpolaci kubickým polynomem použít ve většině grafických softwarů v komerční i svobodné sféře (např. Adobe Photoshop, GIMP [6]). Některé programy nabízí i volbu jiných křivkových funkcí (IrfanView [7]).

16 3.3.3 Lanczosova interpolace Lanczosova interpolace, neboli Lanczosovo okno, je v praxi nejpoužívanější typ z rodiny oknem omezených Sinc funkcí. Filtr je pojmenován po Corneliovi Lanczosovi (1893 1974), který předvedl využití Fourierových řad a Čebyševových polynomů. Namísto aproximace Sinc funkce (kap. 3.3.2) ji omezuje na kompaktní konvoluční jádro. K tomu využívá samotnou funkci Sinc s ohraničeným definičním oborem. Výsledné konvoluční jádro použité při rekonstrukci je definováno jako

( )=ψ ( )⋅ ( ) w x L n x Sinc x . (12)

Funkce okna ψLn je definována následovně:

1 pro ∣x∣=0 x sin (π ) ψ ( )= n <∣ ∣< Ln x { pro 0 x n (13) π x n 0 pro ∣x∣>n.

Proměnná n určuje poloměr okna, který se shoduje s poloměrem výsledného konvolučního jádra. V současné době je nejužívanější hodnota n = 2 a n = 3, tedy konvoluce uvažuje 4x4, resp. 6x6 okolních pixelů. Konvoluční jádro jednorozměrného Lanczosova filtru je definováno:

1 pro ∣x∣=0 x sin (π )⋅sin (π x) w (x)={ n Lan n n⋅ pro 0<∣x∣n.

Ve výstupu se Lanczosova interpolace podobá bikubickým filtrům (z definice oba aplikují stejnou výchozí ideální funkci), ale Lanczosův filtr daleko lépe zachovává ostrost hran s dosta- tečnou jemností tónových přechodů [8]. Neprodukuje artefakty ve výsledném obraze za cenu lehkého zvýraznění hran.

17 V grafických aplikacích bývá filtr distribuován spolu s bikubickými filtry jako jejich alternativa. Jeho výpočetní náročnost je oproti bikubickým filtrům vyšší kvůli použití trigonometrických funkcí. Protože jsou oba filtry aplikovány jako konvoluce a mohou být urychleny příslušnými metodami (kap. 3.3), v praxi nebývá rozdíl velký.

3.4 Pixel Art Pixel art je výraz pro specifický druh grafické tvorby, která připomíná staré počítačové hry a GUI z přelomu 80. a 90. let 20. století. Tehdejší hry, provozované na raných 32bitových proce- sorech Intel (80386, 80486) nebo 8-16bitových herních konzolích (NES, SNES, SMS nebo Mega- drive), byly značně omezené pamětí. Proto byl pro jednotlivé grafické objekty (předměty, pozadí) vymezen jen malý prostor. Důsledkem toho musely být detaily modelu, ostré hrany nebo jemné kresby potlačeny.

Ilustrace 3: Výňatek ze hry Final Fantasy III pro NES [9] Taková grafika měla jasná specifika. Počet barev byl velmi omezený, často pouze na 16bitové odstíny (216 = 65536 barev). Kvůli aliasu neměly hrany přílišný sklon, obraz se často skládal z velkých jednobarevných morfologických ploch. I přes své nevýhody a technologickou zaosta- lost je tento vizuální styl stále oblíbený jak v designu [10], tak v komerční sféře, protože staré hry se nadále hrají a prodávají [11] a média na mobilních zařízeních (telefonech) takovou grafiku užívají. Jeho vlastnosti mohou být i do budoucna prospěšné např. ve zpracování biome- dicínského obrazu, kde je práce s velkými morfologickými celky běžnou praxí. Avšak toto ob- razové vyjádření není na akademické půdě příliš známé a podporované. Škálování (převzorkování) Pixel art obrazu se neprovádí klasickými metodami (kap. 3.2, 3.3) kromě interpolace nejbližším sousedem, protože způsobují buď rozmazání obrazu (lineární převzorkování) nebo artefakty v kresbě (konvoluce s aproximací Sinc). Takový postup je zby- tečný díky vlastnostem Pixel art grafiky, které umožňují uzpůsobené a velmi efektivní techniky interpolace.

18 Vzhledem k povaze vstupních dat se tyto škálovací algoritmy používají ke specifickým trans- formacím obrazu, často pro odstranění aliasu při rotacích rastrů (RotSprite [12]), většinou pou- ze ke zvětšování, a to na pevně stanovenou mez. Nejběžnější je dvojnásobné zvětšení, avšak nejužívanější algoritmy (kap. 3.4.1, 3.4.2) nabízí u systémů s MMX instrukčním rozšířením šká- lování vyšší [13] nebo poměrově nezávislé (v této práci neimplementováno kvůli závislosti na Intel MMX).

3.4.1 Hq2x Hq2x, neboli High Quality 2x Magnification filter, je škálovací filtr vyvinutý Maximem Stepi- nem a vydaný v roce 2003 pod licencí LGPL [14]. Od toho roku bývá hojně využíván v progra- mech zabývajících se Pixel Art grafikou, jako např. emulátory starších počítačů a domácích herních konzolí (FCEUX [15], DosBox [16]). Algoritmus využívá faktu, že Pixel Art grafika se skládá z jasně oddělených hran s nízkým sklo- nem a velkými morfologickými celky, jednobarevnými plochami bez přechodů. V podobraze 3x3 pixelů se proto soustředí na hledání hran a jejich sklonů (první derivace mezi dvěma uvažovaný- mi body) a s touto směrnicí distribuuje nový interpolovaný bod příslušné barvy hrany. V přípa- dě, že žádnou hranu v okolí aktuálně zpracovávaného pixelu (rozdíl barvy nebo jasu procházeného pixelu a jeho sousedů) nenalezne, jednoduše do nového dopočítávaného bodu zkopíruje barvu kteréhokoliv sousedního pixelu. Pro porovnání barev při hledání hran v obraze se místo běžného RGB barevného prostoru po- užívá YUV systém, který umožňuje snadno hledat rozdíl bodů v jasové (Y) a barevné složce (UV) rastru. Vzhledem k omezenému barevnému pojetí pixel art grafiky je barva zapsána na 16 bi- tech (65536 barev), a díky tomu se dají RGB barvy triviálně konvertovat pomocí look-up tabulky namísto složitého maticového násobení, jak jej uvádí [1]. Po zjištění hran a jejich příslušného úhlu je v algoritmu připravena look-up tabulka případů všech možných úhlů hran (vzhledem k aliasu jen omezený počet stupňů, tedy méně jak 360). Pro každý z nich je připravena jedna ze sedmi optimálních interpolací podle rozdílu barev a tyto interpolace průměrují barvy vzhledem k sklonu hrany. Právě tabulka volby interpolací je nejob- sáhlejší a nejmarkantnější součástí distribuovaného kódu.

3.4.2 2xSaI 2xSaI je zkratka pro „Double Scale and Interpolation“. Jedná se o algoritmus, který v roce 1999 vyvinul a pod licencí GPL vydal Derek Liauw Kie Fa, ve vývojářské komunitě znám pod pře- zdívkou „Kreed“. Interpolační metoda je modifikací podobného, staršího, ale déle nevyužívané- ho algoritmu Eagle [17]. Pro svou rychlost a optimalizaci na Intel MMX architekturách (v implementaci této práce nevyužito pro zvýšení kompatibility mezi platformami) bývá využit téměř v každém svobodném softwaru na emulaci starších počítačů a herních konzolí.

19 Od algoritmu Hq2x (kap. 3.4.1) se v zásadě neliší. Rozdílem je, že používá klasický RGB 16bi- tový barevný prostor namísto YUV, nezavádí look-up tabulky a nabízí pouze dvě interpolační funkce mezi dvěma body, tedy o pět méně než Hq2x. První interpolace prodlouží nalezenou hranu průměrováním dvou bodů. Druhá je aplikována, pokud je ve čtverci vzorků vstupního ob- razu nerozlišitelná hrana. Díky uvedeným vlastnostem je algoritmus rychlejší, ovšem podává oproti Hq2x odlišné, v in- dividuálních situacích horší výsledky v obrazovém výstupu (např. osamostatněné body v kresbě jsou transformovány na hvězdicovité útvary namísto kruhů).

20 4 Implementace Součástí této bakalářské práce je počítačový program Scale, který implementuje zmíněné metody, a umožňuje uživateli provádět škálování (v některých případech pouze zvětšení, viz kap. 3.4) na vstupních obrazech. Zároveň slouží jak pro demonstrativní účely, tj. srovnání jednotlivých grafických výstupů, tak pro potřeby výuky a jiné volné použití. Je proto šířen pod li- cencí GNU GPL, čímž splňuje podmínky užití některých svých komponent z třetích stran. Komu- nikace programu s uživatelem probíhá v anglickém jazyce. Program by měl sloužit jako alternativa k projektu ImageMagick (kap. 4.2), se kterým se jednak obtížně manipuluje, a nutí tak k obtížnému studiu dokumentace, a za druhé je jeho programový kód špatně čitelný. Především ale neobsahuje implementace Pixel art algoritmů. Oba programy jsou vyvinuty jako konzolové aplikace, připravené pro použití v automa- tizovaných skriptech. Ačkoliv byl program Scale původně zamýšlen jako multiplatformní aplikace kompatibilní s PO- SIX standardem [18], byly při jeho tvorbě pro názornost použity jednoduché a kompaktní knihovny (CImage namísto Allegro, viz kap. 4.2), které jsou úzce vázány na použití v systému MS Windows. Na ostatních systémech lze aplikaci používat po začlenění jiných vhodných knihoven.

4.1 Vstupní formáty

4.1.1 BMP BMP je rozšíření systému Windows [19], které umožňuje uchovávat a přenášet obrazová data nezávisle na systému. Microsoft takovou manipulaci definoval formátem DIB, který se používá pro reprezentaci rastrů v různých barevných rozlišeních. DIB formát je pak přenášen v metasou- borech nebo BMP souborech, které navíc obsahují dodatečné informace o rastru (rozlišení, po- čet bytů na pixel). Soubor BMP se skládá ze 4 částí: • BMP hlavička • DIB hlavička • surová obrazová data (bitová mapa, bitmapa) • doplňkové atributy BMP hlavička tvoří prvních 14 bytů souboru a obsahuje informace o velikosti rastru a adresu pro přímý přístup k těmto datům. Bezprostředně potom následuje DIB hlavička, která definuje rozměry rastru, základní vlastnosti rastru (barevné rozlišení, barevnou paletu aj.), přítomnost komprese (případně její stupeň) a další rezervované atributy. Tuto hlavičku následuje samotná bitová mapa.

21 Obrazová data v BMP souboru popisují barvu každého pixelu v rastru, počínajíce levým krajem spodního řádku, a mohou být zapsána ve 4 barevných rozlišeních: • 1 bit • 2 bity • 8 bitů • 24 bitů V barevném rozlišení 24 bitů je barva uložena ve 3 barevných 8bitových kanálech RGB. Ve for- mátu BMP je ale uložení kanálů opačné, tedy BGR. V aplikační části této bakalářské práce jsou soubory BMP intenzivně využívány. Formát nabízí vlastnost přímého přístupu k surovým bitovým mapám. To usnadňuje implementaci funkcí pro manipulaci s obrazovými soubory a nezatěžuje běh programu dekódováním obrazu, na rozdíl od kompresních datových formátů, např. JPEG.

4.1.2 JPEG a kompresní formáty Formát JPEG byl vyvinut skupinou Joint Photographic Experts Group a standardizován v roce 1991. Umožňuje ztrátovou kompresi obrazu pomocí diskrétní kosinové transformace, která zmenšuje velikost obrazového souboru. V současnosti je kompresní formát JPEG velice rozší- řený a oblíbený, zvláště pak pro uchovávání fotografií. Způsob, jak využít výhod komprese ve formátu JPEG, je buď vlastní komplexní implementace podle popisu v literatuře [1] a zveřejněných specifikacích [20], nebo začlenění knihoven pro práci s formátem JPEG. Některé knihovny jsou poskytovány spoluautory standardu JPEG [20]. Ty jsou ale šířeny ve formě zdrojových kódů. Aby mohly být využity, musí být nejprve přeloženy, a to vyžaduje vyhledání a přeložení dalších podpůrných knihoven. Kvůli náročnosti na prostředky čtenáře této práce byla podpora JPEG a jiných kompresních metod vynechána.

4.2 Nástroje, knihovny, prostředí

Eclipse CDT Eclipse IDE (Integrated Development Environment) je komplexní vývojové prostředí s velkým množstvím doplňků, které poskytují podporu řady programovacích jazyků nebo návrhových a vývojových nástrojů. Projekt vznikl v roce 2001 pod záštitou IBM, spravován je od roku 2004 nadací Eclipse, která jej šíří jako open-source [21]. Protože je z větší části napsáno v programovacím jazyku Java, je i se svými doplňky multiplatformní. Eclipse CDT je verze Eclipse IDE přizpůsobená pro vývoj programů v jazyce C/C++. Obsahuje specifické funkce a makra pro práci v tomto jazyce, nástroje pro spřažení s překladači jazyka (kap. 4.2) a pro ladění chyb.

22 MinGW MinGW je zkratka pro „Minimalist GNU for Windows“ [22]. Jedná se o port vývojové sady GNU, který je přizpůsobený pro překládání zdrojových kódů v prostředí systému MS Windows. Standardně podporuje jazyk C/C++, ADA a Fortran. Obsahuje verzi překladače gcc, kolekci GNU Binutils (assembler, linkovací program, ladící program gdb) a hlavičkové soubory pro jazyky C/C++, které ovšem nesplňují normu POSIX [18].

CImage CImage je jednoduchý nástroj pro manipulaci s BMP a TGA soubory. Autorem je Maxim Stepin, který CImage šíří pod licencí LPGL [14] od roku 2003 spolu se svým algoritmem Hq2x (kap. 3.4.1). Program je napsaný v jazyce C++ a je vázán na prostředí programu MS Windows. Poskytuje funkce pro otevírání, ukládání a barevnou konverzi bitmapových souborů. Zásadní předností je minimální velikost, jelikož program sestává z krátkého kódu uloženého ve dvou zdrojových souborech. Výhodou je také názornost funkcí a použitých objektových tříd pro reprezentaci bitmap. Použité datové struktury usnadňují náhradu knihovny CImage jinými ná- stroji. Díky svému malému paměťovému objemu a snadnému překladu je výhodnou, avšak funkčně chudou alternativou knihovny Allegro (kap. 4.2).

Allegro Allegro je sofistikovaná multiplatformní knihovna zaměřená na programování her a práci s multimediálním obsahem. Od roku 1998 je uvolněna jako „giftware“ [23] pro libovolné užití. Knihovna poskytuje nástroje pro • práci s GUI operačního systému • řízení vstupu a výstupu • nahrávání a ukládání multimediálních dat • kreslení obrazů a primitiv • manipulaci s hardware a 3D grafikou (od verze 5) Celý kód Allegra je psán v jazyce C/C++ a tvoří sadu funkcí pro programování na nízké úrovni. S podporou 3D grafického hardware od verze 5 se knihovna stala alternativou knihovny SDL [24]. Sada Allegro je šířena ve formě předkompilovaných binárních souborů, ovšem dodávaných třetí stranou a pouze pro MS Windows. Dále je k dispozici zdrojový kód knihovny připravený k přeložení. Proces ale vyžaduje obstarání a přeložení několika dalších knihoven a nástrojů. Tím je Allegro nevhodné pro účely této práce, neboť samotný program (verze 4.4.0, 2009) obsahuje více jak tisíc propojených zdrojových souborů o celkové velikosti 27 MB. Allegro je zahrnuté v originálním kódu interpolačního filtru 2xSaI (kap. 3.4.2), ze kterého bylo v praktické části prá- ce odstraněno.

23 ImageMagick ImageMagick je široká sada nástrojů pro práci s obrazem, poprvé vydaná v roce 1990 a do- dnes spravovaná a šířená pod licencí Apache 2.0 [25]. Nástroj je psán především pro práci v příkazové řádce několika systémů a nabízí škálu funkcí pro manipulaci s obrazovými daty, včetně kreslení, obrazové morfologie, transformací a zejmé- na nejpoužívanějších interpolačních filtrů. Při implementaci aplikační části práce byl nástroj ImageMagick využit pro porovnání uživatel- ského vstupu na příkazové řádce a výčtu obsažených interpolačních filtrů.

GIMP GIMP, zkráceně GNU Image Manipulation Program [6], je projekt vyvíjený svobodnou komu- nitou od roku 1996. Cílem projektu je poskytovat alternativu ke známému editoru Adobe Pho- toshop, tedy program, který umožňuje tvorbu a úpravu rastrové grafiky. Nabízí základní nástroje pro práci s 2D grafikou, pokročilé efekty a obrazové filtry. Program byl při studiu použit pro porovnání aplikace bikubického a Lanczosova interpolační- ho filtru. Navíc sloužil při přípravě referenčních materiálů (kap. 11).

IrfanView IrfanView je jednoduchý prohlížeč obrázků a fotografií, vyvíjený Irfanem Skiljanem [7]. Program je šířen zdarma pro nekomerční a studijní účely. Prohlížeč podporuje značné množství multimediálních formátů pomocí doplňků, které jsou také uvolněné ke stažení. Obsahuje základní i mírně pokročilé funkce pro úpravu fotografií, předně pak jejich převzorkování pomocí interpolačních filtrů. Mezi nimi jsou zařazeny i filtry uvedené v této práci, vyjma Pixel art algoritmů (kap. 3.4). Aplikace byla použita rovněž pro srovnání průchodu obrazovými filtry. Dále program umož- ňoval snadnou orientaci mezi výstupními soubory v implementační části práce, zvláště při kompletaci výsledných obrazů. Vysoká rychlost programu dovolila rozpoznávat rozdíly mezi jednotlivými rastry pouhým okem (při přechodech mezi jednotlivými soubory obrazů). Pro ten- to účel musela být vypnuta funkce automatického převzorkování při prohlížení multimédií v hlavním okně programu, aby srovnání bylo objektivní.

24 4.3 Kód programu Aplikační část práce je spustitelný program Scale.exe, přeložený z oddělených zdrojových sou- borů. Tyto soubory zahrnují následující: • hlavní zastupující program • funkce pro jednoduché interpolace • funkci pro převzorkování obrazu s dodanými konvolučními jádry • konvoluční jádra funkcí vyšších řádů • funkce pro Pixel art algoritmy

4.3.1 Hlavní program Program Scale.exe byl navrhován pro použití na příkazové řádce tak, aby s ním byla práce dostatečně jednoduchá a jasná. Cílovou skupinou této aplikace jsou: • běžní domácí uživatelé • studenti • pokročilí uživatelé skriptů. Ovládání přes příkazovou řádku využívá jen nutného množství prvků tak, aby byla pravdě- podobnost chyby v zadání minimální. Hlavní program, obsažený v souboru scale.cpp, plní tyto funkce: • načítá příkazy z uživatelské konzole • kontroluje chyby vstupu • nahrává uživatelem definované soubory do vhodných tříd • konvertuje barevné rozlišení vstupních souborů (v některých případech nepovinné) • aplikuje filtr • měří dobu aplikace filtru • ukládá výstupní rastr do nového, uživatelem definovaného souboru Pro nahrávání, konverzi a ukládání jsou použity funkce knihovny CImage, které pracují s třída- mi definovanými pro snadné uchovávání informací o načítaném obraze. V souladu s použitím v UNIX systémech program nevypisuje informace o běhu a ukončení do hlavního, ale chybového výstupu. V systémech MS Windows jsou údaje pokaždé vypsány přímo na výstup v příkazové řádce.

4.3.2 Jednoduché interpolace Algoritmy pro interpolaci nejbližším sousedem a bilineárním filtrem jsou zahrnuty do skupiny jednoduchých interpolací a samotné funkce pro použití v programu Scale jsou obsaženy v sou- borech nearest.cpp a bilinear.cpp. Oba přístupy pracují nad systémem barev RGB, resp. BGR (kap. 4.1.1).

25 Nearest neighbour Metoda nearest neighbour byla do programu implementována první. Podkladem pro práci s pamětí v prostředí jazyka C/C++ a výpočet poměru mezi zdrojovým a cílovým obrazem byl web Tech-Algorithm [26]. V implementaci algoritmu je použit přístup Target-to-Source. Pokus o implementaci přístupu Source-to-Target selhal na nejednoznačnosti volby referenčního pixelu (kap. 2.2). Pro každý pixel výstupního obrazu je zjištěn referenční bod ve vstupních datech. Barva tohoto bodu je jednoduše zkopírována do výstupního.

Bilineární interpolace Programování algoritmu bilineárního filtru zahrnovalo nutnost seznámit se s prací s barevný- mi kanály v rastru. Mezilehlá hodnota je vypočítána zvlášť pro každou barevnou složku. Manipulace s pixely v paměťovém prostoru nad jazykem C (pointerová aritmetika) ulehčuje pří- stup ke kanálům. Na tuto skutečnost upozorňuje web [26]. Pro každý pixel výstupního obrazu je zjištěn referenční bod, tj. nejbližší soused vlevo od ne- celočíselné hodnoty, spočtené pomocí poměru délek stran vstupního a výstupního obrazu. Pro aplikaci lineární funkce je jako druhý krajní diskrétní vzorek vybrán bod vpravo od referenčního bodu. Poprvé se objevuje problém odlišného výběru správného referenčního pixelu, pokud je pou- žita technika Target-to-Source. Poměr rozměrů vstupního a výstupního obrazu musí být spočten jako

poměr = (rozměrVstupu – 1)/rozměrVýstupu; Ilustrace 4: Poměr rozměrů vstupu a výstupu

Důvodem je vybrání levého nejbližšího souseda od vypočítané neceločíselné hodnoty, protože obrazová data jsou procházena od levého kraje obrazu. V opačném případě by docházelo k po- sunu výsledného obrazu a vzniku chyb na pravém a často i na spodním okraji výstupního rastru.

4.3.3 Interpolace konvolucí Bikubická a Lanczosova interpolace byla naprogramována jako aplikace konvolučního filtru. To se projevilo jako prvek, který usnadňuje a zpřehledňuje programovou implementaci, protože jednotlivé filtry mohou být dodány separátně v podobě odkazů na funkce. Konvoluční jádra fil- trů jsou pak jednotným způsobem aplikována ve funkci, která vypadá následovně:

void convolve(unsigned char* inputRaw, unsigned char* outputRaw, int inWidth, int inHeight, int outWidth, int outHeight, unsigned short bpp, int windowSize, float (*weight)(float, int), int LUT); Ilustrace 5: Funkce pro interpolaci konvolucí

26 Názvy atributů dostatečně popisují charakter vstupních dat. Klíčovým atributem pro interpolaci konvolucí je celočíselná položka windowSize, která určuje poloměr konvolučního jádra pří- slušného filtru. Ten je charakterizován vstupní funkcí weight(). Jejím prvním argumentem je re- álná vzdálenost diskrétního vzorku od dopočítávaného bodu. Druhý argument je opět poloměr konvolučního okna, který omezuje definiční obor konvoluční funkce interpolačního filtru (kap. 3.3.1). Separabilita konvolučního jádra je důležitá vlastnost, která umožnila konvoluci s diskrétními vzorky ve dvou vnořených smyčkách. Každá smyčka interpolovala mezihodnoty na jedné ze dvou os (kap. 3.1). Ve výsledku se snížila prostorová složitost výpočtu každého interpolovaného bodu, protože diskrétní vzorky, na které se přikládalo konvoluční jádro, nemusely být předem načteny a zvlášť uloženy v nějaké datové struktuře, ale mohly být do součtu započteny okamži- tě. Prostorová složitost konvoluce v každém bodě tak není (2 * windowSize)2, ale 2, protože sou- čet násobků (dle definice konvoluce, viz kap. 3.1) v každé ose je reprezentován jedinou proměnnou a jednotlivé vzorky zdrojového obrazu jsou načínány ad-hoc. Aby bylo podání barev po konvoluci maximálně přesné, výpočty probíhají v oboru reálných čísel. Kvůli chybám operací v plovoucí desetinné čárce podle normy IEEE754 [27] ale dochází k přetečení při převodu výsledných hodnot zpět na celá čísla, ve kterých jsou barevné kanály pi- xelu reprezentovány. Proto je nutné převody čísel ošetřit. V programu Scale je to prováděno prostým ořezáním na definiční obor celých čísel v rozsahu jednoho bytu.

4.3.4 Optimalizace konvoluce Hodnoty konvolučního jádra se dají předem vypočítat pro jednotlivé vzdálenosti referenčních bodů od středu matice konvoluce. Všechny vzdálenosti jsou dány jako násobek poměru rozmě- rů zdrojového a výstupního obrazu. Nabízí se urychlení výpočtu vytvořením tabulky hodnot (LUT), která by obcházela nutnost volání funkce weight(), která vnitřně provádí složité výpočty včetně umocňování, nebo dokonce goniometrických funkcí v případě Lanczosova filtru. Takové urychlení bylo do programu implementováno pomocí zavedenho pole vhodných struktur

typedef struct{ float distance; float value; }LUTItem; Ilustrace 6: Struktura prvku LUT

Funkce, která tabulku hodnot předem vyplní, se v případě vyžádání uživatelem zavolá ještě před zahájením průchodu obrazovým filtrem. Během přikládání vah na referenční body se už volá funkce, která pro vhodnou vzdálenost vrátí příslušnou hodnotu funkce interpolačního fil- tru.

27 Použití LUT s sebou přináší problém, že výpočet poměru mezi obrazy, popsaný v ilustraci 4, způsobuje nepřesnosti v číslech s plovoucí desetinnou čárkou. Skutečný poměr vstupu a výstu- pu a poměr spočítaný pro volbu nejbližšího souseda se proto mohou lišit. To způsobuje, že váhy mohou být pro každý vzorek vypočítány odlišně jen s nepatrnou odchylkou. Kvůli tomu může tabulka obsahovat příliš vysoký počet prvků, čímž se její využití stává neefektivním. Pokud uživatel zvolí optimalizaci kódu pomocí LUT, pak je za cenu chyb na okrajích rastru po- měr rozměrů obrazů spočítán jako

poměr = rozměrVstupu/rozměrVýstupu; Ilustrace 7: Poměr rozměrů vstupu a výstupu s užitím LUT

4.3.5 Hq2x Kód programu Hq2x byl převzat přímo z originálu, dostupného na [13]. Algoritmus samotný se skládá z • načtení čtvercové 3x3 matice uvažovaných hodnot vstupního obrazu • porovnání barev oproti stanovenému diferenčnímu limitu • aplikace vhodného dopočítání hrany podle zjištěného úhlu. Část kódu, jejíž úkol je načítat a porovnat data, je triviální. Důležitou částí je výběr interpola- ce podle úhlu hrany. Ten je řešen větvením programu na několika stovkách řádků. Jedná se o formu předem připravené tabulky, jejíž položky jsou pouze odkazem na funkci, která vhodně dopočítá bod hrany s respektem k zjištěnému úhlu. Proto bylo v praktické části práce zbytečné kód znovu programovat. První část kódu funkčně nepřináší žádnou novinku, druhá je předem připravená.

4.3.6 2xSaI Implementace algoritmu 2xSaI spočívala v očištění originálního kódu, dostupného na [17], od objemné knihovny Allegro (kap. 4.2) a knihovny farptr.h [28], která poskytuje možnost dlouhých skoků v paměti. Tyto dlouhé skoky nejsou některými překladači v základu podporová- ny, zvláště ve starších verzích systému Windows s jádrem systému DOS. Navíc algoritmus 2xSaI obsahuje hardwarové akcelerace MMX pro výpočet v plovoucí desetinné čárce. Aby byl kód přehlednější a zároveň hardwarově nezávislý, byly tyto optimalizace také odstraněny. Hlavním problémem zahrnutí kódu byla odlišná práce s pamětí. Allegro ukládá načtenou bi- tovou mapu do videopaměti na systémem definovanou adresu (nejčastěji 0x800xxxx) a dlouhý- mi skoky na tuto adresu přistupuje. Vzhledem ke zkušenostem s implementací předchozích algoritmů lze tyto operace nahradit prostým uložením obrazu v paměti počítače. Klíčovými funkcemi, které znemožňovaly použití funkce 2xSai v programu Scale, byly _farset- sel() a _farnspokel() z knihovny farptr.h. První jmenovaná nastavuje adresu na uložený obraz ve videopaměti, druhá ve stanoveném adresním prostoru do obrazu zapisuje. Adresa bitové mapy

28 ve videopaměti je obsažena ve struktuře, definované knihovnou Allegro (soubor include/- allegro/gfx.h, viz ilustraci 8).

typedef struct BITMAP /* a bitmap structure */ { int w, h; /* width and height in pixels */ int clip; /* flag if clipping is turned on */ int cl, cr, ct, cb; /* clip left, right, top and bottom values */ GFX_VTABLE *vtable; /* drawing functions */ void *write_bank; /* C func on some machines, asm on i386 */ void *read_bank; /* C func on some machines, asm on i386 */ void *dat; /* the memory we allocated for the bitmap */ unsigned long id; /* for identifying sub-bitmaps */ void *extra; /* points to a structure with more info */ int x_ofs; /* horizontal offset (for sub-bitmaps) */ int y_ofs; /* vertical offset (for sub-bitmaps) */ int seg; /* bitmap segment */ ZERO_SIZE_ARRAY(unsigned char *, line); } BITMAP;

#define BMP_ID_VIDEO 0x80000000 Ilustrace 8: Struktura BITMAP v knihovně Allegro

Nejdůležitějšími prvky jsou proměnné • w (šířka obrazu) • h (výška obrazu) • *dat (ukazatel na paměť alokovanou pro surová data obrazu) • seg V proměnné seg je uložena adresa obrazu uloženého ve videopaměti. Tato adresa je použita pro operaci dlouhého skoku. V programu Scale nemá využití, ale byla důležitá pro vypátrání činnosti funkce bmp_write_line(). Funkce bmp_write_line(), použitá v originálním kódu 2xSaI, je opět součástí Allegra a vrací adresu řádku bitové mapy, na kterém se do obrazu zapisuje. Funkci bylo možné nahradit pros- tým výpočtem v pointerové aritmetice (viz komentář v kódu). V závěru implementace je patrná práce s ukládáním barev do jednotlivých kanálů. Protože barvy jsou počítány v 16bitovém barevném rozlišení, není každá barevná složka ukládána zvlášť na jeden byte. Namísto toho jsou do výsledného obrazu zapsány 4 byty, z nichž první dva tvoří originální barvu referenčního pixelu, zbytek je interpolovaná hodnota (obraz je fixně transfor- mován na dvojnásobek velikosti originálu).

29 4.4 Použití programu Jak bylo řečeno v kapitole 4.3.1, program Scale je konzolovou aplikací. Ovládání v příkazové řádce je řešeno následovně:

scale algoritmus -i vstupni_soubor -o vystupni_soubor -lut Ilustrace 9: Použití programu Scale

Platí: • parametr -i a -o jsou následovány jednoslovným jménem vstupního a výstupního BMP souboru • parametr -lut aktivuje urychlení konvoluce pomocí LUT za cenu možných chyb v obraze oproti průchodu bez LUT • kromě parametrů vstupu a výstupu je umožněna jakákoliv permutace příkazů Jednotlivé metody interpolace jsou zadávány parametrem algoritmus, který může nabývat těchto hodnot: • nearest • bilinear • bicubic • lanczos • hq2x • 2xsai Při zadání chybných hodnot je vypsána programová nápověda. Příloha obsahuje připravený skript pro MS Windows (01_run.bat), po jehož spuštění je prove- dena transformace zvětšením pomocí všech popsaných metod, a to na souborech, které se vy- skytují ve složce se skriptem. Výsledek škálování je jednak textový soubor s vypsaným průběhem a příslušnými časy aplikace filtrů (02_log.txt), dále pak množina obrázků, které jsou uloženy v té samé složce a jsou patřičně pojmenovány podle použité metody zvětšení. Použití skriptu je jednoduché, ale omezené. Zejména kvůli omezením ve skriptování v systému Windows není dávkový soubor ošetřen vůči chybám. Jmenovitě pak lze skript spustit bez kont- roly, zda už na přítomných souborech operace nebyla provedena.

30 5 Výsledky

5.1 Výstupy Výsledkem průchodu obrazu programem je transformovaný rastr. Vzhledem k tomu, že algo- ritmy Hq2x a 2xSaI jsou schopné obraz pouze zvětšit, a to jen na dvojnásobek v každé ose, byly zbylé metody rovněž fixovány na tuto transformaci, aby byla zachována názornost práce jednotlivých interpolací. Program je možné o další funkcionalitu jednoduše rozšířit. Toto ale není prioritou této práce. Veškeré obrazy, které byly použity pro testování programu, jsou obsaženy v příloze (kap. 11). Jedná se o výběr obrazů typických pro aplikaci popsaných filtrů. Na vzorku je možné identifi- kovat klady a zápory metod a doporučit tak jejich použití v daných případech. Pro demonstrativní a statistické účely je doba procesu transformace měřena a vypsána do vý- stupu v příkazové řádce. Tyto údaje se rovněž promítají do hodnocení způsobu použití všech postupů.

5.2 Metoda měření, testovací sestava Rychlost aplikace interpolačních metod byla měřena v hlavním programu scale.cpp. Pro dostatečně přesné měření bylo využito standardní knihovny time.h, která obsahuje funkci clo- ck(). Tato funkce vrací dobu běhu vlákna programu. Jelikož program Scale je napsán jako jednovláknová aplikace (běží vždy na jednom jádře procesoru, a to i vícevláknového), lze se na zmíněnou funkci relativně spolehnout. Čas byl měřen od chvíle těsně před aplikací filtru po její dokončení. Doba běhu vlákna je měřena v ticích procesoru, a proto je nutné tyto jednotky převést na požadované milisekundy, čímž lze dosáhnout vydělením hodnoty, získané funkcí clock(), kon- stantou nejvyšších možných tiků procesoru (obsažena rovněž v time.h). Tato konstanta se ale liší s použitým systémem nebo hardware.

Testovací sestava Běh programu a testy byly provozovány na následujícím počítači: • procesor AMD Athlon II X3 450 (takt 3200 Mhz) • operační paměť RAM 4 GB DDR3 (takt 1333 Mhz, časování 9.0-9-9-24) • základní deska MSI 870-C45 (čipová sada AMD 770) • pevný disk Western Digital WD5000AAKX • operační systém 7 Professional x64 SP1 (build 7601) • kompilátor MinGW GCC verze 4.6.1

31 5.3 Rychlost algoritmů, užití Algoritmy byly testovány na sadě BMP souborů, které jsou obsaženy na přiloženém CD. Ob- raz s tématikou mikroskopie (cell.bmp) pochází z Internetu [29]. Soubory Pixel art byly pořízeny z počítačových her (Eye of the Beholder [30]) nebo byly přiloženy k originálnímu kódu 2xSaI [17]. Soubor Anette.bmp je koncept ze hry Resident Evil 2 [31]. Zbylé soubory jsou vlastní tvor- by. Obrazy byly vybrány vzhledem ke svým charakteristikám, aby testovaly chování apli- kovaných metod interpolace. Názvy souborů a vlastnosti obrazů uvádí následující tabulka:

Soubor Popis Anette.bmp Vzorek kreslené tvorby s velkými barevnými plochami cell.bmp Fotografie z mikroskopu colorfield.bmp Demonstruje dopočítávání barev při interpolaci DSCN0601.bmp Fotografie s velkými morfologickými celky eye_of_the_beholder.bmp Výňatek ze hry Eye Of The Beholder, charakterizuje Pixel Art face.bmp Obsahuje přesné, ostré linky a jasně definované hrany gradient.bmp Demonstruje zacházení s přechody barev P6222812.bmp Fotografie s vysokou morfologickou členitostí pixart.bmp [17] Pixel art obraz, sloužící k testům při vývoji programu Scale text.bmp Demonstruje zacházení interpolátorů s hranami v textu

Tabulka 1: Seznam testovacích obrazových souborů

5.3.1 Naměřené časy Na každý soubor byly aplikovány všechny druhy interpolačních metod, a to pokaždé třikrát. Vzhledem k tomu, že program Scale je napsán jako jednovláknová aplikace, naměřené časy se lišily v řádu jednotek milisekund. Dobu běhu programu ovlivňoval prakticky pouze samotný operační systém, který přiděloval systémové prostředky. Doba aplikace filtru samozřejmě závisí na použitém hardware a na jiném počítači se může lišit. V příloze na CD (kap. 11) se nacházejí výpisy z tří provedených testů. Obsahují časy naměřené během aplikace interpolačních metod na každý soubor. Získané hodnoty v milisekundách shrnuje Tabulka 2. Nulové hodnoty jsou důsledkem nízkého rozlišení časového měřiče (kap. 5.2).

32 soubor/metoda nearest bilinear bicubic bicubic LUT lanczos lanczos LUT hq2x 2xSai

31 31 921 218 3359 546 15 0 anette.bmp 28 20 903 237 3335 558 10 3 30 20 890 125 3342 548 8 3 průměr 29,67 23,67 904,67 193,33 3 345,33 550,67 11,00 2,00

15 10 458 113 1720 278 5 3 cell.bmp 15 10 455 125 1720 278 5 0 15 10 455 118 1710 280 5 3 průměr 15,00 10,00 456,00 118,67 1 716,67 278,67 5,00 2,00

0 0 0 0 0 0 0 0 colorfield.bmp 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 průměr 0,00 0,00 0,00 0,00 0,00 0,00 0,00 0,00

94 78 3354 874 11871 1993 47 0 DSCN0601.bmp 105 68 3230 827 11845 1965 50 12 105 68 3195 795 11790 1957 50 10 průměr 101,33 71,33 3 259,67 832,00 11 835,33 1 971,67 49,00 7,33

15 16 592 140 2215 359 15 0 eye_of_the_beh older.bmp 20 12 585 153 2162 355 8 3 20 13 580 150 2145 358 8 3 průměr 18,33 13,67 585,67 147,67 2 174,00 357,33 10,33 2,00

141 94 4492 1170 16591 2780 28 15 face.bmp 145 97 4455 1165 16560 2757 27 8 147 95 4447 1147 16568 2765 30 7 průměr 144,33 95,33 4 464,67 1 160,67 16 573,00 2 767,33 28,33 10,00

78 46 2122 534 7787 1331 0 0 gradient.bmp 70 45 2110 547 7802 1297 15 5 70 45 2108 540 7798 1293 15 3 průměr 72,67 45,33 2 113,33 540,33 7 795,67 1 307,00 10,00 2,67

62 47 1887 468 6749 1154 46 0 P6222812.bmp 57 40 1805 450 6650 1105 35 5 57 40 1798 463 6668 1105 35 5 průměr 58,67 42,33 1 830,00 460,33 6 689,00 1 121,33 38,67 3,33

16 15 546 171 2021 328 15 0 pixart.bmp 18 10 525 130 1932 310 5 3 17 13 525 133 1937 315 8 0 průměr 17,00 12,67 532,00 144,67 1 963,33 317,67 9,33 1,00

16 15 499 151 1887 296 0 0 text.bmp 18 10 508 125 1845 305 3 0 15 10 500 130 1848 300 3 0 průměr 16,33 11,67 502,33 135,33 1 860,00 300,33 2,00 0,00 Tabulka 2: Časy aplikace interpolací v milisekundách

33 5.3.2 Užití algoritmů Přestože jsou ve výstupních souborech pouhým okem patrné rozdíly v zacházení in- terpolačních metod s rastrem, nebyly obrazy zahrnuty do tištěné přílohy práce. Omezený ba- revný prostor tisku znemožňuje pozorování některých změn a nepravidelností v barvách, způsobuje rozpití hran apod. Zejména jemné barevné přechody jsou lépe pozorovatelné pouze na obrazovce. Kvantizace barev při tisku by zapříčinila neobjektivní náhled. Vhodnost užití každého interpolačního algoritmu je patrná z porovnání výstupních souborů a je diskutována níže.

Nearest neighbour Po aplikaci tohoto filtru jsou v obrazech viditelné hrany, rozpixelování, „kostičky“. Z toho dů- vodu nachází opodstatnění pouze vzhledem k naměřeným časům, které ale přesto nejsou nižší než některé jiné. Kromě souboru gradient.bmp není jinde zaznamenáno vhodné zacházení s ob- razem.

Bilineární interpolace Bilineární interpolace prokázala vhodnost použití ve většině obrazů za přijatelnou cenu. Kva- litativně se přibližuje kubickému filtru, nezvýrazňuje hrany, ale naopak je rozpíjí. Nejlépe pracuje s jemnými barevnými přechody.

Kubická interpolace a Lanczosův filtr Vhodnost použití kubické interpolace je patrná u fotografií, kde zachovává hrany (které zvý- razňuje) a rozmazává větší morfologické celky. Naopak u Pixel art grafiky je takové zvýraznění evidentní a nežádoucí. Na rozdíl od bilineárního filtru hůře zachází s jemnými gradienty. Lanczo- sův filtr v porovnání s kubickou interpolací nepřináší žádné výrazné vylepšení. U pixel art grafiky méně zvýrazňuje hrany.

Hq2x a 2xSaI Pixel art algoritmy nejsou vhodné pro aplikaci na fotografie, kde zvýrazňují hrany menších morfologických celků. Rovněž si nedokáží poradit s hranami s nízkými sklony, a tím způsobují alias. Dobře však zachází se soubory s pixel art grafikou, pro kterou byly navrhovány. Zejména pak vyhlazují texty a písma v takových obrazech. 2xSaI oproti Hq2x dobře vyhlazuje ostré hrany, ale způsobuje ztrátu některých detailů. Hq2x lépe reflektuje oblasti s malými rozdíly v barvě.

34 5.4 Plány, budoucí vývoj

5.4.1 Program Scale V současnosti je program Scale naprogramován čistě jako konzolová aplikace a je závislý na jediné platformě. Nabízí se proto využití takových prostředků a knihoven, které umožní kompi- laci programu nezávisle na použitém operačním systému, a to s minimálními nutnými úprava- mi. Dále je žádoucí v programu zpřístupnit transformace obrazu zvětšováním v libovolném poměru stran (alespoň u některých algoritmů, viz kap. 2.4). I přes jednoduchost nutných úprav toto nebylo dosud implementováno, protože to nepatřilo mezi plánované požadavky. Rovněž není dále nutné fixovat podporu obrazových dat pouze na formát BMP. Program je vhodné opatřit i grafickým rozhraním, které by ulehčovalo práci s aplikací algorit- mů a manipulaci se soubory. Především je žádoucí dynamické zobrazení průchodem filtry tak, aby byly evidentní změny transformovaného obrazu oproti originálu. Uvedené změny by v budoucnu mohly program zatraktivnit, a tím i napomoci ho rozšířit mezi širokou veřejností, především v internetové komunitě.

5.4.2 Interpolační metody Existují metody interpolace, které nebyly v této práci dosud diskutovány. Mezi nimi jsou i de- riváty těch, které byly uvedeny. Na okraji pak existují metody, které jsou ale jednak příliš nové a neprověřené (např. nový patent firmy IBM [32]) , než aby byly nasazené v praktickém využití. Za druhé i přes svou složitost implementace a teorie v pozadí nepodávají takové výsledky, aby se dočkaly valného rozšíření. Zejména se jedná o fraktálovou interpolaci [33], kterou lze využít jen v malém počtu drahých profesionálních programů. Implementace takových metod bez předchozích znalostí nebo použití kódu třetích stran vyža- duje dlouhodobější studie, které se mohou stát tématem pro další práci. Nicméně rozšíření vy- pracovaného programu o tyto druhy interpolace by jej odlišilo od současných aplikací, které lze volně získat.

35 6 Závěr Možnost transformovat rozlišení rastru je požadavek kladený na většinu manipulací s digi- tálním obrazem. V současné technice je taková operace nepostradatelná a člověk se s ní denně setkává i bez jeho vědomí. V této práci byly shrnuty nejpoužívanější metody, které tyto trans- formace provádějí, a to jak jejich teoretické pozadí, tak konkrétní prvky implementace. Vzhle- dem k rozdílům v postupech byly zhodnoceny způsoby jejich použití, vhodnost pro konkrétní případy, jejich vady a přednosti. Před samotnými popisy všech uvedených metod bylo nutné se seznámit se základy zpra- cování digitálního obrazu. Především se jedná o teorii vzorkování, reprezentace vizuálních dat ve výpočetní technice a o matematické podklady pro interpolaci. V jádru samotné práce byly shrnuty běžné metody transformace obrazu, jejich podstata a účel. Popisy byly formulovány tak, aby byly přínosem jak programátorům, kteří by chtěli me- tody implementovat, tak studentům, již hledají základní informace o problematice škálování. Hlavním důvodem sepsání práce bylo seznámit veřejnost i s alternativními, úzkou komunitou často používanými metodami interpolace. Právě Pixel art algoritmy byly původním impulsem k vybrání tohoto tématu. Nicméně právě uzavřenost tématického okruhu vnesla problém, že údaje o těchto algoritmech poskytovali pouze sami autoři algoritmů na jejich stránkách, které nebyly dlouho aktualizovány. Bylo tak nutné se samostatně seznámit s kódem funkcí a jejich principy. Text práce byl pak psán zároveň jako dokumentace těchto a zbylých interpolačních metod. Za největší přínos je považován doprovodný program, který umožňuje jednoduše aplikovat dvojnásobné zvětšení obrazu na vstupní rastry. Výhodou je malá velikost programu, který kont- ruje objemným aplikacím, běžně dostupným na webu, ale příliš složitým pro laickou veřejnost. Na dodaném programu pak byly otestovány vzorové obrazy, které mohou sloužit jako reference pro výběr vhodné metody. Uživatel se může řídit při výběru vhodného algoritmu buď vlastním estetickým cítěním, nebo v případě omezení výpočetní síly i rychlostí algoritmu, kterou lze vyčíst z tabulky 2.

36 7 Seznam ilustrací Ilustrace 1: Interpolace ve dvou rozměrech...... 12 Ilustrace 2: Srovnání nearest neighbour a bilineární interpolace...... 14 Ilustrace 3: Výňatek ze hry Final Fantasy III pro NES [9]...... 18 Ilustrace 4: Poměr rozměrů vstupu a výstupu...... 26 Ilustrace 5: Funkce pro interpolaci konvolucí...... 26 Ilustrace 6: Struktura prvku LUT...... 27 Ilustrace 7: Poměr rozměrů vstupu a výstupu s užitím LUT...... 28 Ilustrace 8: Struktura BITMAP v knihovně Allegro...... 29 Ilustrace 9: Použití programu Scale...... 30

37 8 Seznam tabulek Tabulka 1: Seznam testovacích obrazových souborů...... 32 Tabulka 2: Časy aplikace interpolací v milisekundách...... 33

38 9 Seznam zkratek

GUI Graphical User Interface 2D 2 Dimensional NES Entertainment systém SNES Super Nintendo Entertainment systém SMS Sega Master systém MMX Multimedia Extension Hq2x High Quality 2x Magnification 2xSaI 2x Scale and Interpolation LUT Look-up Table BMP BitMaP DIB Device Independent Bitmap CDT C Development Tools IDE Integrated Development Environment TGA TARGA, Truevision Advanced Raster Graphics Adapter DOS Disk

39 10 Literatura

[1] Žára, Jiří, Beneš, Bedřich, Sochor, Jiří a spol.. Moderní počítačová grafika. 2. vydání. Computer Press. 2010. 80-251-0454-0. [2] BURGER, Wilhelm, BURGE, Mark J.. Principles of digital image processing: Core algorithms. 1st Edition. 2009. 978-1-84800-194-7. [3] WALNUM, Clayton. Programujeme grafiku v Microsoft Direct3D. První vydání. Computer Press. 2004. 80-251-0136-3. [4] Khronos Group. OpenGL 4.2 Quick reference guide. Rev. 0711. 2011. [5] WEAWER, Warren, SHANNON, Claude E. The mathematical theory of communication. University of Illinois Press. 1963. [6] KIMBALL, Spencer, MATTIS, Peter aj. GIMP - GNU Image Manipulation Program [počítačový program, online]. Verze v. 2.6.12. 2008. http://downloads.sourceforge.net/gimp-win/gimp- 2.6.12-i686-setup-2.exe [7] SKILJAN, Irfan. IrfanView [počítačový program]. Verze v. 4.32. 2012. http://www.irfanview.com/ [8] TIKHOMIROV, Yuri. The Intel® AVX Realization of Lanczos interpolation in Intel® IPP 2D Resize Transform [online]. 2010. http://software.intel.com/en-us/articles/the-intel-avx- realization-of-lanczos-interpolation-in-intel-ipp-2d-resize-transform/ [9] SAKAGUCHI, Hironobu. Final Fantasy III [počítačový program]. Square. 1990. [10] Deviant Art community. Deviant Art - Pixel Art [online]. 2012. http://browse.deviantart.com/digitalart/pixelart/ [11] GOG.com. Good Old Games. 2012. http://www.gog.com/ [12] Xenowhirl. RotSprite [počítačový program]. Verze v1.0. 2009. http://info.sonicretro.org/images/c/cc/Rotsprite.7z [13] STEPIN, Maxim. hq4x Magnification Filter [online]. 2003. http://web.archive.org/web/20080215211402/http://www.hiend3d.com/hq4x.html [14] GNU community. LGPL license [online]. 1999. http://www.gnu.org/licenses/old- licenses/lgpl-2.1.html [15] ZEROMUS, RHEINY aj. FCEUX: Nintendo NES [počítačový program]. Verze 2.1.5. 2006. http://www.fceux.com/web/home.html [16] VEENSTRA, Peter. Dosbox [počítačový program]. Verze v0.74. 2002. www.dosbox.com

40 [17] KIE FA, Derek Liauw. 2xSaI: The advanced 2x Scale and Interpolation engine [online]. 1999- 2001. http://vdnoort.home.xs4all.nl/emulation/2xsai/ [18] JOSEY, Andrew. POSIX® 1003.1 Frequently Asked Questions [online]. 2011. [cit. 2012-5-6]. http://www.opengroup.org/austin/papers/posix_faq.html [19] Microsoft Corp. DIBs and their uses [online]. 1992. [cit. 2012-5-4]. http://support.microsoft.com/kb/q81498/ [20] Independent JPEG Group. JPEG FAQ [online]. 2012. [cit. 2012-5-6]. http://www.ijg.org/ [21] Eclipse Foundation. About the Eclipse Foundation [online]. 2012. www.eclipse.org/org/ [22] MinGW.org. Home of the MinGW and MSYS Projects [online]. 2012. [cit. 2012-5-6]. http://mingw.org/Welcome_to_MinGW_org [23] HARGREAVES, Shawn. Allegro - A game programming library: License [online]. 2010. [cit. 2012-5-6]. http://alleg.sourceforge.net/license.html [24] SDL community. SDL, Simple Directmedia Layer [online]. 2012. http://www.libsdl.org [25] ImageMagick Studio LLC. ImageMagick License [online]. 2012. [cit. 2012-5-6]. http://www.imagemagick.org/script/license.php [26] Tech-Algorithm community. Image Processing [online]. 2007. [cit. 2012-5-6]. http://tech- algorithm.com/index.php?category=3 [27] IEEE Association. IEEE 754: Standard for Binary Floating-Point Arithmetic [online]. 2012. http://grouper.ieee.org/groups/754/ [28] GNECCO, Bruno Barberi. Guide: Far Pointer Intro [online]. 2012. [cit. 2012-5-8]. http://www.delorie.com/djgpp/doc/ug/dpmi/farptr-intro.html [29] MELTON, Douglas, EGGAN, Kevin. Somatic cell nuclear transfer [online]. 2008. http://wn.com/somatic [30] Westwood studios. Eye of the Beholder [počítačový program]. 1991. [31] KAMIYA, Hideki. Resident Evil 2 [počítačový program]. Capcom. 1998. [32] PERRY, Douglas. IBM Files Patent to Resize Images Without Artifacts [online]. 2012. http://www.tomshardware.com/news/ibm-patent-image-resize-quality,15472.html [33] ZELINKA, Ivan. Aplikovaná informatika aneb úvod do fraktální geometrie. 1999.

41 11 Příloha Přiložený kompaktní disk obsahuje následující: • text práce v PDF a editovatelném ODT formátu • složku Source s přeložitelnými zdrojovými kódy • složku Test Ready s připraveným skriptem pro testování na přiložených obrazech • složky s třemi proběhlými testy a výstupními soubory (záznam, bitmapy) • složka Pixart Original s originálními, staženými zdrojovými kódy Pixel art algoritmů

42