Skip navigation

Színtér konverziók

Színterek

A számítógépek képernyőjén megjelenő színek a vörös, zöld és kék színkomponensek intenzitásának elegyítéséből állnak elő. A fotók betöltés után jellemzően ezen a három színcsatornán tárolódnak.

Az RGB reprezentáció hasznos a digitális kijelzőn való megjelenítéshez. A színek leírására számos más színtér is létezik, amelyek bizonyos tulajdonságai jobbak az RGB-nél. Például a színkódok euklidészi távolsága (háromelemű vektorokként értelmezve őket) és a színérzet nem felel meg egymásnak az RGB színtérben, erre alkalmasabb a CIELab színtér. Nyomdai előkészítésnél a CMYK színtér használatos.

Megjegyezzük, hogy a többcsatornás színes képek esetén a csatornák jellemző sorrendje a vörös (R), zöld (G), kék (B). Az OpenCV belső reprezentációja viszont a BGR sorrendet valósítja meg!

Az OpenCV számos színtér reprezentációt ismer, és biztosítja az ezek közötti átalakításokat a cvtColor() függvénnyel.

  • A két paramétere közül az első az átalakítandó képmátrix.
  • A második az átalakítás módját jelenti, meghatározza, melyik színtérből melyikbe alakítunk. Néhány ilyen érték megtalálható az angol nyelvű dokumentációban.
  • A függvény eredményeként az átalakított képet kapjuk.

Példák színes->szürkeárnyalatos konverziós konstansokra:

  • cv2.COLOR_BGR2GRAY, cv2.COLOR_GRAY2BGR, cv2.COLOR_RGB2GRAY, cv2.COLOR_GRAY2RGB

Általánosan a cv2.COLOR_honnan2hova alakot használhatjuk, ahol az egyik az RGB vagy BGR közül valamelyik, a másik pedig lehet például XYZ, YCrCb, HSV, HLS, Lab, Luv, a kapcsolódó színtér elnevezéseknek megfelelően. Akár RGB->BGR és BGR->RGB átalakításra (csatornák sorrendjének cseréje) is lehetőség van.

Eredményként az átalakított képet kapjuk.

Dokumentáció (angol nyelven):

01_03_ocv_cvtcolor.py

A cv2.cvtColor() függvény használatára láthatunk példát az alábbi kódban.

Figyeljünk arra, hogy ha egy szürkeárnyalatos képet alakítunk "színessé", a megjelenő kép továbbra is szürkeárnyalatos lesz, csak BGR színreprezentációban. Ennek is van létjogosultsága: amennyiben szürkeárnyalatos képre szeretnénk színes alakzatokat rajzolni, akkor át kell térni erre a reprezentációra.

Megjegyezzük, hogy egy többcsatornás képet színcsatornánként önálló egycsatornás képekké alakíthatjuk a cv2.split() függvénnyel. Ezzel a következő fejezetben foglalkozunk részletesebben.

# OpenCV2 képbeolvasás, színtér konverzió
# OpenCV online dokumentáció: https://docs.opencv.org/4.9.0/de/d25/imgproc_color_conversions.html

# OpenCV modul definíciók importálása
import cv2

# Színes kép beolvasása fájlból
im_bgr = cv2.imread('GolyoAlszik_rs.jpg', cv2.IMREAD_COLOR)
print('im_bgr.shape:', im_bgr.shape)

cv2.imshow('im_bgr', im_bgr)

# Szürkeárnyalat
im_gray = cv2.cvtColor(imgc, cv2.COLOR_BGR2GRAY)
cv2.imshow('im_gray', im_gray)
print('im_gray.shape:', im_gray.shape)
cv2.waitKey(0)



# Szürkéből "színes"
im_gcay2bgr = cv2.cvtColor(im_gray, cv2.COLOR_GRAY2BGR)
cv2.imshow('im_gray2bgr', im_gray2bgr)
print('im_gray2bgr.shape:', im_gcay2bgr.shape)
cv2.waitKey(0)

# Áttérés Lab színtérbe
# L: szürkeárnyalat
# a, b: kromatikusok (szín információ)
im_Lab = cv2.cvtColor(im_bgr, cv2.COLOR_BGR2Lab)
print('im_Lab.shape:', im_Lab.shape)
cv2.waitKey(0)

# Vissza BGR-be
im_bgr2 = cv2.cvtColor(im_Lab, cv2.COLOR_Lab2BGR)
cv2.imshow('im_bgr2', im_bgr2)
cv2.waitKey(0)

cv2.destroyAllWindows()