semmixkolor i percepcja

Paleta kolorów

Zamiast zapisywać barwę każdego piksela, można zapisać krótką listę barw, paletę, a w pikselach tylko numery pozycji z tej listy. Tak działają GIF i PNG z paletą. Obraz zajmuje mniej miejsca, ale może mieć najwyżej tyle kolorów, ile ma paleta.

Kolor indeksowany

paleta: 0 → (200, 80, 40) #c85028 1 → (255, 255, 255) biel 2 → (0, 0, 0) czerń 3 → (27, 152, 224) błękit piksele: 0 0 1 1 0 3 3 1 każdy piksel to 2 bity zamiast 24

Liczba bitów na piksel wynika z rozmiaru palety: 1 bit to 2 kolory, 4 bity to 16, 8 bitów to 256. W GIF paleta ma zawsze 2, 4, 8, ... 256 pozycji (zob. opis ekranu logicznego), w PNG dowolną liczbę od 1 do 256.

Dobór palety

Zdjęcie ma zwykle dziesiątki tysięcy różnych kolorów. Zamiana go na 256 kolorów to kwantyzacja. Najczęstsze metody:

Najbliższy kolor z palety

Gdy paleta jest ustalona, każdy piksel dostaje numer najbliższego koloru. "Najbliższy" najprościej liczyć w RGB, ale lepsze wyniki daje odległość w CIELAB, bo odpowiada temu, co widzi oko. Przykład dla palety web-safe:

#c85028 = (200, 80, 40) najbliższe składowe z {0, 51, 102, 153, 204, 255}: 204, 102, 51 → #cc6633 Lab: (49,71; 45,77; 46,31) → (54,64; 36,91; 46,12) ΔE = 10,1 (różnica wyraźnie widoczna)

Dithering

Gdy kolorów jest za mało, gradienty zamieniają się w pasy. Dithering ukrywa to, mieszając sąsiednie kolory palety w drobny wzór, który oko uśrednia (zob. mieszanie średniujące).

Najpopularniejszy jest dithering Floyda-Steinberga (1976): błąd między kolorem piksela a kolorem z palety rozdziela się na sąsiadów, którzy jeszcze nie zostali przetworzeni:

piksel 7/16 3/16 5/16 1/16 błąd = kolor oryginalny - kolor z palety sąsiad po prawej += błąd · 7/16 sąsiad niżej z lewej += błąd · 3/16 sąsiad niżej += błąd · 5/16 sąsiad niżej z prawej += błąd · 1/16

W naszym przykładzie błąd czerwieni to 200 - 204 = -4, zieleni 80 - 102 = -22, błękitu 40 - 51 = -11. Piksel po prawej dostaje więc (-1,75; -9,6; -4,8), co przesuwa go w stronę ciemniejszego koloru z palety i średnio daje barwę bliższą oryginału.

Alternatywa to dithering uporządkowany z macierzą Bayera: stały wzór progów, szybszy i stabilny w animacjach (nie "migocze" między klatkami), ale z widoczną regularną fakturą.

Błąd przy ditheringu warto liczyć w świetle liniowym, a nie na wartościach z gamma. Inaczej jasne i ciemne obszary wychodzą lekko przesunięte (zob. korekcja gamma).