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!

Motion blur

Kép egyirányú elmosódásának gyors kiszámolása.

motion blurA mostani cikkben egy összetettebb szűrőt mutatok be, amely segítségével egy kép adott irányban történő bemozdítását hajthatjuk végre. Ez egyike a képszerkesztő programokban előforduló, kamera gyors mozgása által létrejövő hatást szimuláló szűrőknek (Motion blur, Radial blur, Zoom blur).

Az elmosást létrehozó szűrők működési elve az, hogy az eredményül kapott kép pixeleinek színét a környezetükben lévő többi pixel valahogyan súlyozott középértéke határozza meg. Jelen esetben egy „szakasz” mentén előforduló pixelek számtani közepét vesszük, amely szakasznak a kiszámolandó pixel a középpontja, a végigjárását pedig Bresenham algoritmussal végezzük. A Bresenham algoritmus nagyon gyors vonalrajzoló eljárás, ugyanis nem használ lebegőpontos számítást, de még egészekkel való szorzást és osztást sem. (Az egy helyen előforduló kettővel való szorzás egy SHL művelettel helyettesíthető.) Így a szűrő n pixelből álló kép és l pixelhosszú szakasz esetén O(nl) számításigényű. Ez egy kis trükkel jelentősen javítható.

Tekintsük a szűrő egy speciális esetét, amikor vízszintes elmosást hoz létre. Példaként vegyünk egy sort. Ekkor egy sor csak a benne előforduló pixelek színétől függ, a többi sort tehát elhagyhatjuk. Két képpont színe (intenzitása) között összefüggés áll fenn (l=5):

p_{5}l={\displaystyle \sum_{i=3}^{7}a_{i}}={\displaystyle \sum_{i=2}^{6}(a_{i})}-a_{2}+a_{7}=p_{4}l-a_{2}+a_{7}

Látható, hogy szükségtelen az összegeket minden esetben újraszámolni, hiszen egy újabb összeg az előzőből egy kivonás és egy összeadás után megkapható. Ha eltekintünk a kezdőösszegek kiszámításától, akkor O(n)-re javítottok az algoritmusunkat, azaz gyakorlatilag a futásidő független az elmosás mértékétől!

array sample

A feladat általánosítható (és ennek eredményeképp kevésbé optimalizálható) a következőképp: a fentiekben minden átlagot ugyanazon vektor alapján számoltunk, most ez legyen egy úgynevezett velocity map alapján meghatározva, amely gyakorlatilag egy másik kép, amely objektumok mozgásáról tárol információt. Egy 3D-s animáció készítésénél bevett szokás, hogy a tényleges kép mellé egyéb információkat tartalmazó képek kerülnek renderelésre, így a későbbiekben a képkocka újraszámolása nélkül változtathatók meg például fényviszonyok, kamerahatások, így a mozgási elmosódás (motion blur) is.

A szűrő egy implementációja innen letölthető.