Beste Tweakers,
Om kleuren voor pixels te berekenen in een vierkante afbeelding heb ik een methode nodig, waar ik wellicht door een denkkronkel maar niet uit kom. Graag zou ik jullie hulp krijgen om die kronkel recht te maken.
Er zijn verschillende manieren om een kleur te definieren. We kennen allemaal wel het RGB model wel denk ik. Het geeft aan hoever respectievelijk het kanaal voor rood ( R ), groen ( G ) en blauw ( B ) open staat. Alle drie op 100% geeft wit, alle drie op 0% geeft zwart. Zo is 100%, 0%, 0% een volledig rood. Er zijn ook een modellen die meer aansluiten bij de manier waarop mensen kleuren waarnemen. Een van die modellen gebruikt als een van de dimensies de HUE. Dit kun je zien als een cirkel waarbij het waarneembare licht uit het spectrum van rood (0 graden) via oranje, geel, groen (120 graden), cyaan, blauw (240 graden) weer terug gaat naar rood (360 graden, of 0 graden).
Daarna zijn er verschillende manieren om met twee andere dimensies bij de kleur te komen die je zoekt. Ik gebruik een model waarbij je de verzadigdheid (saturation) aanduidt als een waarde van de HUE (100%) naar zwart (0%). Een andere dimensie is lightness/lumination, die van HUE (0%) naar wit loopt (100%). Je kunt discussieren of 0% lightness de HUE-kleur aanduidt of zwart. Ik kies voor de HUE-kleur. Daarnaast kun je discussieren of een een kleur waarbij de HUE irrelevant is (als saturation en lightness allebei 100% zijn) of dat zwart of wit is. Ik kies voor wit.
Dit kun je voor een willekeurige HUE weergeven als een vierkant met assen saturation (horizontale as) en lightness (verticale as). Dit vierkant toont links boven de betreffende HUE-kleur, rechts boven is zwart en beide hoeken in de onderkant zijn wit.
Er is een eenvoudige oplossing, waar ik niet naar op zoek ben maar wel het gewenste resultaat geeft: We hebben drie vierkanten die we over elkaar leggen, van onder naar boven noemen we die 1, 2 en 3. Vierkant 1 heeft elke pixel op de kleur van de HUE staan, met de andere kanalen 'uit'. Indien de HUE 0 is, kleur je dus een rood vierkant rgb(100%, 0%, 0%). Vierkanten 2 en 3 bevatten een alpha-kanaal: 100% alpha is volledig zichtbaar, 0% alpha is volledig doorzichtig. Over 1 leggen we vierkant 2, die volledig zwart is met een horizontale, lineaire gradient heeft in het alpha-kanaal van links 0% (doorzichtig) naar 100% (zwart). Vierkant 3 vervult vergelijkbaar die rol voor wil, maar dan met een verticale, lineaire gradient van boven 0% naar onder 100% (wit). Dit levert het figuur op dat ik zoek, echter niet op de manier die ik zoek. Zie deze afbeelding:

Ik wil 'vierkant' 2 en 3 in een enkele afbeelding vatten, met een onbekende HUE. Dit generieke vierkant zou je kunnen tekenen met wit-naar-zwart-waarden, als je een alpha-kanaal toevoegt. Door 'achter' dit vierkant een vierkant te plaatsen die volledig de kleur van de HUE heeft zou je het bedoelde vierkant moeten zien verschijnen op een scherm.
Laten we de horizontale as x noemen, die van 0 naar 1 loopt, de verticale as noemen we y, die ook van 0 naar 1 loopt.
De grijstint voor een pixel in het vierkant weet je door de richtingscoefficient rc = y / x te nemen van (0, 0) (links boven) naar het betreffende punt P (x, y). Doordat de onderkant van het vierkant volledig wit is, weet je dat als rc >= 1, P(x, y) wit is.
Doordat je weet dat aan de rechter zijde van het vierkant de tint verloopt van zwart (boven) naar wit (onder) neem je de grijswaarde van coordinaat P(1, z), waarbij z de lineaire extrapolatie is van y met de rc (en met een rc die kleiner is dan 1, geeft dit een z van 0 naar 1). Dit levert onderstaande figuur op.

Nu het alpha-kanaal. Die verkrijg je volgens mij door y te nemen en daarbij de x-waarde op te tellen van het gedeelte dat y nog 'doorlaat'. Met ander woorden de alpha van P(x, y) = y + ((1 - y) * x). Dit levert de volgende figuur op.

Merk op dat er onbedoeld een zichtbare 'witte' lijn-achtig loopt van linksboven naar rechtsonder. Hoe kan dit? Wat zit er mis in mijn methode? Gaat het bij de berekening van grijswaarde fout of zit het in het alpha kanaal? Of is mijn methode sowieso een verkeerde denkwijze?
Als we 100% op waarde 255 stellen en 0% op 0 (het model in 8 bits per kanaal in RGB voor HTML), dan zou ik in het midden 191, 128, 128 verwachten. In de afbeelding hierboven is dat duidelijk niet zo.
Bedankt voor het lezen van deze lange post en nog meer dank voor het meedenken.
Om kleuren voor pixels te berekenen in een vierkante afbeelding heb ik een methode nodig, waar ik wellicht door een denkkronkel maar niet uit kom. Graag zou ik jullie hulp krijgen om die kronkel recht te maken.
Er zijn verschillende manieren om een kleur te definieren. We kennen allemaal wel het RGB model wel denk ik. Het geeft aan hoever respectievelijk het kanaal voor rood ( R ), groen ( G ) en blauw ( B ) open staat. Alle drie op 100% geeft wit, alle drie op 0% geeft zwart. Zo is 100%, 0%, 0% een volledig rood. Er zijn ook een modellen die meer aansluiten bij de manier waarop mensen kleuren waarnemen. Een van die modellen gebruikt als een van de dimensies de HUE. Dit kun je zien als een cirkel waarbij het waarneembare licht uit het spectrum van rood (0 graden) via oranje, geel, groen (120 graden), cyaan, blauw (240 graden) weer terug gaat naar rood (360 graden, of 0 graden).
Daarna zijn er verschillende manieren om met twee andere dimensies bij de kleur te komen die je zoekt. Ik gebruik een model waarbij je de verzadigdheid (saturation) aanduidt als een waarde van de HUE (100%) naar zwart (0%). Een andere dimensie is lightness/lumination, die van HUE (0%) naar wit loopt (100%). Je kunt discussieren of 0% lightness de HUE-kleur aanduidt of zwart. Ik kies voor de HUE-kleur. Daarnaast kun je discussieren of een een kleur waarbij de HUE irrelevant is (als saturation en lightness allebei 100% zijn) of dat zwart of wit is. Ik kies voor wit.
Dit kun je voor een willekeurige HUE weergeven als een vierkant met assen saturation (horizontale as) en lightness (verticale as). Dit vierkant toont links boven de betreffende HUE-kleur, rechts boven is zwart en beide hoeken in de onderkant zijn wit.
Er is een eenvoudige oplossing, waar ik niet naar op zoek ben maar wel het gewenste resultaat geeft: We hebben drie vierkanten die we over elkaar leggen, van onder naar boven noemen we die 1, 2 en 3. Vierkant 1 heeft elke pixel op de kleur van de HUE staan, met de andere kanalen 'uit'. Indien de HUE 0 is, kleur je dus een rood vierkant rgb(100%, 0%, 0%). Vierkanten 2 en 3 bevatten een alpha-kanaal: 100% alpha is volledig zichtbaar, 0% alpha is volledig doorzichtig. Over 1 leggen we vierkant 2, die volledig zwart is met een horizontale, lineaire gradient heeft in het alpha-kanaal van links 0% (doorzichtig) naar 100% (zwart). Vierkant 3 vervult vergelijkbaar die rol voor wil, maar dan met een verticale, lineaire gradient van boven 0% naar onder 100% (wit). Dit levert het figuur op dat ik zoek, echter niet op de manier die ik zoek. Zie deze afbeelding:

Ik wil 'vierkant' 2 en 3 in een enkele afbeelding vatten, met een onbekende HUE. Dit generieke vierkant zou je kunnen tekenen met wit-naar-zwart-waarden, als je een alpha-kanaal toevoegt. Door 'achter' dit vierkant een vierkant te plaatsen die volledig de kleur van de HUE heeft zou je het bedoelde vierkant moeten zien verschijnen op een scherm.
Laten we de horizontale as x noemen, die van 0 naar 1 loopt, de verticale as noemen we y, die ook van 0 naar 1 loopt.
De grijstint voor een pixel in het vierkant weet je door de richtingscoefficient rc = y / x te nemen van (0, 0) (links boven) naar het betreffende punt P (x, y). Doordat de onderkant van het vierkant volledig wit is, weet je dat als rc >= 1, P(x, y) wit is.
Doordat je weet dat aan de rechter zijde van het vierkant de tint verloopt van zwart (boven) naar wit (onder) neem je de grijswaarde van coordinaat P(1, z), waarbij z de lineaire extrapolatie is van y met de rc (en met een rc die kleiner is dan 1, geeft dit een z van 0 naar 1). Dit levert onderstaande figuur op.

Nu het alpha-kanaal. Die verkrijg je volgens mij door y te nemen en daarbij de x-waarde op te tellen van het gedeelte dat y nog 'doorlaat'. Met ander woorden de alpha van P(x, y) = y + ((1 - y) * x). Dit levert de volgende figuur op.

Merk op dat er onbedoeld een zichtbare 'witte' lijn-achtig loopt van linksboven naar rechtsonder. Hoe kan dit? Wat zit er mis in mijn methode? Gaat het bij de berekening van grijswaarde fout of zit het in het alpha kanaal? Of is mijn methode sowieso een verkeerde denkwijze?
Als we 100% op waarde 255 stellen en 0% op 0 (het model in 8 bits per kanaal in RGB voor HTML), dan zou ik in het midden 191, 128, 128 verwachten. In de afbeelding hierboven is dat duidelijk niet zo.
Bedankt voor het lezen van deze lange post en nog meer dank voor het meedenken.
[ Voor 0% gewijzigd door Jurgle op 20-07-2017 13:57 . Reden: B met een ) wordt een smiley, ik heb maar spaties toegevoegd... ]
My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant