Az alábbi tanulmány digitális, „nyers” képmodulációs eljárásokból fakadó hibákat mutat be. A hétköznapi felhasználó, illetve a képszerkesztő programokat használók számára a felsorolt hibák rejtve maradhatnak, hiszen a célszoftverek kezelik az előidézésükért felelős helyzeteket.
A túlcsordulás meglévő médiumon alkalmazható effektusként vagy akár új médium létrehozásához is használható. Ez az egyszerű hibajelenség a digitális technika, tehát a kvantált, illetve a korlátos értékkészletű jelek világának velejárója.
Cikkünk kifejezetten a vizuális média területén mint alkalmazott effektus foglalkozik a túlcsordulás lehetőségével.
Általános koncepció
Az alább bemutatott módszerek a szoftverfejlesztésben ismert fogalom, a túlcsordulás köré épülnek. A túlcsordulás annyit tesz, hogy adott értéktípus tárolására alkalmazott memóriaterületbe a változótípus szempontjából értelmezhető értékek intervallumán túlmutató érték kerül beírásra, így a memóriaterület „túlcsordulással” a beírni kívánt érték helyett egy, az említett intervallumon belül eső értéket fog tartalmazni. A túlcsordulás determinisztikus, így semmiképpen sem kapható véletlenszerű érték. Hasonlóan a régebbi gépjárművek kilométerórájához vagy az analóg gázórákhoz, ahogyan a számláló meghaladja a legnagyobb ábrázolható értéket (például 9999,99 m3), a legalacsonyabb értéktől folytatja a számlálást, amely mindkét példa esetében zérus értéket jelent. A bemutatott effektusok esetében is előjel nélküli, csak zérus és pozitív értékek körében fogunk tudni mozogni. Túlcsordulás természetesen előjeles és akár tört értékek esetében is előfordulnak.
A tárgyalt színterek tekintetében (RGB, BGR, HSV, HSL) mind előjel nélküli számokkal ábrázoljuk az egyes képpontok színét vagy intenzitását. Emellett bármely színcsatorna intenzitása 8 biten ábrázolt, azaz 0 és 255 közötti értéket vehet fel.
Az 1. ábrán kevert színek esetében a három színcsatorna (piros, zöld, kék) az említett módon, képpontonként 8 biten tárolja az intenzitására vonatkozó adatot. Tehát az 1. ábra piros mezőjében a piros csatorna 255, a kék és zöld csatorna 0 intenzitású. A sárga mezőben a piros és zöld csatorna egyaránt 255, a kék továbbra is 0 intenzitású. Az alábbi ábrákon látható, hogy a fentieknek megfelelően hogyan változik a további mezőkben a különböző csatornák intenzitása.
1–8. ábra
- 1.: 3×3-as paletta
- 2.: Az 1. ábra kék csatornájának intenzitása
- 3.: Az 1. ábra piros csatornájának intenzitása
- 4.: Az 1. ábra zöld csatornájának intenzitása
- 5.: Egyszerű színátmenet
- 6.: Az 5. ábra kék csatornájának intenzitása
- 7.: Az 5. ábra zöld csatornájának intenzitása
- 8.: Az 5. ábra piros csatornájának intenzitása
Mint a fenti példákon látható, BGR (illetve RGB) színtérben a különböző csatornák intenzitásának tárolásával adható meg egy színes kép.
A túlcsordulás szemléltetéséhez az 1. ábrán látható kép minden csatornájának értékét 1-gyel, illetve 128-cal (az ábrázolható legnagyobb érték felével) növeljük.
A 9. ábrán, miután 1-gyel növeljük a csatornák értékeit, jól láthatóan eltűntek a színek, csak az alsó sor középső mezője maradt feketétől eltérő. Valójában kevésbé kivehető, de a mezők nem mind azonosan feketék. Vegyük példának az 1. ábra bal alsó mezőjét, amelyben minden csatorna értéke zérus volt. Jelenleg minden csatorna értéke 1. Ugyanakkor a számlálók és a gázóra korábbi analógiájából ismert működésből kifolyólag az 1. ábra jobb alsó sarkában lévő mező korábbi, mindhárom csatornán azonosan 255-ös értéke most mind zérus. A korábban színes mezők esetén is hasonló dolog történt, így ott is 0 vagy 1 a mezők csatornáinak értéke, amelyet a szemünk nem tud megkülönböztetni. Az alsó sor középső mezője továbbra is szürke. Itt a csatornák értéke azonosan 128 volt, 129 lett.
9–10. ábra
- 9.: Az 1. ábra 1-gyel inkrementálva
- 10.: Az 1. ábrán látható kép 128-cal inkrementálva
- 11.: Az 5. ábra 1-gyel inkrementálva
- 12.: A 11. ábra zöld csatornájának intenzitása
- 13.: A 7. ábrán látható színátmenetes kép csatornáinak 128-cal való inkrementálása
- 14.: A 7. ábra csatornái 2-vel szorozva
- 15.: A 7. ábra csatornái 5-tel szorozva
- 16.: A 7. ábra csatornái 10-zel szorozva
A 10. ábrán 128-at adtunk minden csatorna értékéhez, amely a 9. ábrához hasonlóan túlcsordult. Tekintve, hogy eredetileg igen távoli értékeket adtunk a csatornáknak (0 és 255), bármilyen inkrementációval (kivéve 255 egész számú többszöröseivel) túlcsorgatva az intenzitási különbség köztük 1 lesz, így csak különböző árnyalatú szürkéket kapunk a korábbi színek helyett.
Látványosabb a csatornák túlcsordulása akkor, ha a képen több, különböző árnyalat látható. A 11. ábrán az 5. ábra színátmenetes képének minden csatornájához 1-et adva a korábbi maximális intenzitást csökkentettük zérusra, minden egyebet 1-gyel inkrementáltunk. Jól látható az 5. ábrához képest, hogy a bal felső sarokban teljes intenzitású kék szín eltűnt, és előkerült a zöld. A jobb felső sarok és a bal alsó sarok közötti egyenes mentén a zöld korábban maximális intenzitással volt jelen, most teret adott a kék és piros csatornáknak. Hasonlóan az 5. ábra jobb alsó sarkában a teljes intenzitású piros eltűnt. A 12. ábrán a zöld csatorna intenzitása látható, amely a 7. ábra 1-gyel inkrementált változatával azonos.
Az eddigi túlcsordulásos példákban kizárólag inkrementálással szemléltettük a tárgyalt effektust, azonban egyéb lehetőségek is vannak. A négy algebrai alapművelet közül kizárólag az osztás nem jár túlcsordulással. Tehát van lehetőség a csatornák értékének negatív irányba való eltolásával túlcsordulást előidézni.
17. ábra: A 7. ábra csatornái négyzetre emelve
A 18-24. ábrákon bemutatott példa alapján már megállapítható, hogy adott régiókban minél nagyobb a kontraszt a különböző csatornák között, azok minél nagyobb mértékű eltolása zajosabbá teszi a képet. Valójában az adott régióban lévő különbségeket nyújtaná el, azonban a túlcsordulás miatt a korábbi különbségek már nehezen azonosíthatók.
18. ábra: Nave de Terenas, Madrid, 2019, január
19–24. ábra
- 19.: A 18. ábra csatornái eltolva 1-gyel
- 20.: A 18. ábra csatornái eltolva 128-cal
- 21.: A 18. ábra csatornáinak kétszeres szorzata
- 22.: A 18. ábra csatornáinak ötszörös szorzata
- 23.: A 18. ábra csatornáinak tízszeres szorzata
- 24.: A 18. ábra csatornáinak négyzetre emelése
Algebrai függvényeken túl definiálhatunk transzcendens függvényeket is. Példának okáért trigonometrikus függvények alkalmazásán keresztül mutatjuk be a transzcendens függvények működését. Transzcendens függvényeknek azon függvényeket nevezzük, amelyek nem írhatók fel az alábbi, kétváltozós képlettel:
A fenti képlet az algebrai függvényeket írja le. Transzcendens függvény minden olyan függvény, amely nem algebrai függvény, így a trigonometrikus, exponenciális, hiperbolikus, logaritmus stb. függvények transzcendens függvények.
A csatornák értékeit a 0 és 360-as intervallumra leképezve, szögeknek megfeleltetve átadjuk a trigonometrikus függvényeknek. Ezen függvények negatív előjelű eredménye ugyancsak túlcsordulást okoz, ami hasonló effektust eredményez, mint a korábbi példákban bemutatott esetek.
25–28. ábra
- 25.: Elektronikus zenei eszközök, Madrid, ICLC, 2019
- 26.: A 25. ábra képe koszinusz függvény alkalmazásával
- 27.: A 25. ábra képe szinusz függvény alkalmazásával
- 28.: A 25. ábra képe tangens függvény alkalmazásával
Karakterisztikák
A fenti példákban bemutatott túlcsordulásos módszerek további szemléltetéséhez a különböző átviteli karakterisztikák, különböző csatornák intenzitására vonatkozóan az alábbiak szerint alakulnak. Minden ábracsoporton bal oldalt a bemeneti intenzitás lineáris függvénye (végig azonos), jobb oldalt az átviteli függvény válasza látható. Egyszerűbben megfogalmazva, a 0 és 255 intervallumra eső értékeknek az átviteli függvény a kimenetén jelentkező értékeket felelteti meg.
29–31. ábra
- 29.: 128 hozzáadásával történő túlcsordulás átviteli karakterisztikája
- 30.: Kétszeres szorzás karakterisztikája
- 31.: Ötszörös szorzás karakterisztikája
Ahogyan az a 10. ábrán látható volt, a 8 bit-es csatorna értékeihez 128-at hozzáadva az intenzitási értékek a 29. ábra szerint csordulnak túl. Az ábracsoport bal oldalán az 1-es intenzitási érték kimenete 1, mivel ez a lineáris karakterisztika. A 29. ábrán azonban az 1-es bemenő intenzitási értéknek már a 129-es érték felel meg. Hasonlóan a túlcsordult, 128-as érték a függvény kimenetén zérus, míg a 127-es bemenő érték a kimeneten 255. Az utóbbi 29-es diagram közepén látható szakadásnál látható. Ez a szakadás a 20. ábrán is megfigyelhető, hiszen ameddig a korábbi kép sötétebb régióinak fényereje nőtt, addig a világosabb régiók csatornái könnyen túlcsordultak. Az inkrementálás egyszerűen leképezhető, ha a függvényt az x tengely mentén az inkrementálásnak megfelelő értékkel eltoljuk.
Hasonlóan az inkrementáláshoz itt is egy szakadás jelentkezik a túlcsordulás okán a 127-es és 128-as bemenő intenzitások kimeneténél. Lényeges különbség, hogy az eredeti, lineáris átviteli karakterisztika a 0 és 255 értékekkel határolt intervallumon kétszer is jelentkezik, kétszeres meredekséggel. Nyilvánvaló, hogy algebrai függvények esetén a bemenő érték konstanssal való szorzása megnyújtja a függvényt, azonban itt a túlcsordulás miatt a függvény periodikus függvényként viselkedik. Értékkészlete továbbra sem változik, 8 bit-en ábrázolható. A 20. és 21. ábrát összehasonlítva megfigyelhető a 128-cal inkrementáló függvény és a kétszeres szorzat függvény közti különbség. Ahogyan az átviteli karakterisztikában is látható a szakadás a 127-es és 128-as bemenő intenzitás kimenetei között, úgy a szakadás fölött túlcsordult régiók közel azonosan megfigyelhetők mindkét ábrán. A szakadás alá eső intenzitású régiók azonban a 20. ábrával ellentétben nem konstans növekedtek, hanem a kontrasztjuk emelkedett meg. Ezen különbségek a 29. és 30. ábrák átviteli karakterisztikái között is jól látszanak.
Ahogyan a 30. ábrán látható kétszeres szorzás karakterisztikáján is láttuk, hasonlóan az ötszörös és tízszeres szorzásnál is periodikusan ismétlődő függvényképet kapunk, a szorzó értékének megfelelően. A 22. és 23. ábrán látható, hogy ilyen mértékű szorzás esetén már jelentősen eltolódhatnak a különböző csatornák egymástól, eltorzítva az eredeti kép sűrűbb színátmenetű régióit.
A 33. ábrán bemutatott függvény növekménye a túlcsordulás miatt már nehezebben követhető, mint a szorzással előállított karakterisztika. A tárgyalt átviteli karakterisztika továbbra is determináns. Hogy hatványfüggvénnyel túlcsordulást érhessünk el, elengedhetetlen, hogy a hatványkitevő 2-nél nagyobb, vagy azzal egyenlő érték legyen.
32–34. ábra
- 32.: Tízszeres szorzás karakterisztikája
- 33.: Négyzetre emelés karakterisztikája
- 34.: Intenzitás megfeleltetése szögértéknek
A 34. ábrán látható, hogy a 8 bites intenzitásérték 0-360 intervallumon való normalizálása miként okoz túlcsordulást a továbbra is 8 bites ábrázolásban. Az itt előállt értéket adtuk át a korábbi példákban trigonometrikus függvényeknek.
A 35. ábrán jól látható, hogy az ismert koszinusz függvény negatív értékei a túlcsordulást követően eltolva jelentkeznek. Hasonlóan a 36. és 37. ábrán a szinusz- és tangens-függvények esetében.
35–37. ábra
- 35.: Koszinusz függvény karakterisztikája
- 36.: Szinusz függvény karakterisztikája
- 37.: Tangens függvény átviteli karakterisztikája
Példakód
Az alábbi Python (v3.6) példakóddal készültek a 18-24. ábrákon bemutatott képek. Hasonlóan bármely kép nevének megadásával végrehajtja a fent felsorolt műveleteket és elmenti a kimeneteket. A kód OpenCV-t használ, így szükséges a vonatkozó Python-csomagot telepíteni hozzá.
example_overflow.py
# USAGE: $ python this_file.py image.png bgr
import cv2
import numpy as np
import sys
import math
print(„Selected mode: „, sys.argv[2])
print(„Loading image:”, sys.argv[1])
mat_bgr = cv2.imread(sys.argv[1], 1) # makes np.uint8 dtype array with BGR colorspace!
print(„Shape:”,mat_bgr.shape)
print(‘Original:’,mat_bgr)
mat_pow=mat_bgr.copy()
mat_pow**=2
mat_m1 = mat_bgr.copy()
mat_m1+=1
mat_m128 = mat_bgr.copy()
mat_m128+=128
mat_M2 = mat_bgr.copy()
mat_M2*=2
mat_M5 = mat_bgr.copy()
mat_M5*=5
mat_M10 = mat_bgr.copy()
mat_M10*=10
mat_rgb = cv2.cvtColor(mat_bgr, cv2.COLOR_BGR2RGB)
mat_hsv = cv2.cvtColor(mat_bgr, cv2.COLOR_BGR2HSV)
cv2.imwrite(„img/ndt_bgr.png”, mat_bgr)
cv2.imwrite(„img/ndt_m_POW2.png”, mat_pow)
cv2.imwrite(„img/ndt_m1.png”, mat_m1)
cv2.imwrite(„img/ndt_m128.png”, mat_m128)
cv2.imwrite(„img/ndt_m_M2.png”, mat_M2)
cv2.imwrite(„img/ndt_m_M5.png”, mat_M5)
cv2.imwrite(„img/ndt_m_M10.png”, mat_M10)
if sys.argv[2] == ‘bgr’ :
cv2.imshow(‘mat’, mat_bgr)
if sys.argv[2] == ‘rgb’ :
cv2.imshow(‘mat’, mat_rgb)
if sys.argv[2] == ‘hsv’ :
cv2.imshow(‘mat’, mat_hsv)
while(True):
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break
Túlcsordulás alkalmazása mozgóképen
A fenti példák hasonlóan alkalmazhatók mozgókép esetében. Az alábbi példakód egy csatlakoztatott webkamera használatával, annak valós idejű videó-folyamján hajt végre egy túlcsordulás alapú torzítást, amelyet meg is jelenít. Az aktuális képkocka felezett értékét a megelőző képkocka felezett értékeivel inkrementálja, ezt követően a kapott eredményt áthelyezve a megelőző képkocka helyére, megjeleníti a paraméterben megadott skaláris értékkel szorzott összeget. A képkockák értékeinek felezése azért célszerű, hogy a vizuális hatás konzisztens maradjon, különben a folyamatos túlcsordulás miatt hamar zajossá válik a kép.
webcam_overflow.py
#USAGE: $ python webcam_overflow.py <webcam number> <multiplier value>
#EXAMPLE: $ python webcam_overflow.py 0 20
import cv2
import sys
print(„Selected device:”, sys.argv[1])
print(„Multiplier:”, sys.argv[2])
cap = cv2.VideoCapture(sys.argv[1])
ret, old = cap.read()
while(True):
ret, frame = cap.read()
frame //= 2
frame += old//2
old = frame.copy()
frame *= int(sys.argv[2])
cv2.imshow(‘frame’, frame)
if cv2.waitKey(1) & 0xFF == ord(‘q’):
break
cap.release()
cv2.destroyAllWindows()
38. ábra: Webkamera képe a példakód alapján, 20-as szorzó értékkel
> Link: A feldolgozás eredménye
Hasonló példa az alábbi GitHub repository-ban található kód. Az itt végzett műveletek már bonyolultabbak, pontos részletezésüktől eltekintünk.
> Link: Kód
> Link: A feldolgozás eredménye
Összegzés
A fenti eljárás, kifejezetten a példaként bemutatott kód szolgált alapjául a 2018-as Fu:bar hibaművészeti rendezvényen kiállított installációnk alapjául, Zágrábban.
A túlcsordulás a digitális technika szinte minden területén alkalmazható, példának okáért a bytebeat kísérleti elektronikus zenei stílus ezt alkalmazza, hogy egysoros programkódokkal hozzon létre zenei automatát úgy, hogy a megadott képlet alapparaméterét folyamatosan inkrementálva és túlcsorgatva egy fűrészfog jelet hoz létre. Megjegyezhető tehát, hogy a túlcsordulás adta lehetőségek nem csak meglévő médiumokon alkalmazott effektusok létrehozására, hanem új művek előállítására is alkalmazható.
> Link: Fu:bar
Irodalom
- den Heijer, E. (2013): Evolving Glitch Art. In: Machado P., McDermott J., Carballal A. (eds) Evolutionary and Biologically Inspired Music, Sound, Art and Design. EvoMUSART 2013. Lecture Notes in Computer Science, vol 7834. Springer, Berlin, Heidelberg
- Murphy, C. (2009): Glitch: Designing Imperfection. Mark Batty Publisher. 144 pp ISBN 978-0979966668
- Manon, H.S. & Temkin, D. (2011): „Notes on glitch.” world picture 6 118 pp.
- Fouque, P. A., Leresteux, D., & Valette, F. (2012, March): Using faults for buffer overflow effects. In Proceedings of the 27th Annual ACM Symposium on Applied Computing (pp. 1638-1639). ACM.
- Heikkilä, V. M. (2011): Discovering novel computer music techniques by exploring the space of short computer programs. arXiv preprint arXiv:1112.1368.