Algorithmus zur Überprüfung der Farbähnlichkeit

82

Ich suche nach einem Algorithmus, der zwei RGB-Farben vergleicht und einen Wert ihrer Ähnlichkeit erzeugt (wobei Ähnlichkeit "ähnlich in Bezug auf die durchschnittliche menschliche Wahrnehmung" bedeutet).

Irgendwelche Ideen?

EDIT :

Da ich nicht mehr antworten kann, habe ich beschlossen, meine "Lösung" als Bearbeitung für die Frage zu verwenden.

Ich habe mich für eine (sehr) kleine Teilmenge von Echtfarben in meiner App entschieden, damit ich den Farbvergleich selbst durchführen kann. Ich arbeite mit ungefähr 30 Farben und verwende fest codierte Abstände zwischen ihnen.

Da es sich um eine iPhone-App handelte, habe ich mit Objective-C gearbeitet. Die Implementierung ist mehr oder weniger eine Matrix, die die folgende Tabelle darstellt und die Abstände zwischen den Farben zeigt.

Geben Sie hier die Bildbeschreibung ein

Kai Huppmann
quelle
Der Vergleich von R-, G- und B-Werten reicht nicht aus?
BlackBear
@ Kai: Ich versuche das gleiche zu implementieren. Haben Sie sich für den YUV-Ansatz entschieden oder haben Sie eine andere Art von Farbraum und Raumabstand gewählt?
Thariama
3
@Thariama Ich habe mich für eine (sehr) kleine Teilmenge von Echtfarben in meiner App entschieden, damit ich den Farbvergleich selbst durchführen kann. Ich arbeite mit ungefähr 50 Farben und verwende fest codierte Abstände zwischen ihnen. Nach allem, was ich bei der Verwendung von 2 ^ 24 Farben gelesen und getestet habe, hat YUV den besten Job gemacht.
Kai Huppmann
@ Kai: Vielen Dank, dass Sie mich über Ihre Entscheidung und ihre Gründe informiert haben. Das heißt, Sie verwenden RGB und erstellen ein Histogramm mit 50 Farben. Beschleunigen Sie Ihren Algorithmus mit vordefinierten Abständen. Richtig? Mit welcher Sprache haben Sie Ihren Algorithmus implementiert?
Thariama
@Thariama Füge es als Bearbeitung in die ursprüngliche Frage ein.
Kai Huppmann

Antworten:

57

Die RGB-Entfernung im euklidischen Raum ist der durchschnittlichen menschlichen Wahrnehmung nicht sehr ähnlich.

Sie können den YUV- Farbraum verwenden, wobei dieser Faktor berücksichtigt wird:

|  Y' |      |  0.299    0.587    0.114   | | R |
|  U  |  =   | -0.14713 -0.28886  0.436   | | G |
|  V  |      |  0.615   -0.51499 -0.10001 | | B |

Zu diesem Zweck können Sie auch den CIE- Farbraum verwenden.

BEARBEITEN:

Ich werde erwähnen, dass der YUV-Farbraum eine kostengünstige Näherung ist, die über einfache Formeln berechnet werden kann. Aber es ist nicht wahrnehmungsmäßig einheitlich. Wahrnehmungsgleichmäßig bedeutet, dass eine Änderung des Farbwerts um dieselbe Menge eine Änderung von ungefähr derselben visuellen Bedeutung hervorrufen sollte. Wenn Sie eine präzisere und strengere Metrik benötigen, müssen Sie auf jeden Fall den CIELAB-Farbraum oder einen anderen wahrnehmungsmäßig einheitlichen Raum berücksichtigen (auch wenn es keine einfachen Formeln für die Konvertierung gibt).

Ghassen Hamrouni
quelle
3
Vielen Dank! Kann ich dann mit dem euklidischen Raumabstand der Y'UV-Werte gehen?
Kai Huppmann
Sicher, aber Sie könnten auch andere Entfernungen verwenden.
Ghassen Hamrouni
2
Höchstwahrscheinlich möchten Sie den euklidischen Abstand zwischen UV-Komponenten nur berechnen, weil Y 'die Luma-Komponente ist.
Ross
17
Kann jemand eine Quelle für die Behauptung anführen, dass die euklidische Distanz in YUV die menschliche Wahrnehmung von Unterschieden widerspiegelt?
Bill
4
@ Bill tut es nicht. Siehe den Abschnitt "Ergebnisse" hier: compuphase.com/cmetric.htm
kritzikratzi
23

Ich würde die Verwendung von CIE94 (DeltaE-1994) empfehlen , es soll eine anständige Darstellung der menschlichen Farbwahrnehmung sein. Ich habe es ziemlich oft in meinen Computer-Vision-Anwendungen verwendet und bin ziemlich zufrieden mit dem Ergebnis.

Es ist jedoch ziemlich rechenintensiv, einen solchen Vergleich durchzuführen:

  1. RGB to XYZ für beide Farben
  2. XYZ to LAB für beide Farben
  3. Diff = DeltaE94(LABColor1,LABColor2)

Formeln (Pseudocode):

JHolta
quelle
Ich habe diese Methode wegen der Verwendung des CIELAB-Farbraums bevorzugt, danke.
Sergey Voronezhskiy
XYZ nach LAB wie in "Hunter-Lab"?
Zuks
1
Nevermind ... Ich kann sehen, dass Delta E 1994 CIE-L * ab-Werte verwendet
Zuks
14

Die menschliche Wahrnehmung ist schwächer als die Intensität.

In kommerziellen Videos reduzieren beispielsweise die YCbCr / YPbPr-Farbräume (auch Y'UV genannt) die Auflösung der Chroma-Informationen, bewahren jedoch die Luma (Y). Bei der digitalen Videokomprimierung wie 4: 2: 0 und 4: 2: 2 wird die Chroma-Bitrate aufgrund einer relativ schwächeren Wahrnehmung reduziert.

Ich glaube, dass Sie eine Distanzfunktion berechnen können, die eine höhere Priorität gegenüber Luma (Y) und eine geringere Priorität gegenüber Chroma hat.

Bei geringer Intensität ist das menschliche Sehen praktisch schwarz-weiß. Daher ist die Prioritätsfunktion nicht linear, da Sie bei niedrigem Luma (Y) immer weniger Gewicht auf Chroma legen.

Weitere wissenschaftliche Formeln: http://en.wikipedia.org/wiki/Color_difference

Stephen Chung
quelle
14

Zum Thema Farbabstände gibt es hier eine hervorragende Beschreibung: http://www.compuphase.com/cmetric.htm

Für den Fall, dass diese Ressource verschwindet, ist die Schlussfolgerung des Autors, dass mit dieser Formel (in C- Code) die beste kostengünstige Annäherung an den Abstand zwischen zwei RGB-Farben erreicht werden kann .

typedef struct {
   unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
  long rmean = ( (long)e1.r + (long)e2.r ) / 2;
  long r = (long)e1.r - (long)e2.r;
  long g = (long)e1.g - (long)e2.g;
  long b = (long)e1.b - (long)e2.b;
  return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
strttn
quelle
3

Die Farbwahrnehmung ist nicht euklidisch. Jede Distanzformel ist gleichzeitig gut genug und schrecklich. Jedes Maß, das auf dem euklidischen Abstand basiert (RGB, HSV, Luv, Lab, ...), ist für ähnliche Farben gut genug, da Aqua nahe an Blaugrün liegt. Aber für nicht nahe Werte wird es willkürlich. Ist Rot beispielsweise näher an Grün oder an Blau?

Aus Charles Poyntons Farb-FAQ :

Die XYZ- und RGB-Systeme zeigen bei weitem keine Wahrnehmungsgleichmäßigkeit. Die Suche nach einer Umwandlung von XYZ in einen einigermaßen wahrnehmungsgleichmäßigen Raum dauerte am CIE ein Jahrzehnt oder länger, und am Ende konnte kein einziges System vereinbart werden.

xan
quelle
Vielen Dank. Und es ist eine großartige, interessante Verbindung. Für meinen Zweck ist es nicht so wichtig zu sagen, ob Rot näher an Grün oder Blau liegt, aber dass ein Hellgrau näher an Weiß liegt als ein Hellrot, und ich hoffe (aber noch nicht sicher), dass YUV es schafft.
Kai Huppmann
-5

Die Farbähnlichkeit im RGB-Würfel wird anhand des euklidischen Abstands gemessen (verwenden Sie die Pythonagoras-Formel).

EDIT: Bei einem zweiten Gedanken sollte dies auch für die meisten anderen Farbräume gelten.

Damon
quelle
6
Nein, der euklidische Abstand im RGB-Raum entspricht nicht der Art und Weise, wie das menschliche Auge Unterschiede zwischen Farben wahrnimmt. Dies ist der gesamte Grund, warum Farbräume wie Lab erstellt wurden.
Bill
Nein. Die euklidische Entfernung ist eine Möglichkeit, die Entfernung in einem beliebigen kartesischen Raum zu messen. es misst die Entfernung, nicht die Ähnlichkeit! Jetzt können Sie entweder einen anderen Vektorraum (wie cie oder yuv) auswählen, in dem euklidischer Abstand und Ähnlichkeit zusammenfallen, oder Sie verwenden ein anderes Maß. aber rgb + euklidisch liefern keine zufriedenstellenden Ergebnisse.
kritzikratzi
Ich dachte auch das, aber dann öffne ein Zeichenprogramm mit einer begrenzten Anzahl von Farben (Adobe Flash zum Beispiel mit 216 voreingestellter Standardpalette) und stelle diese Formel auf die Probe und du wirst sehr schnell enttäuscht und bekommst Gelb, wenn du brauche eindeutig braun usw.
Dmitry