2012-06-21 7 views
5

Ho 4 colori che ho convertito da RGB a CIELAB L * a * b * modello.Come calcolare il mix di 4 colori definiti nel modello CIELAB L * a * b *?

  1. Come posso calcolare mix di questi 4 colori quando ho (L,a,b) per ciascun colore?

  2. Come posso calcolare lo stesso mix, se voglio mettere i pesi (w1, w2, w3, w4) su questi 4 colori, avendo 1 peso massimo e 0 minimo (nessuno)?

+4

Cosa ti aspetti da questo mix? Puoi calcolare la media dei 4 colori, componente per componente, con ponderazione, e otterrai colori validi. Ma se saranno i colori che ci si aspetta o no è difficile dire senza ulteriori informazioni. Hai provato a moltiplicare ciascuno per il loro rispettivo peso, quindi sommandoli per componente e dividendo per 4? Se ciò non ti dà quello che ti aspetti, puoi essere più preciso su ciò che ti aspetti? Se pubblichi una foto, sarebbe d'aiuto. – user1118321

+4

Hai appena inserito una serie di tag del linguaggio di programmazione sperando di attirare il maggior numero possibile di spettatori potenziali? – DavidO

+0

@DavidO - Ho incluso i linguaggi di programmazione con cui lavoro da oltre 10 anni. –

risposta

10

Supponendo di avere una struttura come questa:

typedef struct LabColor { 
    uint8_t L; 
    uint8_t a; 
    uint8_t b; 
} LabColor; 

e una serie di 4 di loro:

LabColor colors[4]; 
getMeSomeColors (colors); 

e pesi:

float weights[4]; 
getMeSomeWeights (weights); 

Una possibile blending il metodo sarebbe questo:

float LSum = 0.0; 
float aSum = 0.0; 
float bSum = 0.0; 
float weightSum = 0.0; 
for (int i = 0; i < 4; i++) 
{ 
    LSum += ((float)colors [ i ].L * weights [ i ]); 
    aSum += ((float)colors [ i ].a * weights [ i ]); 
    bSum += ((float)colors [ i ].b * weights [ i ]); 
    weightSum += weights[i]; 
} 
LabColor result; 
result.L = (uint8_t)(LSum/weightSum); 
result.a = (uint8_t)((aSum/weightSum) + 127); 
result.b = (uint8_t)((bSum/weightSum) + 127); 

Questo presuppone che i pesi siano tutti compresi tra 0 e 1. In caso contrario, è necessario eseguire alcuni serraggi. Se i pesi sommano a 1, puoi saltare il passaggio di divisione.

C'è un numero infinito di altri modi per fondere i colori. Se questo non fa quello che vuoi, dovrai dare più specifiche su ciò che vuoi.

+0

Per una [media ponderata] (https://en.wikipedia.org/wiki/Weighted_mean), dividi per la * somma dei pesi *, non il numero di cose che stai mediaggiando. Quindi dovresti 'result.L = (uint8_t) ((float) LSum/wSum)', dove 'wSum = pesi [0] + pesi [1] + pesi [2] + pesi [3]'. – Rahul

+0

@RahulNarain Buon punto! Grazie per averlo capito. L'ho risolto – user1118321

+0

aeb sono valori firmati nello spazio L * a * b *. – ergosys

5

I risultati più realistici deriveranno dalla conversione dei valori L*a*b* in uno spazio lineare (non corretto per la gamma) RGB, sommando tali valori e riconvertendo. Questo è il modo in cui le fonti di luce fisiche interagiscono.

Lo spazio colore L*a*b* non è stato inventato per la manipolazione del colore, poiché è intrinsecamente non lineare.

+0

Il mix RGB non produce colori realistici: http://farm1.static.flickr.com/147/417347616_60b05096f3_o.png –

+2

@ user1215106, chi ha detto qualcosa sulla "modalità di miscelazione moltiplicata"? Ho detto "somma". Anche se nel tuo caso potresti cercare una "miscela", ma ciò richiede la specificazione dell'ordine e dell'opacità di ciascun colore. –

+0

A differenza dei modelli di colori RGB e CMYK, il colore Lab è progettato per approssimare la visione umana - http://en.wikipedia.org/wiki/CIE_Lab. CIE L * a * b * (CIELAB) è lo spazio cromatico più completo specificato dalla Commissione internazionale per l'illuminazione (Commissione francese internationale de l'éclairage, da qui l'inizializzazione della CIE). Descrive tutti i colori visibili all'occhio umano ed è stato creato per fungere da modello indipendente dal dispositivo da utilizzare come riferimento. –

Problemi correlati