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:
| Wartość w pliku (0..255) | Światło (liniowo) | Jasność postrzegana L* |
|---|---|---|
| 0 | 0% | 0 |
| 32 | 1,4% | 12,3 |
| 64 | 5,1% | 27,1 |
| 96 | 11,7% | 40,7 |
| 128 | 21,6% | 53,6 |
| 160 | 35,2% | 65,9 |
| 192 | 52,7% | 77,7 |
| 224 | 74,5% | 89,2 |
| 255 | 100% | 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:
- Średnia czerni i bieli. Arytmetycznie (0 + 255) / 2 = 128. Ale połowa światła to wartość 188. Zmniejszony obraz drobnej szachownicy, liczony bez linearyzacji, wychodzi za ciemny.
- Gradient czerwień-zieleń. Środek liczony na wartościach sRGB to (128, 128, 0): ciemna, oliwkowa plama. Liczony w świetle liniowym daje (188, 188, 0), jasną żółć, czyli to, co powstaje z mieszania dwóch świateł.
- Antyaliasing i krawędzie fontów wyglądają cieńsze albo grubsze w zależności od koloru tła.
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:
Gdy barwy źródła nie mieszczą się w gamie celu, profil stosuje jeden z zamiarów odwzorowania (rendering intents):
- percepcyjny: ściska całą gamę, zachowując relacje między barwami; dobry do zdjęć,
- kolorymetryczny względny: barwy mieszczące się w gamie zostają bez zmian, pozostałe są przycinane do jej granicy; biel źródła przechodzi w biel papieru,
- nasycenie: zachowuje żywość kosztem wierności; do wykresów i grafiki,
- kolorymetryczny bezwzględny: jak względny, ale bez dopasowania bieli; do symulacji papieru na ekranie (proof).
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.