SAT · macierz 3×3, wiersze sumują się do 1HUE · obrót w płaszczyźnie chrominancjiWB · korekta per kanał
Rozdział 10 / Matematyka gradingu

Saturacja, hue, białe wyważenie

Podkręcenie saturacji psuje skórę, zanim zdążysz to zauważyć na wykresie wektorowym — bo za tym jednym suwakiem stoi macierz, która traktuje każdy kolor inaczej.

TL;DR
Etap: Saturacja jako macierz

Ten sam wzór z Rozdziału 8, rozpisany jako macierz

Rozdział 8 wprowadził wzór na saturację przy okazji ASC CDL: out_c = luma + sat · (in_c − luma). Podstawiając definicję luma (współczynniki Rec.709: 0,2126 / 0,7152 / 0,0722) i grupując wyrazy przy R, G, B, ten sam wzór zapisuje się jako jedna macierz 3×3, identyczna dla wszystkich trzech kanałów wyjściowych, zależna tylko od jednego parametru sat:

M(sat) =
[ sat+(1−sat)·0,2126   (1−sat)·0,7152   (1−sat)·0,0722 ]
[ (1−sat)·0,2126   sat+(1−sat)·0,7152   (1−sat)·0,0722 ]
[ (1−sat)·0,2126   (1−sat)·0,7152   sat+(1−sat)·0,0722 ] Każdy wiersz sumuje się do dokładnie 1,0, niezależnie od sat — z tego samego powodu co macierz zmiany przestrzeni barw w Rozdziale 4: żeby biel (1,1,1) zawsze zostawała bielą, niezależnie od stopnia saturacji
Policzone: macierz saturacji dla sat = 0,5
Wiersz R: [0,6063; 0,3576; 0,0361]
Wiersz G: [0,1063; 0,8576; 0,0361]
Wiersz B: [0,1063; 0,3576; 0,5361]
Suma każdego wiersza = 1,0000 — sprawdzenie poprawności macierzy, dokładnie jak przy macierzy zmiany przestrzeni barw w Rozdziale 4
Przy sat=0 wszystkie trzy wiersze stają się identyczne: [0,2126; 0,7152; 0,0722] — czyli każdy kanał wyjściowy równa się luma, dokładnie definicja pełnego odbarwienia. Przy sat=1 macierz redukuje się do macierzy jednostkowej — brak zmiany.

To właśnie dlatego przesadzona saturacja najpierw psuje skórę: karnacja ma stosunkowo bliskie sobie wartości R, G i B (mała odległość od luma w porównaniu np. z nasyconą czerwienią ubrania), więc każdy dodatkowy procent sat wyolbrzymia tę niewielką różnicę nieproporcjonalnie mocno względem tego, jak subtelna zmiana jest jeszcze wiarygodna fizjologicznie — granica, za którą skóra zaczyna wyglądać poparzona słońcem albo chorobliwie czerwona, jest bliżej niż podpowiada intuicja patrząca tylko na jedną liczbę „Saturation”.

Etap: Hue rotation

Obrót barwy — zmienia który kolor, nie ile koloru

Saturacja skaluje odległość koloru od luma, ale nie zmienia kierunku tej odległości — czerwony pozostaje czerwony, tylko mniej lub bardziej intensywny. Obrót barwy robi coś przeciwnego: zmienia kierunek, zachowując odległość (i luma) bez zmian. Najwygodniej myśleć o tym w przestrzeni, która jawnie oddziela luma od chrominancji — na przykład YCbCr, gdzie Y to luma (ten sam wzór co wyżej), a Cb i Cr to dwuwymiarowa płaszczyzna koloru, niezależna od jasności. Obrót barwy o kąt θ to zwykły obrót 2D dokładnie tej płaszczyzny:

Cb' = Cb·cos(θ) − Cr·sin(θ)
Cr' = Cb·sin(θ) + Cr·cos(θ)θ — kąt obrotu barwy; Y (luma) nie zmienia się w ogóle — to właśnie sprawia, że hue rotation, poprawnie zaimplementowany, nie zmienia postrzeganej jasności obrazu, tylko jego odcień

Część narzędzi (klasyczne „Hue” w edytorach zdjęć w rodzaju Photoshopa) implementuje ten sam efekt inaczej — jako przesunięcie kąta H w przestrzeni HSV/HSL, gdzie hue to wprost kąt na kole barw, a nie obrót w płaszczyźnie chrominancji YCbCr. Obie implementacje dążą do tego samego efektu wizualnego, ale nie są matematycznie identyczne — kolejny przykład (po „lift” z Rozdziału 7) tego, że ta sama nazwa parametru w dwóch programach nie gwarantuje identycznego wzoru pod spodem.

Etap: Białe wyważenie

Biel jako punkt odniesienia, nie jako założenie

Materiał nakręcony pod ciepłym światłem żarowym albo pod chłodnym niebem bez chmur ma przesunięty balans kolorów, zanim ktokolwiek dotknie gradingu — to, co powinno być neutralnie białe (karta szara, biała koszula), rejestruje się z domieszką pomarańczu albo błękitu. Najprostsza korekta — białe wyważenie — mnoży każdy kanał osobno tak, żeby zmierzony neutralny punkt stał się dokładnie (1; 1; 1):

gain_R = 1 / R_zmierzone    gain_G = 1 / G_zmierzone    gain_B = 1 / B_zmierzoneR/G/B_zmierzone — wartości, jakie zarejestrował sensor dla punktu, który powinien być neutralnie biały; po pomnożeniu przez te gainy ten punkt rzeczywiście staje się (1,1,1)
Policzone: korekta ciepłego oświetlenia na podstawie karty szarej
Karta szara, zmierzona = (1,15; 1,00; 0,80) (wyraźna domieszka ciepła — nadmiar R, niedobór B)
gain_R = 1/1,15 ≈ 0,870   gain_G = 1/1,00 = 1,000   gain_B = 1/0,80 = 1,250
Próbka skóry przed korektą = (0,850; 0,650; 0,550)
Po korekcie: (0,850·0,870; 0,650·1,000; 0,550·1,250) ≈ (0,740; 0,650; 0,688)
Skóra traci część ciepłego nalotu — kanał B wzrósł względem R wyraźnie mocniej niż G, dokładnie odwracając przesunięcie zmierzone na karcie szarej
Sprawdzenie: podstawienie zmierzonej karty szarej (1,15; 1,00; 0,80) do tych samych trzech gainów daje dokładnie (1,000; 1,000; 1,000) — punkt odniesienia rzeczywiście staje się neutralny.

Ta prosta, diagonalna korekta (osobny mnożnik na każdy kanał, bez mieszania między nimi) działa dobrze przy niewielkich przesunięciach, ale to w istocie uproszczona, przybliżona wersja czegoś bardziej ogólnego: adaptacji chromatycznej. Przy dużych przesunięciach temperatury barwowej (bardzo ciepłe światło świecy kontra bardzo chłodne zachmurzone niebo) sama korekta diagonalna w RGB zaczyna dawać zauważalnie inne rezultaty niż to, jak faktycznie adaptuje się ludzkie oko — stąd transformacje von Kriesa i Bradforda, które tę samą ideę wykonują w przestrzeni lepiej dopasowanej do fizjologii widzenia (tej samej, której użyto już przy okazji różnicy D65/D60 w Rozdziale 4). Pełny wywód — łącznie z tym, dlaczego prosta diagonalna korekta czasem wystarcza, a czasem nie — jest w Dodatku E.

Etap: W praktyce

Trzy operatory, jeden node

Saturacja i obrót barwy niemal zawsze siedzą w tym samym node'zie co offset/gain/gamma z Rozdziału 7 — aiColorCorrect w Arnoldzie wystawia wprost parametry saturation i hue_shift obok exposure i kontrastu z Rozdziału 9; PxrColorCorrect w RenderManie ma bezpośrednie odpowiedniki. Białe wyważenie bywa potraktowane osobno, czasem jako parametr „temperature/tint” bliższy językowi fotografii niż surowym gainom kanałów — Dodatek E pokazuje, jak taki parametr temperaturowy przekłada się z powrotem na dokładnie te same gainy albo macierze, które poznałeś w tym rozdziale.

Słowniczek
Macierz saturacji
Macierz 3×3 zbudowana z luma i parametru sat; wiersze zawsze sumują się do 1, żeby zachować biel.
Chrominancja
Informacja o kolorze niezależna od jasności — w YCbCr para składowych Cb, Cr.
Hue rotation (obrót barwy)
Obrót wektora chrominancji o zadany kąt przy zachowanej luma i odległości od luma (saturacji).
Białe wyważenie
Korekta koloru sprawiająca, że wybrany neutralny punkt staje się (1,1,1); w prostej wersji — osobny gain na kanał.
Adaptacja chromatyczna
Ogólniejsza, fizjologicznie dokładniejsza wersja białego wyważenia — pełny wywód w Dodatku E.