I generally don't think most situations can be labeled as black or white - Heath Ledger

In deze blog leg ik de technische achtergronden uit die op de website zijn gebruikt voor het genereren van histogrammen. Het eerste deel van deze uitleg gaat over kleurmodellen en conversie naar grijswaarden.

Wat is een digitale foto eigenlijk?

Als je een foto maakt met een digitale camera vangt de sensor in de camera het licht op dat door de lens valt en converteert dit in elektrische signalen. Deze signalen worden vervolgens door de camera verwerkt en omgezet in een digitaal beeld. 

Het digitale beeld bestaat uit een raster van kleine gekleurde puntjes, ook wel pixels genoemd. Elke pixel heeft een specifieke kleurwaarde die wordt opgeslagen als een combinatie van rode, groene en blauwe (RGB) waarden. De kleurdiepte van de afbeelding bepaalt hoeveel bits er worden gebruikt om elke kleurwaarde op te slaan. De Sony a7iv heeft bijvoorbeeld 33 miljoen pixels. Van al deze pixels wordt informatie opgeslagen. 

Kleurdiepte

Kleurdiepte (ook bekend als bitdiepte) verwijst naar het aantal bits dat wordt gebruikt om de kleurinformatie van elk pixel in een digitale afbeelding op te slaan. Dit bepaalt het aantal kleuren dat in de afbeelding kan worden weergegeven.

Bijvoorbeeld, een afbeelding met een kleurdiepte van 8 bits per pixel kan maximaal 256 kleuren weergeven (2 tot de macht van 8), terwijl een afbeelding met een kleurdiepte van 24 bits per pixel meer dan 16 miljoen kleuren kan weergeven (2 tot de macht van 24). De Sony A7iv heeft een kleurdiepte van 10bits.

Een hogere kleurdiepte leidt tot meer nauwkeurige en gedetailleerde kleurweergave in de afbeelding, maar vereist ook meer geheugen en rekenkracht om te verwerken.

Kleurmodellen

Het weergeven van kleuren als numerieke waarden is in veel toepassingen een noodzakelijke stap. Om dit te doen, gebruiken we modellen die wiskundige modellen zijn die manieren beschrijven om kleuren toe te wijzen aan een reeks getallen. Gewoonlijk definieert een kleurmodel drie of vier kleurcomponenten die gemakkelijk kunnen worden beschreven via een coördinatensysteem. Elke kleur die het model kan weergeven komt overeen met een punt in dit coördinatensysteem.

Naast deze waarden geven die modellen ook een beschrijving van hoe deze componenten moeten worden geïnterpreteerd om een kleur te genereren.

  1. RGB
    Het meest bekende kleurmodel is RGB wat staat voor Rood-Groen-Blauw. Zoals de naam al doet vermoeden, vertegenwoordigt dit model kleuren met individuele waarden voor rood, groen en blauw. Het RGB-model wordt gebruikt in bijna alle digitale schermen over de hele wereld.

    Concreet wordt een kleur gedefinieerd met behulp van drie gehele waarden van 0 tot 255 voor rood, groen en blauw, waarbij een nulwaarde donker betekent en een waarde van 255 helder betekent. Gezien de waarden wordt de uiteindelijke kleur bepaald wanneer we deze drie basiskleuren mengen, gewogen naar hun waarden.

    Als we de drie kleuren gelijkmatig mengen (RGB = (255, 255, 255)), krijgen we wit terwijl de afwezigheid van alle kleuren (RGB = (0, 0, 0)) zwart betekent. Hieronder staat het RGB-coördinatensysteem waar we alle verschillende kleuren kunnen zien die het model kan beschrijven:
  2. Grijstinten
    Grijstinten is het eenvoudigste model omdat het kleuren definieert met slechts één component, namelijk lichtheid. De hoeveelheid lichtheid wordt beschreven met een waarde variërend van 0 (zwart) tot 255 (wit).

    Aan de ene kant geven afbeeldingen in grijswaarden minder informatie weer dan RGB. Ze komen echter veel voor bij beeldverwerking omdat het gebruik van een afbeelding in grijswaarden minder beschikbare ruimte vereist en sneller is, vooral als we te maken hebben met complexe berekeningen.

    Hieronder zien we het volledige kleurengamma dat het grijswaardenmodel kan beschrijven:

  3. Anderen
    Afhankelijk van de use case zijn er door de jaren heen talloze modellen voorgesteld. Het CMYK-model wordt bijvoorbeeld gebruikt bij het afdrukken en beschrijft kleuren met behulp van waarden voor cyaan, magenta, geel en zwart. HSL en HSV zijn twee kleuren die door kunstenaars worden gebruikt, omdat ze beter aansluiten bij de manier waarop de menselijke visie een kleur waarneemt. De basiscomponenten zijn respectievelijk tint, verzadiging en lichtheid of waarde.

Converteer RGB naar grijstinten

Hoe kom je nu van RGB naar grijswaarden. Aangezien deze modellen gebaseerd zijn op verschillende interpretaties van kleurperceptie (primaire kleuren en lichtheid), is er geen perfecte manier voor conversie. Er zijn enkele veelgebruikte methoden, zoals die hieronder.

  1. Lightness method
    Een heel eenvoudige methode is om de gemiddelde waarde te nemen van de componenten met de hoogste en laagste waarde:

    grijswaarden = min(R,G,B) + max(R,G,B) 2

    We kunnen gemakkelijk zien dat deze methode een zeer ernstige zwakte vertoont, aangezien er geen RGB-component wordt gebruikt. Dit is absoluut een probleem, omdat de hoeveelheid lichtheid die ons oog waarneemt, afhangt van alle drie de basiskleuren.

  2. Gemiddelde methode
    Een andere methode is om de gemiddelde waarde van de drie componenten (rood, groen en blauw) als grijswaardenwaarde te nemen:


    grijswaarden = R + G + B3

    Hoewel we nu rekening houden met alle componenten, is de gemiddelde methode ook problematisch omdat deze aan elk onderdeel hetzelfde gewicht toekent. Op basis van onderzoek naar het menselijk gezichtsvermogen weten we dat onze ogen op een andere manier op elke kleur reageren. In het bijzonder zijn onze ogen gevoeliger voor groen, dan voor rood en ten slotte voor blauw. Daarom moeten de gewichten in de bovenstaande vergelijking veranderen.

  3. Luma coding of Luminosity Method 
    De beste methode is de Luma coding die de problemen van eerdere methoden met succes oplost. Ik heb er geen goede Nederlandse vertaling voor gevonden.
    Op basis van bovenstaande observaties zouden we een gewogen gemiddelde moeten nemen van de componenten. De bijdrage van blauw aan de eindwaarde moet afnemen en de bijdrage van groen moet toenemen. Na enkele experimenten en meer diepgaande analyse hebben onderzoekers de onderstaande vergelijking geconcludeerd:


    grijswaarden = 0.2989 * R + 0.5870 * G + 0.1140 * B

Op deze website genereer ik bij elke foto een histogram. Op de histogram worden de 3 elementaire kleuren getoond, rood, groen en blauw plus de grijswaarden die worden berekend met de Luminosity Method (gewogen gemiddelde). Meer hierover in een volgende blog.