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.
quelle
Antworten:
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:
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).
quelle
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:
RGB to XYZ
für beide FarbenXYZ to LAB
für beide FarbenDiff = DeltaE94(LABColor1,LABColor2)
Formeln (Pseudocode):
quelle
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
quelle
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 .
quelle
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 :
quelle
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.
quelle