2010-11-13 25 views
5

mir gesagt wurde, Abstand Formel zu verwenden, um herauszufinden, ob die Farbe der anderen übereinstimmt, so habe ich,Finding nächste RGB-Farb

struct RGB_SPACE 
{ 
    float R, G, B; 
}; 

RGB_SPACE p = (255, 164, 32); //pre-defined 
RGB_SPACE u = (192, 35, 111); //user defined 

long distance = static_cast<long>(pow(u.R - p.R, 2) + pow(u.G - p.G, 2) + pow(u.B - p.B, 2)); 

dies nur eine Strecke gibt, aber wie würde ich wissen, ob die Farbe der Spiele benutzerdefiniert von mindestens 25%?

Ich bin nicht nur sicher, aber ich habe eine Idee, jeden Farbwert zu überprüfen, um zu sehen, ob der Unterschied 25% ist. beispielsweise.

float R = u.R/p.R * 100; 
float G = u.G/p.G * 100; 
float B = u.B/p.B * 100; 

if (R <= 25 && G <= 25 && B <= 25) 
{ 
    //color matches with pre-defined color. 
} 

Antwort

7

Ich würde vorschlagen, nicht in RGB-Raum einchecken. Wenn Sie (0,0,0) und (100,0,0) haben, sind sie ähnlich der Cababungas-Formel (wie auch Casablanca, die zu viele Farben als ähnlich betrachtet). Sie sehen jedoch sehr unterschiedlich aus. Die Farbmodelle HSL and HSV basieren auf menschlichen Interpretationen von Farben und Sie können dann unabhängig voneinander einen Abstand für Farbton, Sättigung und Helligkeit angeben (abhängig davon, was "ähnlich" in Ihrem Fall bedeutet).

+0

eigentlich ist es [lab] (http: //en.wikipedia.org/wiki/Lab_color_space) Raum, der auf menschlicher Interpretation basiert – zenpoy

2

anzumerken, dass der maximal mögliche Abstand zwischen dem (255, 255, 255) und (0, 0, 0), die in einer Entfernung von 3 * 255^2 ist. Offensichtlich stimmen diese zwei Farben am wenigsten überein (0% Übereinstimmung) und sie sind eine Distanz von 100%. Dann bedeutet mindestens eine Übereinstimmung von 25% eine Entfernung von weniger als 75%, d. H. 3/4 * 3 * 255^2 = 9/4 * 255 * 255. So können Sie nur überprüfen, ob:

distance <= 9/4 * 255 * 255 
+0

Die maximale Entfernung ist natürlich sqrt (3 * 255^2). 25% Übereinstimmung, würde ich meinen, sollte nicht mehr als 1/4 der gesamten Bandbreite bedeuten. Die endgültige Formel sollte also lauten: distance <= sqrt (3)/4 * 255. – cababunga

+0

@cababunga: Du hast Recht mit 'sqrt', das habe ich übersehen, weil das OP es nicht in seine Gleichung aufgenommen hat. "Mindestens 25% Übereinstimmung" würde jedoch immer noch eine Entfernung von weniger als 75% bedeuten, da mehr Entfernung weniger Übereinstimmung bedeutet. – casablanca

4

"Übereinstimmungen um mindestens 25%" ist kein genau definiertes Problem. Übereinstimmungen um mindestens 25% von was und nach welcher Metrik? Es gibt Unmengen von möglichen Entscheidungen. Wenn Sie RGB-Farben vergleichen, sind die naheliegendsten Abstandsmetriken, die aus Vektornormen abgeleitet sind. Die drei wichtigsten sind:

  • 1-Norm oder "Manhattan-Distanz": Entfernung = abs (r1-r2) + abs (G1-G2) + abs (b1-b2)
  • 2-Norm oder euklidischer Abstand: Abstand = sqrt (pow (r1-r2, 2) + pow (g1-g2, 2) + pow (b1-b2, 2)) (Sie berechnen das Quadrat davon, was in Ordnung ist - Sie können vermeiden das sqrt, wenn Sie gerade gegen einen Schwellwert prüfen, indem Sie den Schwellwert auch quadrieren)
  • Unendlichkeit-Norm: Abstand = Maximum (abs (r1-r2), abs (g1-g2), abs (b1-b2))

Es gibt natürlich viele andere Möglichkeiten. Sie können prüfen, ob sie sich in einiger Entfernung voneinander befinden: Wenn Sie in einem Farbkanal eine Abweichung von bis zu 25% (über den Bereich der möglichen RGB-Werte) zulassen möchten, sind die Schwellenwerte für die drei Methoden 3/4 * 255, sqrt (3)/4 * 255 und 255/4. Dies ist jedoch eine sehr grobe Metrik.

Eine bessere Möglichkeit, Abstände zwischen Farben zu messen, besteht darin, Ihre Farben in einen wahrnehmbar einheitlichen Farbraum wie CIELAB umzuwandeln und dort den Vergleich durchzuführen; es gibt eine ziemlich gute Wikipedia article zu dem Thema auch. Abhängig von Ihrer beabsichtigten Anwendung ist das vielleicht ein Overkill, aber das sind die Farbräume, in denen die gemessenen Abstände am besten mit den Entfernungen übereinstimmen, die vom menschlichen Sehsystem wahrgenommen werden.

+0

+1. Du antwortest mit einer eigenen guten Frage! – augustin

+0

Ich meine, benutzerdefinierte Farbe entspricht der vordefinierten Farbe mindestens 25%. – user963241