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, OpenCV 4.5.1 verzióhoz):

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ép alakítunk "színessé", a megjelenő kép továbbra is szürkeárnyalatos lesz, csak BGR színreprezentációban. 

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.1.2/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
imgc = cv2.imread('GolyoAlszik_rs.jpg', cv2.IMREAD_COLOR)
cv2.imshow('color', imgc)

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



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

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

# Színcsatornákra bontás
L, a, b = cv2.split(imgLab)
cv2.imshow('L', L)
cv2.imshow('a', a)
cv2.imshow('b', b)
cv2.waitKey(0)