Skip navigation

Inverzió keresőtáblával

Inverzió intenzitás-átmenet függvénye

Az inverzió szürkeárnyalatos képekre értelmezett, az értékkészlet megfordítását jelenti: az alacsony intenzitásúak magasak lesznek, és fordítva.

A pont-operációkat úgynevezett intenzitás-átmenet függvénnyel is meg lehet adni. A vízszintes tengely mutatja az eredeti intenzitásértéket, míg a függőleges tengelyen az új hozzárendelést kapjuk. Az inverzió esetén ez az alábbi:

Tetszőleges ilyen átmenet függvény hatékonyan megvalósítható keresőtábla (LUT- look-up table) segítségével, ami szintén bemutatásra kerül.

04_01_a_inverse_np.py

Az első példaprogramunk az inverziót Numpy aritmetikai művelettel valósítja meg, feltételezve, hogy színcsatornánként [0, 255] az értéktartomány.

import cv2

im = cv2.imread('Sudoku_rs.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Eredeti', im)

im_inverse = 255 - im
cv2.imshow('Inverz', im_inverse)
cv2.waitKey(0)

Az elkészülő új im_inverse képmátrix úgy áll elő, hogy az eredeti értékek minden képpontban kivonásra kerülnek 255-ből, vagyis a sötét és világos intenzitások megcserélésre kerülnek.

Megjegyezzük, hogy előjel nélküli egész típusok esetén logikai NEM művelettel is megoldható a negálás.

A Sudoku_rs.jpg kép és a program eredménye:

04_01_b_inverse_lut.py

A második példaprogramban az OpenCV keresőtábla (look-up table, LUT) funkcióját ismerhetjük meg. A lényege, hogy készítünk egy 256 elemű, előjel nélküli egész típusú tömböt, és minden indexhez megadjuk az index, mint képpont intenzitásérték új értékét. Ezután a cv2.LUT() fügvénnyel a megadott képre alkalmazhatjuk a keresőtáblában definiált cserét. Ennek első paramétere a módosítandó képmátrix, a második pedig a cserét leíró tömb. Ha többcsatornás kép a bement, akkor minden csatornára külön elvégzi a cserét, vagyis színes és szürkeárnyalatosra is működik.

import cv2
import numpy as np

im = cv2.imread('Sudoku_h.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Eredeti', im)

# Inverz készítés keresőtáblával
lut = np.arange(0, 256, 1, np.uint8)

lut = 255 - lut
im_inv = cv2.LUT(im, lut)
cv2.imshow('Inverz LUT', im_inv)

cv2.waitKey(0)

A NumPy arange(start, stop, step, dtype) függvénye egy tömböt hoz létre [start, stop) értékkészlettel (vagyis a stop már nem lesz eleme), step növekménnyel, dtype típusú elemekkel.

Vegyük észre, hogy a kivonást most nem a képmátrixra, hanem a (jellemzően) jóval kisebb méretű tömb elemeire hajtjuk végre, majd a cv2.LUT() végzi el a cserét.

Időigény szempontjából ennyire egyszerű aritmetikai művelet esetén nem feltétlenül van érzékelhető sebeségnövekedés, de egy minden képpontra végrehajtott osztás, szorzás, logaritmus művelet nem mindegy, hogy 256 vagy több millió esetben számolódjon ki. A keresőtábla-alapú csere időigénye ettől függetlenül állandó. A világosság-kontraszt állítás esetén például a keresőtáblás megközelítés kb. 40-szeres gyorsulást jelent a Numpy aritmetikával minden képpontra végrehajtotthoz képest, a for ciklussal bejárt képmátrixhoz képest pedig 15000-szeres (tizenötezerszeres).