Om een klein voorbeeld te geven in hoeverre je kwaliteitsverlies kunt voorkomen en precisie verhogen tijdens het bewerken van foto's in photoshop.
Hierbij maak ik een vergeleiking tussen standaard RGB/8 (8bits kleuren per kanaal) VS RGB/16.
Om deze vergeleiking zo eerlijk mogelijk te maken, ga ik uit van een RAW file die RGB/12 (12 bits per kleurkanaal) waarin de 12bits een lineaire representatie zijn van het RGB kleurenspectrum.
In de toestand van situatie 1 (RGB/8) gaat er dus van de RAW file RGB/12 een conversie naar RGB/8 waarna we de bewerkingen gaan uitvoeren.
In situatie 2 (RGB/16) gaan we van de RAW file RGB/12 een conversie maken naar RGB/16 waarna we de bewerkingen gaan uitvoeren, en daarna omzetten naar RGB/8 zodat we de resultaten kunnen vergeleiken.
Als inleiding tot RGB is dit handig om door te nemen:
http://nl.wikipedia.org/wiki/RGB
Als voorbeeld gebruik ik een simpele bewerking, namelijk het aanpassen van kleurbalans.
De algemene formule hiervan is
R = (1 + r_factor) * R; G = (1+ g_factor) * G; B = (1+ b_factor) * B;
We pakken een willekeurige pixel uit een foto.
Situatie 1
Deze heeft uit het raw formaat 12 bits kleuren per kanaal. Deze gaan we dus eerst omzetten naar 8bits kleuren.
Dit kun je doen door het 12 bits getal te delen door 16 (2^4). Immers het aantal waarden in 12 bits = 4096. 4096 / 16 = 256 wat het aantal waarden is in 8bits.
code:
1
2
3
| R = 100101011011 (2395) / 16 = 10010110 (150)
G = 011100010110 (1814) / 16 = 01110001 (113)
B = 001101000001 (0833) / 16 = 00110100 (052) |
Stel we nemen als
r_factor = 0.50; g_factor = -0.50; en b_factor = -0.02;
Als het je opvalt, kun je zien dat de formule die we net aangaven nu niet klopt, omdat deze niet goed kan omgaan met negatieve factors.
Dus we krijgen bij een positieve factor:
R = (1 + r_factor) * R; bij een factor van 0 of kleiner dan 0 krijgen we:
R = R + r_factor * (255 - R);
(255 is hier max. waarde in 8 bits kleurenpalette)
we gaan nu rekenen
code:
1
2
3
4
| r_factor = 50; g_factor = -50; b_factor = -1;
R = ( 1 + r_factor) * R; ingevuld: R = ( 1 + 0.50) * 150; R = 225
G = G + g_factor * (255 - G); ingevuld: G = 113 + -0.50 * (255 - 113); G = 42
B = B = b_factor * (255 - B); ingevuld: B = 052 + -0.02 * (255 - 052); B = 48 |
Uiteindelijk krijgen we voor deze bewerking op deze pixel dus een waarde van
(225,42,48) (RGB/8)
Situatie 2
We gaan nu dezelfde bewerking uitvoeren op de zelfde pixel. Echter gaan we de bewerking uitvoeren in RGB/16 waarna we het omzetten naar RGB/8
Eerst moeten we de 12bits waarde omzetten naar een 16bits waarde. Dit is te doen door alle waardes te vermenigvuldigen met 16(2^4).
code:
1
2
3
| R = 100101011011 (2395) * 16 = 1001010110110000 (38320)
G = 011100010110 (1814) * 16 = 0111000101100000 (29024)
B = 001101000001 (0833) * 16 = 0011010000010000 (13328) |
We nemen dezelfde factoren als in het eerste voorbeeld.
Echter moeten we de formules een klein beetje aanpassen
de formule voor een positieve factor blijft:
R = (1 + r_factor) * R; de formule voor negatieve factor wordt:
R = R + r_factor * ( 65535 - R);
(65535 is max waarde in 16bits kleurenpallette)
We gaan weer lekker rekenen
code:
1
2
3
4
| r_factor = 50; g_factor = -50; b_factor = -1;
R = (1 + r_factor) * R; ingevuld: R = 1 + 0.50 * 38320; R = 57480
G = G + g_factor * (65535 - G); ingevuld: G = 29024 + -0.50 * (65535 - 29024); G = 10769
B = B + b_factor * (65535 - B); ingevuld: B = 13328 + -0.02 * (65535 - 13328); B = 12284 |
in RGB/16 krijgen we voor deze pixel dus een waarde van (57480, 10769, 12284)
dit moet nog omgezet worden naar RGB/8 dit kan door alles te delen door 2^8 oftewel 256
code:
1
2
3
| 57480 / 256 = 225
10769 / 256 = 42
12284 / 256 = 48 |
dus in RGB/8 een waarde van
(225,42,48) (RGB/8). In dit voorbeeld maakt het toevallig dus geen verschil tussen de bewerking vanaf RGB/8 of RGB/16. Maar je kunt natuurlijk wel bedenken dat er zat situaties zijn dat dit wel het geval is. Zeker met ingewikkeldere bewerkingen.
Dit heeft hetzelfde principe als met je oude wiskunde dat je nooit mocht afronden als je nog met het getal ging doorrekenen.
Ondanks dat dit dus toevallig dezelfde uitwerking heeft in deze situatie, hoop ik dat je zo het een en ander duidelijker is geworden over grafische bewerkingen in verschillende kleurpalletten (RGB/16 vs RGB/8)
Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?