arckép

Neuwirth István

programtervező informatikus MSc – ELTE

Computational and Software Techniques MSc – Cranfield, UK

Elérhetőség
pitta2@gmail.com
+36 30 329 3039

Valid XHTML 1.0 Transitional

Valid CSS!

Képek torzítása

Látványos torzítások létrehozása egyszerűen. Csavarás, hullámzás, mint a Photoshopban.

distort filtersA legutóbbi cikk konvolúciós mátrixon alapuló szűrőkről szólt. Jelen cikkben egy másik módszert mutatok látványos hatások létrehozására: megcsavarhatjuk, összegyűrhetjük a képet, vagy akár nagyítólencse alá vehetünk részleteket.

Az alapötlet az, hogy a szűrű eredménye az eredeti kép pixeleinek áthelyezésével adódjon. Legyen ƒ:A×B→C×D, ahol A=[0..w-1], D=[0..h-1], A=C∩N0 és B=D∩N0 (w a kép szélessége, h a kép magassága pixelekben). Továbba igaz, hogy ∀x∈A×B:I'(x)=I(ƒ(x)). Ez annyit jelent, hogy van egy függvényünk, mely meghatározza, hogy az eredményként kapott kép (I') pixel színe melyik – az eredeti képen (I) található – pixel(ek) színével egyezzen meg. A függvény értékkészlete nem véletlenül R×R-es: ha például egy nagyítólencsét szimuláló szűrőt készítünk, a hatás közepénél a széthúzódó kép pixeles lesz, hacsak nem használunk valamilyen mintavételező eljárást (többnyire bilinear, bicubic szűrők). A másik minőségjavító lehetőség a túlmintavételezés, amely során több érték középértéke lesz a tényleges szín (lásd példakód).

Következzen pár példa: ƒ1(x,y)=(w-1-x,y) vízszintesen tükrözi a képet, ƒ2(x,y)=(x,y+sin(x/L)) hullámokat generál, ƒ3(x,y)=(x/10,y/10) tízszeresére nagyítja a kép bal felső sarkát.

Ügyelni kell arra, hogy miként viselkedjen a szűrő, ha a függvény olyan koordinátapárt ad vissza, amelyhez nem tartozik képpont. Általában ilyenkor vagy választunk egy konkrét színt (például feketét), vagy a kép széleit megismételjük, vagy pedig „körbefolyatjuk” a képet (wrap around), azaz például a kép jobb szélén túl a kép bal oldala lesz.

A szűrők implementálásához nemmenedzselt (unsafe) kód írása javasolt, tekintve, hogy egyszerűbb szűrők esetén az optimalizált unsafe és a keretrendszer osztályait használó menedzselt kód futási ideje között több, mint százszoros (!) különbség is lehet.

Helyszűke miatt példakód, illetve különböző torzító szűrők megvalósítása innen elérhető.