semmixkolor i percepcja

Korekcja gamma i zarządzanie kolorem

Wartość 128 w pliku graficznym nie oznacza połowy światła, tylko około 22%. Ta rozbieżność to gamma. Zrozumienie jej wyjaśnia, dlaczego zmniejszone zdjęcia ciemnieją, gradienty mają brudny środek, a ten sam plik wygląda inaczej na dwóch ekranach.

Skąd wzięła się gamma

Kineskop CRT świecił nieliniowo: jasność plamki rosła mniej więcej jak napięcie podniesione do potęgi 2,2 do 2,5. Sygnał telewizyjny kodowano więc "z wyprzedzeniem", podnosząc go do potęgi odwrotnej, żeby ekran oddał światło proporcjonalnie.

Kineskopy zniknęły, a gamma została, bo okazała się korzystna z drugiego powodu. Oko jest dużo czulsze na różnice w ciemnych tonach niż w jasnych. Kodowanie gamma rozkłada 256 dostępnych poziomów 8-bitowych mniej więcej równo dla percepcji: dużo kroków w cieniach, mniej w światłach. Liniowy zapis w 8 bitach dawałby widoczne pasy w ciemnych partiach i marnowałby poziomy w jasnych.

Krzywa sRGB

sRGB nie używa czystej potęgi, tylko krzywej złożonej z odcinka liniowego przy czerni i potęgi 2,4. W całości przypomina potęgę 2,2:

dekodowanie (wartość w pliku → światło), 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 kodowanie (światło → wartość w pliku): c = 12,92 · c_lin gdy c_lin ≤ 0,0031308 c = 1,055 · c_lin^(1/2,4) - 0,055 w pozostałych przypadkach
Wartość w pliku (0..255)Światło (liniowo)Jasność postrzegana L*
00%0
321,4%12,3
645,1%27,1
9611,7%40,7
12821,6%53,6
16035,2%65,9
19252,7%77,7
22474,5%89,2
255100%100

Tabela pokazuje sens kodowania: wartość 128 to tylko 21,6% światła, ale dla oka (L* = 53,6) to już mniej więcej połowa drogi od czerni do bieli. Wartości w pliku są bliższe temu, co widzimy, niż temu, ile jest światła.

Najczęstszy błąd: liczenie na wartościach zakodowanych

Mieszanie, rozmywanie, skalowanie obrazu i przezroczystość to operacje na świetle. Wykonane bezpośrednio na wartościach sRGB dają złe wyniki:

Poprawna kolejność jest zawsze ta sama: zdekodować do światła liniowego, wykonać operację, zakodować z powrotem. Ten sam krok jest pierwszym etapem przeliczenia RGB na CIE XYZ.

Zarządzanie kolorem

Gamma to tylko jedna z cech urządzenia. Ekrany różnią się też barwami podstawowymi i punktem bieli, a drukarka ma zupełnie inną gamę niż monitor. Zarządzanie kolorem (color management) dba o to, żeby ten sam kolor wyglądał tak samo na różnych urządzeniach, na ile to fizycznie możliwe.

Działa to przez profile ICC. Każde urządzenie albo przestrzeń barw (sRGB, Adobe RGB, Display P3, konkretna drukarka z konkretnym papierem) ma profil opisujący, jak jej wartości mają się do barw niezależnych od urządzenia. Przeliczenie zawsze idzie przez przestrzeń pośrednią (PCS, profile connection space), którą jest CIELAB albo CIE XYZ z bielą D50:

wartości źródła → profil źródła → PCS (Lab / XYZ, D50) → profil celu → wartości celu

Gdy barwy źródła nie mieszczą się w gamie celu, profil stosuje jeden z zamiarów odwzorowania (rendering intents):

Profil ekranu ma sens tylko wtedy, gdy ekran jest skalibrowany. Kalibracja kolorymetrem ustawia gammę, punkt bieli i jasność, a potem tworzy profil opisujący, jak ekran naprawdę odwzorowuje barwy.