Delta 12/2023

Czego nie da się zobaczyć?

Czy wszystko da się wygooglować? Albo przynajmniej – czy będzie się dało za parę lat, gdy sztuczna inteligencja będzie zdecydowanie bardziej rozwinięta niż ostatni czat GPT-4? Niestety, okazuje się, że wobec niektórych pytań nawet wyszukiwarka Google okazuje się całkowicie bezradna. Doświadczyłem tego ostatnio, chcąc się dowiedzieć, jakiego koloru nie pokażą nam ekrany komputerów. Bo okazuje się, że ekrany nie wyświetlają wszystkich barw, które możemy zobaczyć ludzkim okiem, a tylko niektóre. I to nie dlatego, że są źle robione, ale z pewnych głębszych, bardzo interesujących przyczyn. Ale zacznijmy opowieść od początku.

Jak zapewne większość Czytelników wie, barwy na ekranie komputerów, telewizorów, komórek i innych urządzeń wyświetlane są w systemie RGB (od ang. Red, Green, Blue, czyli kolorów czerwonego, zielonego i niebieskiego). Każdy piksel na ekranie ma dla każdej z trzech barw podaną intensywność w skali od 0 do 255. Przykładowo trójka intensywności RGB (255,0,0) to kolor czerwony, (0,0,255) to niebieski, (255,255,0) to żółty, (0,0,0) to czarny, a (0,0,100) to ciemnoniebieski. Przyzwyczailiśmy się do myślenia, że każdy kolor można reprezentować za pomocą trzech składowych: czerwonej, zielonej i niebieskiej, ale warto zadać sobie pytanie, skąd się to bierze. Przecież światło widzialne składa się z fal o różnych częstotliwościach i na przykład fala o długości 580 nm, którą ludzkie oko odbiera jako kolor żółty, nie jest w żadnym sensie sumą fal o częstotliwościach 650 nm (czerwony dla ludzkiego oka) i 550 nm (zielony dla ludzkiego oka). A jednak kolor żółty reprezentujemy jako trójkę (255,255,0), czyli jako sumę kolorów zielonego i czerwonego. Dlaczego?

Zapewne doświadczeni Czytelnicy wiedzą lub domyślają się, że rozwiązanie zagadki tkwi w tym, jak nasze oczy odbierają kolory. Mianowicie: w ludzkim oku, na siatkówce, znajdują się światłoczułe komórki zwane czopkami. Większość ludzi ma trzy rodzaje czopków, wrażliwych na nieco różne długości fali. Czopki D (od: długofalowe) są najbardziej wrażliwe na światło czerwone, czopki Ś (średniofalowe) są najbardziej wrażliwe na światło zielone, a czopki K (krótkofalowe) są najbardziej wrażliwe na światło niebieskie. Nasz odbiór barwy światła zależy od tego, jak mocno pobudzone są czopki różnych rodzajów, i tylko w ten sposób jesteśmy w stanie odróżniać jedne kolory od drugich. A więc rozważane przez nas dla przykładu światło barwy żółtej pobudza mocno czopki typów D i Ś (czerwone i zielone), a mniej czopki typu K (niebieskie). Wyświetlany przez monitor kolor (255,255,0) również pobudza mocno czopki D i Ś, a słabo czopki K. Dlatego nasze oko widzi ten kolor jako żółty, mimo że nie ma on nic wspólnego z monochromatycznym światłem żółtym.

Po tym wstępie wróćmy jednak do początkowego pytania: czy monitory oparte na systemie RGB wyświetlają wszystkie kolory widoczne dla ludzkiego oka? A raczej poprawniej byłoby zapytać: czy te monitory są w stanie zasymulować dowolną możliwą reakcję czopków naszego oka na padające światło? Odpowiedź, jak już powiedzieliśmy na wstępie, brzmi: nie. Co więcej, każdy monitor działający na podobnej zasadzie, to znaczy wyświetlający trzy lub dowolną inną liczbę podstawowych kolorów, będzie mieć tę samą wadę. Żeby zrozumieć przyczynę tego zjawiska, przyjrzyjmy się dokładniej reakcjom naszego oka. Każde światło jakoś pobudza trzy typy naszych czopków – powiedzmy, że światło o widmie s powoduje sygnał od czopków czerwonych (D) w nasileniu Rs, od czopków zielonych (Ś) w nasileniu Gs, a od czopków niebieskich (K) w nasileniu Bs. A więc całość reakcji na światło s to trójwymiarowy wektor (Rs,Gs,Bs). Warto zadać pytanie: jak wygląda zbiór wszystkich możliwych do uzyskania wektorów – reakcji na światło. Oznaczmy go przez Sr (stożek reakcji), a zatem Sr={(Rs,Gs,Bs):s jest falą elektromagnetyczną}R03. Przypomnijmy, że czopki D, Ś i K reagują nie tylko na światło czerwone, zielone i niebieskie, ale na wiele różnych częstotliwości światła, tylko w różnym natężeniu. Czyli na przykład światło niebieskie pobudza wszystkie czopki, tyle że najbardziej niebieskie, a czerwone i zielone mniej. Dlatego zbiór Sr okazuje się mieć ciekawe geometryczne własności i nie jest po prostu zbiorem wszystkich możliwych wektorów o nieujemnych wartościach R03. Zauważmy najpierw, że zbiór Sr spełnia dwie własności: (1) jeśli vSr, λR+, to również λvSr, oraz (2) jeśli v1,v2Sr, to również v1+v2Sr. Istotnie, jeśli wektor v jest reakcją na jakieś światło s, to wektor λv będzie reakcją na światło λs, czyli światło o tym samym spektrum, tylko λ razy mocniejsze. Natomiast jeśli v1 jest reakcją na światło s1, a v2 jest reakcją na światło s2, to v1+v2 będzie reakcją na światło s1 świecące razem ze światłem s2, czyli na światło s1+s2. To oznacza, że zbiór Sr istotnie spełnia warunki (1) i (2) sformułowane powyżej, zbiory takie nazywamy stożkami. Żeby sobie wyobrazić, jak taki stożek może wyglądać, przyjrzyjmy się zbiorowi T={(x,y,z)R03:x+y+z=1}, czyli trójkątowi rozpiętemu pomiędzy punktami (1,0,0), (0,1,0) oraz (0,0,1). Każdy stożek S ma tę własność, że jego przecięcie z trójkątem T jest zbiorem wypukłym, bo jeśli u,vS, to również αu+(1α)vS dla dowolnego α[0,1]. Co więcej, każdy zbiór wypukły W zawarty w trójkącie T jednoznacznie wyznacza stożek: ten stożek to po prostu wektory ze zbioru W pomnożone przez jakąś liczbę λR+. A zatem żeby wyobrażać sobie stożki, wystarczy patrzeć na ich przecięcia z trójkątem T. Na rysunkach 1 i 2 przedstawione są dwa przykłady stożków: S1 i S2.

Stożki S1 i S2 różnią się od siebie fundamentalnie. Przecięcie stożka S1 i trójkąta T to czworokąt: jego wierzchołkami są wektory v1,v2,v3,v4. Natomiast przecięcie stożka S2 i trójkąta T to koło. Zauważmy, że każdy punkt stożka S1 może być wygenerowany z wektorów v1,v2,v3,v4 poprzez aplikację reguł (1) oraz (2). Istotnie, możemy w ten sposób łatwo przedstawić każdy punkt we wnętrzu czworokąta S1T jako średnią ważoną wektorów v1,,v4, a potem ten wektor dowolnie wydłużyć lub skrócić. W takiej sytuacji mówimy, że stożek S1 jest skończenie generowany, bo da się go wygenerować za pomocą reguł (1) i (2) ze skończonej liczby wektorów. Można łatwo zauważyć, że stożek S jest skończenie generowany wtedy i tylko wtedy, gdy jego przecięcie z trójkątem T jest po prostu wielokątem. Wtedy jest on generowany przez wierzchołki tego wielokąta. Z drugiej strony, jeśli skończona liczba wektorów v1,,vn generuje stożek S, to powstaje on jako otoczka wypukła punktów v1,,vn, która następnie zostaje przeskalowana (możemy skracać lub wydłużać wektory, używając reguły (1)). Czyli stożek S2 nie jest skończenie generowany, bo jego przecięcie z trójkątem T to koło, a nie wielokąt. Intuicyjnie jest to jasne: żeby go wygenerować musielibyśmy użyć wszystkich wektorów na brzegu koła S2T, a tych jest nieskończenie wiele.

Jaki ma to związek z wyświetlaniem barw przez monitor? Otóż okazuje się, że zbiór Sr wszystkich możliwych reakcji oka ludzkiego na światło jest nieco zaokrąglony, a zatem nie jest skończenie generowany. Jaki z tego wniosek? Ano taki, że nie możemy go wygenerować ze skończenie wielu możliwych reakcji przez dodawanie i mnożenie. A przecież to dokładnie próbuje zrobić monitor. Światło r=(255,0,0) to kolor czerwony, wywołuje on jakiś wektor reakcji vr=(Rr,Gr,Br) w naszych oczach. Światło zielone wywołuje jakiś inny wektor reakcji vg, a światło niebieskie jeszcze inny wektor reakcji vb. W związku z tym wszystkie możliwe reakcje, które monitor może wywołać w naszych oczach, to stożek generowany przez trzy elementy: wektory vr, vg oraz vb (tak naprawdę jeszcze dodatkowo ograniczony, bo monitor ma tylko 256 różnych nasileń światła i nie może też świecić dowolnie mocno, ale to z naszej perspektywy nieistotne). W szczególności niektóre możliwe reakcje z Sr nie dadzą się wywołać przez monitor. I to nie tylko taki, który ma trzy rodzaje pikseli, ale również taki, który miałby 10 albo 1000 rodzajów pikseli. Wciąż znajdą się jakieś reakcje na brzegu stożka reakcji Sr, których nie da się wywołać przez sumowanie tych 1000 rodzajów pikseli!

Specjaliści od grafiki starają się radzić sobie z tym fenomenem, jak mogą. Tworzą w szczególności różne skończenie generowane możliwe stożki barw: sRGB, AdobeRGB, ProPhotoRGB i inne, które lepiej lub gorzej przybliżają Sr. Ale nigdy nie zrobią tego idealnie, bo jest to niemożliwe!

Na koniec zapytajmy: to jakich kolorów nie przedstawia dobrze monitor? Generalnie stożkowi sRGB brakuje wielu kolorów na pograniczu niebieskiego i zielonego, przykładowo kolorów w okolicy cyjanowego. Tę sprawę polecam jednak badać na żywo, bo nie wszystko da się dostrzec w świecie wirtualnym.