Skip navigation

Világosság és kontraszt

Feladata

A világosság és kontraszt állítás lehetősége szintén gyakori funkció a fotószerkesztő alkalmazásokban.

  • A világosság állítása elképzelhető úgy, mint egy konstans érték hozzáadása vagy kivonása minden intenzitásértékből.
  • A kontraszt módosítás megadható egy konstanssal való szorzásként, ami az intenzitástartomány nyújtását vagy zsugorítását végzi.

A paraméterezésnél az alábbiakra célszerű figyelni:

  • A műveletek hatására a 0 alatti értékek 0-t, a 255 felettiek 255 értéket kapjanak!
  • A világosság állítás paramétere [-255, 255] között lehessen. A kiválasztott értéket adjuk hozzá minden intenzitáshoz. A 0 érték nem változtat a világosságon. Látható, hogy a 255 érték hozzáadása minden értéket 255-re (konstans fehér kép), a 255 érték kivonása minden értéket 0-ra állít (konstans fekete kép). Ennél nagyobb értéket emiatt felesleges választani.
  • A kontraszt állítás esetén az értéket megszorozzuk egy nemnegatív konstanssal. Az intenzitástartomány középére szimmetrikus tartományt érdemes biztosítani, vagyis a 128-as intenzitásérték ne változzon. A paraméter értékkészlete tetszőleges, a példánkban ezt is [-255, 255] között tesszük változtathatóvá. A -255 érték teljesen kontrasztmentes képet készít, konstans 128 érték lesz mindenhol. A +255 értékre a 128 alatti intenzitásértékek 0-t, a 128 felettiek 255 értéket kapnak minden színcsatornán, a 128-as érték 128 marad. (A kerekítési pontatlanságok miatt kialakulhatnak pár értékes eltérések.)

Megvalósítás

A keresőtáblás megvalósítás esetén az alábbi lépések történnek.

Kiszámítjuk a szorzótényezőt:

factor = (259 * (contrast + 255)) / (255 * (259 - contrast))

Felvesszük a lehetséges intenzitásértékeket:

x = np.arange(0, 256, 1)

Elkészítjük a keresőtábla bejegyzést minden intenzitásértékhez:

lut = np.uint8(np.clip(brightness + factor * (np.float32(x) - 128.0) + 128, 0, 255))

Lépésenként:

  • Átalakítjuk az alappontokat lebegőpontos számmá.
  • Kivonunk 128-at, hogy a középpontra szimmentrikus legyen az intenzitástartomány nyújtása.
  • A factor értékkel nyújtjuk/zsugorítjuk az intenzitástartományt.
  • Hozzáadunk 128-at, hogy a középső intenzitás a helyére kerüljön.
  • Hozzáadjuk a világosítás értékét.
  • Vágjuk az értékkészletet a [0, 255] tartományba.
  • Visszaalakítjuk uint8 típusúvá a keresőtáblát.

A megoldást a 04_04_a_br_contrast_lut.py példaprogram mutatja be. Figyeljük meg, hogy az OpenCV csúszka limitált tudása miatt a 255 érték felel meg a nullának! A konzolra ezért mindig kiírjuk a csúszka értékekből számított érvényes brightness és contrast paraméter értékeket. A program külön ablakban kirajzolja az intenzitás-átmenet függvényt is.

Egy letisztultabb felhasználói felületet valósít meg a 04_04_b_pyqt6_br_contrast.py példaprogram, PyQt6 vezérlőelemekkel.