De RGB-waarden die in digitale beelden worden opgeslagen, zijn geen lineaire weergave van lichtintensiteit. Ze zijn gamma-gecodeerd — gecomprimeerd via een machtscurve — om aan te sluiten bij de niet-lineaire gevoeligheid van het menselijk zicht en om efficiënter om te gaan met beperkte bitdiepte. Voor je wiskundig correcte kleurbewerkingen uitvoert, moet je deze codering eerst omkeren via gamma-expansie.
Waarom Gamma Bestaat
Het menselijk zicht is gevoeliger voor verschillen in donkere tonen dan in lichte tonen. Gamma-encoding reserveert meer van het beschikbare bitbereik voor donkere waarden, waar onze ogen beter onderscheid maken. Een 8‑bit kanaal dat lineair licht opslaat, zou zichtbare banding in schaduwen vertonen; met gamma-encoding worden die 256 stappen gelijkmatiger over onze waarneming verdeeld.
De sRGB-overdrachtsfunctie
De standaard sRGB-gammacurve is geen eenvoudige machtsfunctie. Ze heeft een lineair segment rond nul en een machtssegment voor de rest:
function srgbToLinear(c: number): number {
// c is 0–1 (sRGB encoded)
return c <= 0.04045
? c / 12.92
: Math.pow((c + 0.055) / 1.055, 2.4)
}
function linearToSrgb(c: number): number {
// c is 0–1 (linear light)
return c <= 0.0031308
? c * 12.92
: 1.055 * Math.pow(c, 1 / 2.4) - 0.055
}Impact op afstandsberekeningen
Als je de Euclidische afstand direct op gamma-gecodeerde waarden berekent, worden kleurverschillen in donkere tinten overdreven en in lichte tinten samengedrukt. Een afstand van 10 tussen twee donkere grijzen oogt veel significanter dan een afstand van 10 tussen twee lichte gelen. Eerst linearizeren zorgt ervoor dat gelijke afstanden overeenkomen met gelijke fysieke verschillen in lichtenergie.
Wanneer je het kunt overslaan
Voor palette-extractie via kleurclustering (zoals in onze Studio-tools) is het doel perceptuele overeenkomst in plaats van fysieke nauwkeurigheid. In dat geval is direct werken in sRGB met een royale afstandsdrempel vaak voldoende en veel sneller. De fysieke fout is acceptabel omdat de groepsdrempel die al grotendeels opvangt.
