Obrazy kolorowe

Obrazy kolorowe posiadają kilka kanałów kolorów. Jak pamiętamy w przypadku obrazów w odcieniach szarości (grey-scale, monochromatic) mieliśmy do czynienie tylko z jednym kanałem (każdy piksel był opisany za pomocą tylko jednej wartości).

Obrazy w odcieniach szarości są prezentowane za pomocą luminancji ($Y$). Obrazy kolorowe składają się zarówno z luminancji jak i chrominancji, czyli informacji o kolorze. Informacja ta może być przechowywana na kilka różnych sposobów, ale zawsze wymaga kilku kanałów. W konsekwencji obrazy kolorowe są dużo większe a ich analiza jest trudniejsza. Jednym z powodów jest fakt, że większość algorytmów została stworzona właśnie do zdjęć w odcieniach szarości. Ponadto metody te nie są łatwe do uogólnienia w przypadku zdjęć kolorowych.

Red–Green–Blue (RGB)

Najczęściej do reprezentowania kolorów na obrazie używa się trzech kanałów odpowiadających mniej więcej długości fal: czerwonej (700,0 nm), zielonej (546,1 nm) i niebieskiej (435.8 nm). Format RGB odwzorowuje mechanizm używany przez ludzkie oko. Przypomnijmy, że człowiek posiada trzy rodzaje czopków, które właśnie odbierają długości fal odpowiadające kanałom: red, green oraz blue (więcej informacji w rozdziale Jak człowiek widzi).

    

    

Ilustracja. Poszczególne kanały obrazu RGB. 

Powyższy rozkład na poszczególne kolory można uzyskać za pomocą kodu w OpenCV (C++), OpenCV (C++)

Elementy światłoczułe w aparacie są czułe na odpowiednie zakresy fal (patrz ilustracja poniżej).

Kiedy obraz jest wyświetlany kombinacja tych trzech kolorów daje efekt, który widzimy. Każdy kolor jest więc mieszaniną trzech komponentów: red, green, blue.

Należy zauważyć, że w takiej reprezentacji możemy wyrazić $256 \cdot 256 \cdot 256 = 16777216$ kolorów. Mimo to istnieją kolory, których nie można w ten sposób zapisać.

W większości kamer, elementy światłoczułe względem różnych długości fal, nie są zlokalizowane obok siebie. Tworzą one regularne wzory (patrz rysunek poniżej), a wartości w RGB są przybliżane na podstawie wartości w znanych punktach.

 

Obraz w formacie RGB, można łatwo przekształcić do odcieni szarości:

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

Można użyć wbudowanej funkcji OpenCV cvtColor(img, grey_img, CV_BGR2GRAY); OpenCV (C++)

Można też napisać tą operację ręcznie OpenCV (C++).

Cyan–Magenta–Yellow (CMY)

Model CMY jest oparty na kolorach wtórnych (RGB to kolory podstawowe). Wartości C, M oraz Y są odejmowane od czystej bieli w celu uzyskania wymaganego koloru. Z tego powodu format ten jest często stosowany jako model kolorów wewnątrz drukarkek, gdzie biały jest punktem wyjścia.

Wartości kolorów w formacie CMY można uzyskać za pomocą wzorów:

\[ C = 255 − R \] \[ M = 255 − G \] \[ Y = 255 − B \]

Kolory w formacie CMY uzyskuje się poprzez mieszanie barw:

  • Cyjan - odcień niebieskiego,
  • Magenta - podobne kolory to fuksja, karmazyn i amarant,
  • Yellow – kolor bardzo podobny do żółtego.

YUV

Model YUV jest używany w telewizorach analogowych i jest kombinacją luminancji ($Y$) oraz dwóch komponentów z kolorami:

  • niebieski minus luminancja ($U$),
  • czerwony minus luminancja ($V$).

Warstwy te można uzyskać za pomocą wzorów:

 \[ Y = 0.299R + 0.587G + 0.114B \] \[ U = 0.492 \cdot (B − Y)\] \[V = 0.877 \cdot (R − Y) \]

Konwersja z formatu RGB na YUV OpenCV (C++)

Poszczególne kanały widoczne są na poniższej ilustracji (OpenCV (C++)):

  

  

 

YCbCr

Format YUV jest często nazywany YCbCr. Wynika to z faktu, że oba formaty są bardzo podobne (różnią się przeskalowaniem). Format YCbCr jest używany w grafice cyfrowej, a YUV w telewizji analogowej. Więcej informacji na ten temat możesz znaleźć tutaj YUV.

  

  

Kanały dla zdjęcia w formacie YCbCr można wyodrębnić za pomocą kodu OpenCV (C++).

Hue Luminance Saturation (HLS)

Model HLS jest często używany ponieważ dobrze oddziela luminancję i chrominancję. Chrominancja w tym modelu podzielona jest na odcień ($H$ hue) oraz nasycenie ($S$ saturation). Jest to jeden z dwóch najpopularniejszych cylindrycznych układów współrzędnych opisujących kolory HSL i HSV.

Luminancja przyjmuje wartości w zakresie od 0 do 1. Odcień ($H$) określa barwę i przyjmuje wartości w zakresie od 0 do 360◦. Nasycenie $S$ opisuje stopień czystości / intensywności koloru i przyjmuje wartości w zakresie od 0 do 1. W zastosowaniach praktycznych, wszystkie te ilości są zwykle skalowane do zakresu od 0 do 255.

Współrzędne HLS można wyliczyć za pomocą poniższych wzorów:

\[ L = \frac{\max(R,G, B) + \min(R,G, B)}{2} \] \[ S = \left\{ \begin{array}{ll} \frac{\max(R,G,B) - \min(R,G,B)}{\max(R,G, B) + \min(R,G,B)} & \textrm{gdy $L<0.5$}\\ \frac{\max(R,G,B) - \min(R,G,B)}{2 - (\max(R,G,B) + \min(R,G,B))} & \textrm{gdy $ L \geq 0.5 $} \end{array} \right. \] \[ H = \left\{ \begin{array}{ll} \frac{60 \cdot (G − B)}{S} & \textrm{ gdy $R = \max(R,G,B)$ }\\ 120 + \frac{60 \cdot (G − B)}{S} & \textrm{ gdy $G = \max(R,G,B)$ }\\ 240 + \frac{60 \cdot (G − B)}{S} & \textrm{ gdy $B = \max(R,G,B)$ } \end{array} \right.\]

Aby przekonwertować obraz z formatu RGB na HLS można użyć kodu OpenCV (C++)

  

  

Powyższe obrazy zostały wygenerowane za pomocą kodu OpenCV (C++).

Inne modele kolorów

Jest wiele modeli kolorów. Najważniejsze (według nas) umieściliśmy powyżej. Niemniej jednak należy jeszcze wspomnieć o:

  • HSV (Hue Saturation Value), jest podobny do HLS z małymi różnicami dla kanałów,
  • YCrCb jest przeskalowaną wersją YUV, który jest często stosowany w kompresji obrazu i wideo,
  • CIE L*u *v*,
  • CIE L∗a∗b∗.

Wykrywanie elementów za pomocą kolorów

Za pomocą kolorów jesteśmy w stanie znajdować różne obiekty na zdjęciach. Poniżej podamy dwa najprostsze zastosowania.

Detekcja skóry

Ludzką skórę możemy na zdjęciu wykryć za pomocą analizy koloru (w formacie HLS) poszczególnych pikseli. Metodą prób i błędów zauważono, że kolor odpowiadający skórze spełnia poniższą zależność:

 (S >= 0.2) AND (0.5 < L∕S < 3.0) AND (H <= 28◦ OR H >= 330)

Kod OpenCV (C++)

  

Oczywiście nasz sposób wykrywania nie jest idealny. Poza skórą wykryliśmy też inne elementy, których kolory są zbliżone do poszukiwanego.

Detekcja zjawiska czerwonych oczu

Analogicznie jak przy wykrywaniu skóry, musimy podać warunek, który zidentyfikuje czerwony kolor:

LS_ratio = ((double) L) / ((double) S)
(L >= 64) && (S >= 100) && (LS_ratio > 0.5) && (LS_ratio < 1.5) && ((H <= 7) || (H >= 162))

Kod OpenCV (C++)