semmixkolor i percepcja

Przekształcenie CIE XYZ i RGB

Przejście z RGB do CIE XYZ to most między kolorem urządzenia a kolorem opisanym niezależnie od urządzenia. Składa się z dwóch kroków: usunięcia korekcji gamma i mnożenia przez macierz 3×3. Tu na przykładzie sRGB, najpopularniejszej przestrzeni RGB.

Dlaczego "RGB" to za mało

Trójka (200, 80, 40) nie określa jeszcze barwy. Trzeba wiedzieć, jakie są barwy podstawowe ekranu, jaki ma punkt bieli i jaką krzywą przejścia. Te trzy rzeczy definiuje konkretna przestrzeń RGB. sRGB, ustalona w 1996 roku dla monitorów i internetu, ma:

xy
czerwień0,640,33
zieleń0,300,60
błękit0,150,06
biel D650,31270,3290

Z tych współrzędnych chromatyczności wyprowadza się macierz poniżej. Adobe RGB czy Display P3 mają inne barwy podstawowe, a więc inne macierze.

Krok 1: linearyzacja

Wartości sRGB są zakodowane nieliniowo (o tym więcej w artykule o korekcji gamma). Macierz działa na wartościach proporcjonalnych do światła, więc najpierw trzeba zakodowanie odwrócić. Dla każdej składowej c w zakresie 0..1:

c_lin = c / 12,92 gdy c ≤ 0,04045 c_lin = ((c + 0,055) / 1,055)^2,4 w pozostałych przypadkach

Krok 2: macierz

| X | | 0,4124564 0,3575761 0,1804375 | | R_lin | | Y | = | 0,2126729 0,7151522 0,0721750 | · | G_lin | | Z | | 0,0193339 0,1191920 0,9503041 | | B_lin |

Środkowy wiersz to wzór na luminancję: zieleń wnosi do jasności ponad 71%, błękit nieco ponad 7%. Biel (1, 1, 1) daje X = 0,9505, Y = 1, Z = 1,0888, czyli dokładnie punkt bieli D65.

Droga odwrotna: XYZ na RGB

| R_lin | | 3,2404542 -1,5371385 -0,4985314 | | X | | G_lin | = | -0,9692660 1,8760108 0,0415560 | · | Y | | B_lin | | 0,0556434 -0,2040259 1,0572252 | | Z | c = 12,92 · c_lin gdy c_lin ≤ 0,0031308 c = 1,055 · c_lin^(1/2,4) - 0,055 w pozostałych przypadkach

Przykład krok po kroku

RGB (200, 80, 40), #c85028.

c: 0,7843 0,3137 0,1569 c_lin: 0,5776 0,0802 0,0212 np. R: ((0,7843 + 0,055) / 1,055)^2,4 = 0,7955^2,4 = 0,5776 X = 0,4124564·0,5776 + 0,3575761·0,0802 + 0,1804375·0,0212 = 0,2707 Y = 0,2126729·0,5776 + 0,7151522·0,0802 + 0,0721750·0,0212 = 0,1817 Z = 0,0193339·0,5776 + 0,1191920·0,0802 + 0,9503041·0,0212 = 0,0409

Zwróć uwagę na linearyzację: zakodowana wartość R = 0,78 to tylko 0,58 światła, a G = 0,31 to zaledwie 0,08. Pominięcie tego kroku to najczęstszy błąd przy przeliczaniu kolorów, dla tego koloru L* wychodzi wtedy 69,7 zamiast 49,7.

Z tego XYZ można dalej policzyć CIELAB i CIELUV. Dla tego koloru: Lab (49,71; 45,77; 46,31).

Barwy spoza gamy

XYZ obejmuje wszystkie barwy widzialne, sRGB tylko ich część. Przeliczenie w drugą stronę może więc dać wartości ujemne albo większe od 1. Przykład: X = 0,20, Y = 0,50, Z = 0,10 (nasycona zieleń):

R_lin = -0,1703 G_lin = 0,7483 B_lin = 0,0148

Ujemna czerwień oznacza, że tej zieleni nie da się wyświetlić w sRGB. Najprostsze rozwiązanie to obcięcie do zakresu 0..1 (tu wynik to mniej więcej RGB (0, 224, 33)), ale zmienia ono odcień i jasność. Programy do zarządzania kolorem stosują lepsze metody mapowania gamy, które zachowują odcień kosztem nasycenia.

Macierz zależy od punktu bieli. Gdy XYZ ma być względny do D50 (np. w profilach ICC), trzeba dodatkowo zastosować adaptację chromatyczną, zwykle metodą Bradforda. Pominięcie jej daje lekko niebieskawe albo żółtawe przesunięcie.