Ga naar hoofdinhoud
BVDART Logo

Het mysterie van gamma-correctie

⊘ Deep Dive• 5 min leestijd
gammalinearizationcolor-mathrgb
Een veelgemaakte fout bij het berekenen van RGB-afstand is het negeren van gamma. Waarom je RGB-waarden eerst moet linearizeren voordat je ermee rekent, en wat er misgaat als je dat niet doet.

De Verborgen Curve

Als je een RGB-waarde leest van (128, 128, 128) uit een beeldbestand, denk je misschien dat die precies de helft van de helderheid van (255, 255, 255) weergeeft. Dat is niet zo. Hij vertegenwoordigt ongeveer 21,5% van de fysieke lichtintensiteit — minder dan een kwart. Dit verschil is het gevolg van gamma-encoding, en het negeren daarvan is een van de meest gemaakte fouten in kleur­berekeningen.

Een opgeslagen waarde is geen lichtsterkte

Gelijke codestappen
Gelijke lichtstappen
Stuksgewijze sRGB-decodeercurve en gekozen kanaal101Gecodeerd kanaal CLineair licht
Curveweergave
C 0.50000 → 0.21404 lineair((C + 0.055) / 1.055)^2.4Breekpunt C = 0.04045

Beide verlopen lopen van zwart tot de gekozen C en eindigen bij hetzelfde weergegeven grijs. Het ene verdeelt opgeslagen waarden gelijk; het andere verdeelt licht gelijk en codeert dit voor het scherm. Decoderen is een bekende overdrachtsfunctie, anders dan de creatieve gammacorrectie in het Lab.

De twee toonverlopen veranderen met het gekozen kanaal: gelijke code- en lichtstappen bereiken hetzelfde grijs. Daarna zoomt de curve in bij zwart. Gebruik een regelaar om het over te nemen.

Inspecteer een gecodeerde waarde en zijn exacte sRGB-decodering. De opgeslagen waarde 128/255 is ongeveer 21,6% lineaire intensiteit; de creatieve gammaregelaar in het Lab is een afzonderlijke bewerking.

Probeer het zelf
  1. Verplaats Gecodeerd kanaal C en vergelijk de gemeten lineaire waarde met beide verlopen.
  2. Kies Bij zwart en beweeg door het breekpunt C = 0.04045.

Let op: C = 0,5 decodeert naar ongeveer 0,214. Bij zwart gebruikt sRGB een lineair segment; gelijke stappen in opgeslagen waarden en in licht geven verschillende verlopen.

Volledige uitleg Open in het Lab

Waarom Gamma Bestaat

Gamma-encoding heeft historische wortels in CRT-monitoren, waarvan de fosforlaag niet-lineair reageerde op spanning — grofweg een machtscurve met γ ≈ 2,2. Beeldbestanden worden gecodeerd met de inverse curve (γ ≈ 1/2,2 ≈ 0,4545) zodat de niet-lineariteit van de CRT wordt opgeheven en het beeld er correct uitziet.

Maar er is een diepere reden dat gamma in het LCD-tijdperk blijft bestaan: het sluit aan bij het menselijk zicht. We zijn veel gevoeliger voor verschillen in donkere tonen dan in lichte. Gamma-encoding reserveert meer van het 0–255-bereik voor donkere waarden, waar we de fijnste nuances kunnen onderscheiden, en perst de lichte samen, waar we minder kritisch zijn. Het is een vorm van perceptuele compressie.

Het wiskundige probleem

Als je het gemiddelde van twee kleuren berekent — bijvoorbeeld het mengen van (255, 0, 0) (rood) en (0, 0, 0) (zwart) — dit rechtstreeks doen in gamma-gecodeerde sRGB levert je (128, 0, 0) op. Maar fysisch gezien vraagt het juiste middenpunt om eerst te linearizeren, dan te middelen in lineaire ruimte, en daarna opnieuw te encoderen:

Lineair rood = 1,0, lineair zwart = 0,0. Gemiddelde = 0,5. Terug naar sRGB gecodeerd ≈ (188, 0, 0). Het verschil is enorm — de gamma-naïeve blend is zichtbaar donkerder dan hij zou moeten zijn.

Linearizatie in de praktijk

De sRGB-standaard definieert een precieze overdrachtsfunctie (iets complexer dan een eenvoudige machtscurve, met een lineair segment dicht bij zwart). Om te linearizeren:

Normaliseer voor elk kanaal naar [0, 1] en pas dan toe: als V ≤ 0,04045, dan V_linear = V / 12,92; anders V_linear = ((V + 0,055) / 1,055) ^ 2,4. De inverse (lineair naar sRGB) draait dit om.

Bewerkingen die het optellen of middelen van licht modelleren, moeten lineaire lichtwaarden gebruiken voordat het resultaat voor weergave wordt gecodeerd. Andere bewerkingen hebben andere doelen: perceptuele kleurafstanden gebruiken bijvoorbeeld CIELAB, terwijl een bewerking in gecodeerde ruimte een bewuste artistieke keuze kan zijn. Geef aan welk model een berekening gebruikt.

Gamma en Dithering

Floyd–Steinberg verspreidt het verschil tussen een monster en het gekwantiseerde resultaat. Berekening in lineair licht richt zich op behoud van een lokaal gemiddelde van fysiek licht; berekening in gecodeerd sRGB behoudt een ander numeriek gemiddelde en geeft een ander tonaal resultaat. Vergelijk die doelen expliciet en behandel gammacorrectie niet als uitwisselbaar met sRGB-decodering.

De Kernboodschap

Gamma is geen obscure technische voetnoot — het is de meest impactvolle correctie die je op elk kleuralgoritme kunt toepassen. Het verschil tussen gamma-naïeve en gamma-correcte verwerking is vaak duidelijker zichtbaar dan het verschil tussen compleet verschillende algoritmes.

De gamma-expansiestudie toont de exacte sRGB-decodeerfunctie en vergelijkt gelijke stappen in opgeslagen waarden met gelijke stappen in licht. De Gamma-aanpassing in het Lab is een afzonderlijke creatieve machtscurve. Lab-bewerkingen delen niet allemaal één kleurmodel: de geïndexeerde kwantisatiemethode wijst kleuren bijvoorbeeld toe op basis van Euclidische afstand in gecodeerd RGB.

Gerelateerde concepten

Gerelateerde artikelen

Verken gerelateerde secties

Meer over het werk: