Skip navigation

Gamma korrekció

Szerepe és működése

A gamma-korrekció egy nemlináris intenzitás transzformáció. Az emberi látás és a (digitális) kamerák más módon mérik a beérkező fényenergiát, illetve a kijelzők szintén más módon adják vissza a képet ahhoz képest, ahogyan az agyunkban a látásérzet kialakul. Ahhoz, hogy a képernyőn megjelenő digitális raszterkép érzete nagyjából megegyezzen a való világban az emberi látószerv által érzékelttel, szükséges a gamma-korrigálás. A korrekció eszközöktől függő paraméterű. A legtöbb számítógépes monitor ezt automatikusan elvégzi, több esetében a gamma korrekció értéke állítható is.

Matematikailag az intenzitásértékek hatványozásával érjük el a hatást. Ez akkor működik, amennyiben az intenzitásértékek a [0, 1] tartományban találhatók, vagyis előzetesen egy normalizáló lépés szükséges, majd a végén vissza kell transzformálni az eredményt a [0, 255] tartományba.

Többcsatornás kép esetén minden csatornára egyenként hajtódik végre.

Az átmenet függvény többféle gamma-értékre ábrázolva az alábbi:

04_02_a_gamma_lut.py

Az első példaprogramunk keresőtáblával oldja meg a feladatot.

A create_gamma_lut() függvényünk készíti el a szükséges keresőtáblát. A két csillag (**) operátor a hatványozás Python-ban. A lila színnel kiemelt kódrészek a normalizáláshoz tartozókat jelölik.

def create_gamma_lut(gamma):
"""Gamma paraméter értéknek megfelelő 256 elemű keresőtábla generálása.
A hatványozás miatt először [0, 1] tartományra kell konvertálni, majd utána vissza [0, 255] közé.
"""
lut = np.arange(0, 256, 1, np.float32)

lut = lut / 255.0
lut = lut ** gamma

lut = np.uint8(lut * 255.0)

return lut

A program többféle gamma-értékre is végrehajtja a korrekciót és megjeleníti az eredményt.

04_02_b_gamma_lut_diagram.py

A második változat az elsőt egészíti ki grafikonrajzolással.

A grafikon alátámasztja a megfigyelésünket, miszerint az 1 értéknél alacsonyabb gamma-értékek világosítást, az 1 érték felettiek sötétítést eredményeznek. Az 1 érték értelemszerűen nem változtat az intenzitásokon. A gamma-értéknek 0-nál nagyobbnak kell lennie.

04_02_c_gamma_lut_diagram_interactive.py

A harmadik példaprogram a gamma-paraméter interaktív állítási lehetőségét biztosítja. A képet megjelenítő ablak tetején megjelenő csúszka (trackbar) segítségével dolgozhatunk. A képi eredmény rögtön megjelenik, valamint külön ablakban a gamma-korrekciós grafikont is láthatjuk.

Az OpenCV csúszka használati lehetőségeit külön ismertetjük. Kiemeljük, hogy ennek a vezérlőnek nagyon limitált a tudása. Csak egész számokat kaphatunk paraméterként, valamint csak 0-tól kezdődhet a paraméter értékek megadása. Emiatt sokszor, mint a jelen példában is, át kell alakítanunk a paraméter értéket.

Csúszka objektum létrehozása egy megjelenítő ablakhoz az alábbi. A Gamma nevű ablak felső részén jelenik meg egy Parameter nevű vezérlőelem. Értéke [0, 80] tartományban választható, egyesével, egész értékekként. A csúszka a középső, 40 értékre kerül indításkor. Az ennek megfelelő hatást érvényesítjük is az ontrackbar() kezelőfüggvény meghívásával.

cv2.createTrackbar('Parameter', 'Gamma', 40, 80, ontrackbar)
ontrackbar(40)

A csúszka aktuális értéke tehát 0 és 80 közötti lehet. Mi azt szeretnénk, ha az ebből számolt gamma korrekciós paraméter a csúszka felső tartományában (40 feletti csúszka értékekre) 1 feletti értéket adna 0.1 léptékkel. Az alsó részben pedig a 40 feletti "párjának" a reciprok értéke szerepelne. A gamma értékek így 1 / 5.0 = 0.2 és 5.0 közöttiek lesznek.

Az egy tizedes léptéket elérjük, ha a csúszka aktuális értékét (pos) elosztjuk 10-zel. A 40-es középső értékből így 4 lesz. Ezt 1 értékre szeretnénk állítani, vagyis kivonunk 3-at. Ha az így kapott érték 1 feletti, akkor rendben is vagyunk. 1 alatt reciprok értéket szerenénk kapni. Ha ebből még 2-t kivonunk, -1-től csökkenő értéket kapunk egészen -5-ig, aminek vesszük a reciptok értékét, és ellenkező előjelűre állítjuk az eredményt. A függvény további része megegyezik az előzőkkel: definiáljuk a gamma-korrekció keresőtábláját és végrehajtjuk a képre az intenzitásértékek cseréjét.

def ontrackbar(pos):
    global img

    gamma = (pos / 10.0) - 3
    if gamma < 1:
        gamma = -1.0 / (gamma - 2.0)

    lut = create_gamma_lut(gamma)
    applyLUT(img, lut, 'γ={0:2.2f}'.format(gamma))

A ténylegesen felhasznált paraméter értéket tájékoztatásul kiírjuk a konzolra.

Ha jobban használható felhasználó felületet szeretnénk a programunkhoz készíteni, akkor javasolt például a PyQt5 Python csomag használata, ami a népszerű Qt5 függvénykönyvtár funkcióit teszi elérhetővé. Több példához is adunk ilyen implementációt a későbbiekben.