Skip navigation

Szürkeárnyalatos konverzió

Színek és intenzitás

A Napból érkező fényt fehérnek látjuk (eltekintve a légkör elnyelő hatásától). A fehér szín egy összetett szín, amely az elektromágneses tartomány látható részének mindegyik komponensét tartalmazza. Ha például egy prizmán engedjük keresztül ezt a fényt, a kilépő oldalon megjelennek a szivárvány színei, mivel a prizma közeghatárain az eltérő hullámhosszú sugárzások más módon térülnek el.

A kép forrása: Zátonyi Sándor, (ifj.) Fizped, CC BY-SA 3.0, via Wikimedia Commons.

A környezetünkben található szilárd testek anyagával a ráeső fény kölcsönhatásba lép. A hullámhossztartomány egy része elnyelődik, másik része a tükrözési szabályoknak megfelelően visszaverődik. Így alakulnak ki a tárgyak színei. Látás érzet vagy digitális kép akkor születik, amikor az így megváltozott fénysugarak élőlények látószervében, vagy fényképezőgép érzékelőjén nyelődnek el, ahol fényenergia mérés történik.

Az emberi látás képes színérzékelésre (kromatikus látás). A retinán úgynevezett csapok találhatók, amelyek háromféle típusúak lehetnek, és egy-egy hullámhossztartomány méréséért felelősek (vörös, zöld, kék, lásd az ábrán alul, a ciánkék kivételével). Ezek a fénymérések jutnak idegpályákon az agyba, ahol a színes látásérzet kialakul. Vegyük észre, hogy ez a fajta látás a fény energiájának egy jó részét nem méri. Azt is vegyük észre, hogy egy-egy retina képpontban (=egy csapban) nem a teljes színt látjuk, hanem csak annak egy komponensét. Az egymás melletti retina területeken található eltérő típusú csapok eredményéből áll elő az agyban az egyes pontok színes érzete.

A diagram vízszintes tengelyén az elektromágneses spektrum látható tartományának hullámhosszait látjuk. A függőleges tengelyen az adott hullámhosszra vonatkozó érzékenységét az emberi látószervnek. A vörös, zöld és kék színnel jelölt görbék a háromféle csap érzékenységét mutatják, a ciánkék a pálcikák érzékenységét.

Kép forrása: http://moodle.autolab.uni-pannon.hu/Mecha_tananyag/jarmu_optika/ch02.html.

Digitális képalkotás során az érzékelő méri a fényenergiát. A színek előállításához úgynevezett Bayer-szűrőt helyeznek a fény útjába, ami biztosítja, hogy az érzékelő kis mérőeszközeit eltérő hullámhossztartományok érik el (legtöbbször vörös, zöld és kék elrendezést alkalmaznak, de léteznek más szűrő megvalósítások is). A színes RGB képet interpolációval kapjuk a nyers mérési eredményekből, mivel egy-egy képpontban a nyers mérés csak egy komponenst tud figyelembe venni (hasonlóan az emberi látáshoz). Az emberi látáshoz hasonlóan itt is kárba vesz a fényenergia egy jelentős része, ami a szűrő szűkebb tartományán kívül esik.

A kép forrása: en:User:Cburnett, CC BY-SA 3.0, via Wikimedia Commons.

Az emberi retinán a csapok mellett pálcikák is találhatók. Ezek gyenge fényviszonyok esetén működnek, viszont csak egyféle tartományban mérnek (a fenti ábrán a csapok mellett a ciánkék érzékelési terület), így monokromatikus (szín nélküli) látást eredményeznek.

A digitális érzékelők is képesek monokromatikus érzékelésre, amennyiben a Bayer-szűrőt nem építik bele. Ekkor itt is csak monokromatikus mérésre van lehetőség, színérzékelésre nincs. De a fényenergia nagyobb százaléka tud részt venni a képalkotásban, ami gyenge fényviszonyok között fontos lehet.

A monokromatikus érzékelés tehát egy skalár értékkel, az intenzitással jellemezhető. A kisebb energiaszint kevés fényt, vagyis sötétebb régiót, a nagyobb energiaszint több fényt, így világosabb részt jelent. Értelmezhetjük ezt a fekete (minimális érték) és fehér (maximális érték) közötti szürkeárnyalatos átmenetként.

Megjegyezzük, hogy digitális képek esetén a színes reprezentációból megfelelő matematikai átalakítással elő tudunk állítani intenzitás reprezentációt is.

Miért fontos?

Számos alacsony szintű képfeldolgozó művelet szürkeárnyalatos intenzitásképeken kerül definiálásra. Szürkeárnyalatos fotók esetén leggyakrabban a [0, 255] intenzitástartomány használt. A 0 érték jelenti a fekete, a 255 a fehér színt. A köztes értékek a feketéből fehérbe tartó szürke átmenetet jelentik.

A fotóink, képeink rendszerint színesek, ezeket át kell alakítanunk szürkeárnyalatosra a fent említett műveletek végrehajtása előtt. Az OpenCV többféle lehetőséget is biztosít erre.

Az egyik megoldás, hogy már a kép betöltését szürkeárnyalatosként kérjük az IMREAD_GRAYSCALE értékkel. Az imread() függvény opcionális második paramétere ezt szabályozza.

cv2.IMREAD_UNCHANGED A képmátrix típusát a fájl tartalma határozza meg. A színes képek 3 csatornás BGR mátrixként, a szürkekárnyalatosak 1 csatornás szürkeárnyalatos képként kerülnek beolvasásra. Mindenképpen ezt használjuk, ha 4 csatornás (RGBA) képet olvasunk be!
cv2.IMREAD_GRAYSCALE A beolvasott képmátrix 1 csatornás szürke lesz.
cv2.IMREAD_COLOR

Ez az alapértelmezett működés.

A beolvasott képmátrix 3 csatornás BGR mátrix lesz. Ha szürkeárnyalatos a bement, akkor mindhárom csatornára a beolvasott szürkeárnyalatos értékek kerülnek beállításra. Eltávolítja az esetleges további (például átlátszósági) csatornákat.

További paramétermegadási lehetőségeket az OpenCV dokumentációban találunk az ImreadModes kulcsszónál.

A másik lehetőség a cvtColor() függvény használata, ami számos színtér reprezentáció közötti átalakítást képes elvégezni. Ennek részleteit a következő oldalon tárgyaljuk.

Megjegyezzük, hogy a szürkeárnyalatos fényességi érték (Y) a három színcsatorna (R, G, B) súlyozott átlagaként számítható az alábbi képlet szerint:

Y = 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B

A fenti megközelítések is így működnek.

Megjegyezzük, hogy természetesen színes esetben is tudunk szürkeárnyalatos képet reprezentálni: ebben az esetben mindhárom csatornán ugyanaz az érték szerepel. A színtér konverziók alfejezet példaprogramjában látunk erre példát.

Példaprogram

01_02_ocv_grayscale.py példaprogramban a kétféle szürkeárnyalatos konverzió használatát láthatjuk. Mindkét változat esetén kiírjuk a konzolra a Numpy képmátrixok méretét is. Figyeljük meg, hogy az első beolvasás eredménye egy (249, 202) méretű tömb, vagyis 249 sorból és 202 oszlopból áll. A színes beolvasás (249, 202, 3) méretűt ad. A szürkeárnyalatos konverzió után pedig újra (249, 202) méretet kapunk. Vagyis ha a képünk egycsatornás, akkor két dimenziós a képmátrix. Többcsatornás (színes) kép esetén a harmadik dimenzió a csatorna dimenziója lesz. A képmátrixok reprezentálását a következő fejezetben tárgyaljuk alaposabban.

01_02_ocv_grayscale.py

# OpenCV2 képbeolvasás, szürkeárnyalatos konverzió
# OpenCV online dokumentáció: https://docs.opencv.org/ # OpenCV modul definíciók importálása import cv2 # Kép beolvasása fájlból szürkeárnyalatosként im_gray = cv2.imread('OpenCV-logo.png', cv2.IMREAD_GRAYSCALE) # Képméret kiíratása konzolra print('im_gray.shape:', im_gray.shape) # Kép megjelenítése ablakban cv2.imshow('im_gray', im_gray) cv2.waitKey(0) # Kép beolvasása fájlból im_color = cv2.imread('OpenCV-logo.png', cv2.IMREAD_COLOR) print('im_color.shape:', im_color.shape) im_gray2 = cv2.cvtColor(im_color, cv2.COLOR_BGR2GRAY) print('im_gray2.shape:', im_gray2.shape) # Kép megjelenítése ablakban cv2.imshow('im_gray2', im_gray2) cv2.waitKey(0)

Szürkeárnyalatos eredmény