2016-07-26 7 views
4

Gibt es eine Möglichkeit, Farben, die durch ihre Hex-Codes gegeben sind, als Schattierungen einer bestimmten Farbe zu identifizieren?
Ich denke, ich habe einen Weg gefunden, nicht sicher, wie genau - aber wie kann ich sagen, ob die Farbübereinstimmung, die ich fand, nicht gut genug ist?Die beste Farbübereinstimmung finden - und ablehnen, wenn keine Farbschattierungen verfügbar sind

Ich muss in der Lage sein, Farbübereinstimmungen für bestimmte Farben zu identifizieren - ein festes Set (rot, gelb, orange, blau, grün, braun, lila, grau, schwarz, weiß).

Im Moment mache ich eine Farbe Spiel basierend auf Distanz:

eine Farbe über c von der festen Farbliste Given (die ich hex Farben Set mit hoffentlich in der Mitte für diese Farbe des Bereichs sein , die ich nicht ganz sicher bin, wie zu bekommen - im Moment verwende ich eine Farbe, die "gut" aussieht, und eine Liste der verfügbaren Farben list, ich versuche, den Index aus der Liste mit der nächsten Farbe zu finden.

int matchColor(QColor c, QList<QColor> list) 
{ 
    int bestIndex = 0; 
    int distance; 
    int bestMatch = 0; 
    int sz = list.size() - 1; 

    for (int i = 0; i <= sz; ++i) 
    { 
     int Rdiff = 255 - qAbs(c.red() - list.at(i).red()); 
     int Gdiff = 255 - qAbs(c.green() - list.at(i).green()); 
     int Bdiff = 255 - qAbs(c.blue() - list.at(i).blue()); 
     distance = Rdiff + Gdiff + Bdiff; 

     if (distance > bestMatch) 
     { 
      bestMatch = distance; 
      bestIndex = i; 
     } 
    } 

    // if(bestMatch < 600 ? or something ?) return -1; 

    return bestIndex; 
} 

Das Problem ist, weil dieses Spiel soll strikt durchgesetzt werden (für einige Standards), muss ich zurückkehren Schatten der spezifischen Farbe c und fehlschlagen, wenn ich kann nicht.
Ich bin nicht 100% sicher, dass die Farbübereinstimmung gut ist - obwohl es ziemlich ok scheint.

Aber anders als die beste Farbabstimmung zu finden - was ist ein angemessener Wert der Entfernung, für die ich eine Übereinstimmung ablehnen sollte? (erwartet distance zwischen 0 und 765, wobei 765 perfekt passt).
Gibt es bestimmte Bereiche, die ich überprüfen kann?

Würde der Bereich für jede Farbe unterschiedlich sein?

Hinweis - Ich habe einige ähnliche Fragen gefunden, einige haben Verweise auf komplexere Algorithmen, die ich nicht verstehen konnte - aber ich habe nichts gesehen, was mir sagen könnte, wie man eine Übereinstimmung zurückweist ... Ich würde eine bessere Lösung begrüßen.

+1

Ja, wird der Bereich für jede Farbe unterschiedlich sein, es sei denn, Sie zuerst zu einem einheitlichen Eindruck vermittelt Farbraum wie [CIE Lab] (https://en.wikipedia.org/wiki/Lab_color_space) konvertieren . –

Antwort

6

Es ist im Grunde unmöglich, Ihnen zu sagen, welche Toleranzen für Ihren Anwendungsfall akzeptabel sind, aber ich würde dringend empfehlen, zu HSV zu konvertieren, bevor Sie versuchen, die Farben abzustimmen. Die H-Komponente ist kritisch und sollte wahrscheinlich eine Toleranz von nicht mehr als 20 oder 30 Grad haben. S und V sind weit weniger kritisch; Sie können sie entweder ignorieren oder nur die extremen Fälle herausfiltern, in denen der Farbton vollständig verschwindet.

Die Umwandlung wird hier beschrieben: Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both

+0

Mit den QColor-Methoden von Qt kann ich die HSL-Werte erhalten - und ich versuche, den Farbton zu vergleichen, wenn er positiv ist. Für Weiß, Schwarz, Graustufen wird der Farbton als -1 angegeben, also vergleiche ich den Wert. Scheint einfach ... Aber einige Farben wie braun vergleichen - "# 8b4513" (hue = 25) findet am besten orange - "# e98300" (hue = 33) (Unterschied = 8) (aus einer zufälligen Liste von Farben) - es fand die engste Übereinstimmung (wie die euklidische Differenzmethode), scheint aber, dass der Farbton nicht scharf genug ist, um diese Übereinstimmung abzulehnen, und 8 ist wirklich ein kleiner Unterschied – Thalia

+0

Ok, tut mir leid, das zu hören. Ich habe die Methode vor vielen Jahren selbst benutzt, als ich noch eine Farbausgabe von 8 Bit (Palette) unterstützen musste, und fand, dass sie gute Ergebnisse für meinen Zweck lieferte. Es schien auch gut für dein Problem zu passen. –

4

Der Standardweg Farbunterschiede von Mess etwas Delta E. Delta E genannt wird, wird berechnet aus 2 Lab-Werte in dem Lab ist eine Standardmethode Farben beschrieben werden.

DeltaE=sqrt(pow(L1-L2,2)+pow(a1-a2,2)+pow(b1-b2,2))

Es gibt drei Lab-Werte, L, a und b. L ist ein Maß für die Leuchtkraft. a und b bestimmen Farbton und Sättigung. Stellen Sie sich a und b als Vektor vor. Die Länge ist die Farbsättigung und der Winkel ist Farbton.

Wählen Sie die Farbe, die das kleinste Delta E erzeugt. Es gibt eine etwas bessere Version namens DeltaE2000, die das Anpassen von kleinen Farbunterschieden verbessert, aber die Mathematik ist komplexer und DeltaE ist für die meisten Zwecke gut genug.

Hier finden Sie Informationen zur Konvertierung von sRGB-Werten in Lab.

RGB to CIE LAB

+0

Ich werde versuchen, es herauszufinden, ich komme zurück :-) – Thalia