2012-06-21 12 views
5

Ich habe 4 Farben, die ich von RGB zu CIELAB L * a * b * Modell umgewandelt habe.Wie berechnet man die Mischung aus 4 Farben, die im CIELAB L * a * b * Modell definiert sind?

  1. Wie kann ich Mischung dieser vier Farben berechnen, wenn ich (L,a,b) für jede solche Farbe haben?

  2. Wie kann ich dieselbe Mischung berechnen, wenn ich Gewichte (w1, w2, w3, w4) auf solche 4 Farben setzen möchte, mit 1 Maximum und 0 Minimum (kein) Gewicht?

+4

Was erwarten Sie von dieser Mischung? Sie können die vier Farben zusammen mit der Gewichtung komponieren, und Sie erhalten gültige Farben. Aber ob sie die Farben sind, die Sie erwarten oder nicht, ist ohne weitere Informationen schwer zu sagen. Haben Sie versucht, die einzelnen Gewichte einfach zu multiplizieren, sie dann komponentenweise zu addieren und durch 4 zu dividieren? Wenn Sie das nicht bekommen, was Sie erwarten, können Sie genauer sagen, was Sie erwarten? Wenn Sie ein Bild posten, würde es helfen. – user1118321

+4

Haben Sie gerade eine Menge Programmiersprachen-Tags eingefügt, in der Hoffnung, so viele potentielle Zuschauer wie möglich anzulocken? – DavidO

+0

@DavidO - Ich habe die Programmiersprache, mit der ich seit über 10 Jahren arbeite, mit einbezogen. –

Antwort

10

Vorausgesetzt Sie haben eine Struktur wie dieses:

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

und eine Reihe von 4 von ihnen:

LabColor colors[4]; 
getMeSomeColors (colors); 

und Gewichte:

float weights[4]; 
getMeSomeWeights (weights); 

Eine mögliche Vermischung Methode wäre dies:

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); 

Dies setzt voraus, dass die Gewichte zwischen 0 und 1 liegen. Wenn nicht, dann müssen Sie etwas klemmen. Wenn die Gewichte 1 ergeben, können Sie den Teilungsschritt überspringen.

Es gibt unendlich viele Möglichkeiten, die Farben zu mischen. Wenn dieser nicht das tut, was Sie wollen, müssen Sie genauer angeben, was Sie wollen.

+0

Für einen [gewichteten Durchschnitt] (https://en.wikipedia.org/wiki/Weighted_mean) dividieren Sie sich durch die * Summe der Gewichte *, nicht die Anzahl der Dinge, die Sie durchschnittlich machen. Also würdest du 'result.L = (uint8_t) ((float) LSum/wSum)' machen, wobei 'wSum = Gewichte [0] + Gewichte [1] + Gewichte [2] + Gewichte [3]'. – Rahul

+0

@RahulNarain Guter Punkt! Danke, dass du das verstanden hast. Ich habe es behoben. – user1118321

+0

a und b sind vorzeichenbehaftete Werte im L * a * b * -Raum. – ergosys

5

Die realistischsten Ergebnisse erhalten Sie, wenn Sie Ihre L*a*b* Werte in einen linearen (nicht gammakorrigierten) RGB Raum umrechnen, diese Werte summieren und zurück konvertieren. So interagieren physikalische Lichtquellen.

Der Farbraum L*a*b* wurde nicht zur Farbmanipulation erfunden, da er inhärent nichtlinear ist.

+0

RGB-Mix erzeugt keine realistischen Farben: http://farm1.static.flickr.com/147/417347616_60b05096f3_o.png –

+2

@ user1215106, wer hat etwas über "Mischmodus multiplizieren" gesagt? Ich sagte "Summe". Auch wenn Sie in Ihrem Fall nach einer "Mischung" suchen, müssen Sie dafür die Reihenfolge und Deckkraft jeder Farbe angeben. –

+0

Im Gegensatz zu den RGB- und CMYK-Farbmodellen ist die Lab-Farbe so ausgelegt, dass sie dem menschlichen Sehvermögen entspricht - http://en.wikipedia.org/wiki/CIE_Lab. CIE L * a * b * (CIELAB) ist der vollständigste von der Internationalen Beleuchtungskommission festgelegte Farbraum (Französische Kommission internationale de l'éclairage, daher CIE-Initiali- sierung). Es beschreibt alle Farben, die für das menschliche Auge sichtbar sind und wurde geschaffen, um als ein geräteunabhängiges Modell zu dienen, das als Referenz verwendet werden kann. –