Képek elforgatása

Baromi jó poszt a képek elforgatásáról, a régi demoscene programozási időket juttatja eszembe. Van egy képünk (ha úgy tetszik, egy tömb) és ezt szeretnénk valahány fokkal elforgatva kirajzolni. Ha a pontokat vesszük egyesével, könnyedén megtehetjük a lineáris algebrából ismerős képlettel:

De itt jön a poén: ha a tömböt átforgatjuk ezzel, akkor lyukacsos képeket kapunk, mert nem feltétlen esik minden pixel az elforgatásban is a megfelelő helyre, hiszen raszteres képeink vannak (több pixel eshet a kerekítés miatt ugyanoda és ezzel lyukak válnak láthatóvá).

Ennek kivédésére több eljárás is szolgál, a legegyszerűbb az, hogy “túlmintavételezzük” (oversample) az eredeti képet. Ez csak azt jelenti, hogy minden képpontról azt feltételezzük, hogy valójában például 2×2 képpontból áll és minden egyes képpontra végrehajtjuk az eljárást (értelemszerűen ez jóval több számolást eredményez). A másik, ha fordítva gondolkodunk: az elforgatott kép pixelein megyünk végig és azt próbáljuk megállapítani, hogy egy adott képpont a forgatást megelőzően honnan jött. (Hiszen akkor nem lehet lyukas a kép, ha minden képpontot egyesével megnézünk.)

Van egy harmadik, nagyon ötletes megoldás is. Lineáris algebrából felírható a forgatás három mátrixművelet szorzataként:

Ez pedig nem más, mint három, ún. shear matrix (nyírás – thx Sz. Bertalan!), illetve Photoshopban skew-nek ismert művelet, ahol csak az egyik tengelyt döntjük meg. Egy forgatás gyakorlatilag azonos egy horizontális irányban fele annyival eldöntött, vertikálisan irányban ugyanannyi fokkal eldöntött, majd ismét horizontálisan fele annyival eldöntött művelettel. Ki is próbáltam Photoshopban, íme. A képet 27 fokban akarom balra forgatni.

Eredeti kép:

1. lépés – horizontal skew 13,5 fok

2. lépés – vertical skew -27 fok

3. lépés – horizontal skew 13,5 fok

Nagyon cool.