Ich möchte ein Programm entwerfen, mit dessen Hilfe ich zwischen 5 vordefinierten Farben beurteilen kann, welche einer variablen Farbe ähnlicher sind und mit welchem Prozentsatz. Die Sache ist, dass ich nicht weiß, wie man das manuell Schritt für Schritt macht. Es ist also noch schwieriger, sich ein Programm vorzustellen.
Weitere Details: Die Farben stammen von Fotografien von Röhrchen mit Gel, die unterschiedliche Farben haben. Ich habe 5 Röhren mit verschiedenen Farben, von denen jede für 1 von 5 Ebenen repräsentativ ist. Ich möchte Fotos von anderen Proben machen und am Computer beurteilen, zu welcher Ebene diese Probe gehört, indem ich Farben vergleiche, und ich möchte das auch mit einem Prozentsatz der Annäherung wissen. Ich möchte ein Programm, das ungefähr so funktioniert: http://www.colortools.net/color_matcher.html
Wenn Sie mir sagen können, welche Schritte ich unternehmen soll, auch wenn ich sie manuell denken und tun muss. Es wäre sehr hilfreich.
Antworten:
Die richtigen Hinweise finden Sie im Wikipedia-Artikel zum Farbunterschied . Grundsätzlich möchten Sie eine Abstandsmetrik in einem mehrdimensionalen Farbraum berechnen. RGB ist jedoch nicht "wahrnehmungsmäßig einheitlich", sodass Ihre von Vadim vorgeschlagene euklidische RGB-Entfernungsmetrik nicht mit der vom Menschen wahrgenommenen Entfernung zwischen Farben übereinstimmt. Zunächst soll L a b * ein wahrnehmungsmäßig einheitlicher Farbraum sein, und die DeltaE-Metrik wird üblicherweise verwendet. Es gibt jedoch verfeinerte Farbräume und verfeinerte DeltaE-Formeln, die der menschlichen Wahrnehmung näher kommen.
Sie müssen mehr über Farbräume und Leuchtmittel erfahren, um die Konvertierungen durchführen zu können. Für eine schnelle Formel, die besser ist als die euklidische RGB-Metrik, gehen Sie einfach folgendermaßen vor: Nehmen Sie an, dass sich Ihre RGB-Werte im sRGB-Farbraum befinden, suchen Sie die Konvertierungsformeln von sRGB in L a b * und konvertieren Sie Ihre sRGB-Farben in L a b *. und berechne deltaE zwischen deinen beiden L a b * -Werten. Es ist nicht rechenintensiv, es sind nur einige nichtlineare Formeln und einige Multiplikationen und Additionen.
quelle
color
Edelstein an, der unter anderem DeltaE implementiert .Nur eine Idee, die mir zuerst in den Sinn kam (sorry, wenn dumm). Drei Komponenten von Farben können als 3D-Koordinaten von Punkten angenommen werden, und dann können Sie den Abstand zwischen Punkten berechnen.
FE
Der Abstand zwischen den Farben beträgt
Prozentsatz ist
quelle
Eigentlich bin ich vor ein paar Monaten den gleichen Weg gegangen. Es gibt keine perfekte Antwort auf die Frage (die hier einige Male gestellt wurde), aber es gibt eine differenziertere Antwort als die Antwort sqrt (rr) usw., die einfacher direkt mit RGB zu implementieren ist, ohne zu allen Arten von alternativen Farbräumen zu wechseln. Ich habe hier diese Formel gefunden, die eine kostengünstige Annäherung an die ziemlich komplizierte reale Formel darstellt (von der CIE, dem W3C der Farbe, da dies eine noch nicht abgeschlossene Aufgabe ist, finden Sie dort ältere und einfachere Farbdifferenzgleichungen). Viel Glück
Bearbeiten: Für die Nachwelt ist hier der relevante C-Code:
quelle
Ein Farbwert hat mehr als eine Dimension, daher gibt es keine Möglichkeit, zwei Farben zu vergleichen. Sie müssen für Ihren Anwendungsfall die Bedeutung der Farben bestimmen und damit diese am besten vergleichen.
Höchstwahrscheinlich möchten Sie die Farbton-, Sättigungs- und / oder Helligkeitseigenschaften der Farben im Gegensatz zu den Rot / Grün / Blau-Komponenten vergleichen. Wenn Sie Probleme haben, herauszufinden, wie Sie sie vergleichen möchten, nehmen Sie einige Paar Musterfarben und vergleichen Sie sie mental. Versuchen Sie dann, sich selbst zu rechtfertigen / zu erklären, warum sie ähnlich / unterschiedlich sind.
Wenn Sie wissen, welche Eigenschaften / Komponenten der Farben Sie vergleichen möchten, müssen Sie herausfinden, wie Sie diese Informationen aus einer Farbe extrahieren können.
Höchstwahrscheinlich müssen Sie nur die Farbe aus der allgemeinen RedGreenBlue-Darstellung in HueSaturationLightness konvertieren und dann so etwas berechnen
In diesem Beispiel erhalten Sie einen einfachen Skalarwert, der angibt, wie weit der Farbverlauf / Farbton der Farben voneinander entfernt ist.
Siehe HSL und HSV bei Wikipedia .
quelle
Wenn Sie zwei
Color
Objektec1
und habenc2
, können Sie einfach jeden RGB-Wertc1
mit dem von vergleichenc2
.Diese Werte können Sie einfach durch die Differenzsättigung (255) dividieren, und Sie erhalten die Differenz zwischen den beiden.
Danach können Sie nur noch den durchschnittlichen Farbunterschied in Prozent ermitteln.
Welches würde Ihnen einen prozentualen Unterschied zwischen
c1
und gebenc2
.quelle
pctDiffRed = diffRed / 255;
gibt Ihnen 0, es sei denn, Sie werfen irgendwo auf einen Schwimmer. <b> 2 </ b> Sie müssen irgendwo mit 100 multiplizieren, um einen Prozentsatz zu erhalten.Eine der besten Methoden, um zwei Farben durch menschliche Wahrnehmung zu vergleichen, ist CIE76. Der Unterschied heißt Delta-E. Wenn es kleiner als 1 ist, kann das menschliche Auge den Unterschied nicht erkennen.
Es gibt eine wunderbare Farbdienstprogrammklasse ColorUtils (Code unten), die CIE76-Vergleichsmethoden enthält. Es wurde von Daniel Strebel, Universität Zürich, geschrieben.
Von ColorUtils.class verwende ich die Methode:
r1, g1, b1 - RGB-Werte der ersten Farbe
r2, g2, b2 - RGB-Werte der zweiten Farbe, die Sie vergleichen möchten
Wenn Sie mit Android arbeiten, können Sie folgende Werte erhalten:
r1 = Color.red(pixel);
g1 = Color.green(pixel);
b1 = Color.blue(pixel);
ColorUtils.class von Daniel Strebel, Universität Zürich:
quelle
Nur eine weitere Antwort, obwohl sie der von Supr ähnlich ist - nur ein anderer Farbraum.
Die Sache ist: Menschen nehmen den Farbunterschied nicht gleichmäßig wahr und der RGB-Farbraum ignoriert dies. Wenn Sie den RGB-Farbraum verwenden und nur den euklidischen Abstand zwischen zwei Farben berechnen, erhalten Sie möglicherweise einen Unterschied, der mathematisch absolut korrekt ist, aber nicht mit dem übereinstimmt, was Menschen Ihnen sagen würden.
Dies ist möglicherweise kein Problem - der Unterschied ist meiner Meinung nach nicht so groß, aber wenn Sie dieses "bessere" Problem lösen möchten, sollten Sie Ihre RGB-Farben in einen Farbraum konvertieren, der speziell entwickelt wurde, um das oben genannte Problem zu vermeiden. Es gibt mehrere Verbesserungen gegenüber früheren Modellen (da dies auf der menschlichen Wahrnehmung basiert, müssen wir die "richtigen" Werte basierend auf experimentellen Daten messen). Es gibt den Lab-Farbraum, von dem ich denke, dass er der beste ist, obwohl er etwas kompliziert zu konvertieren ist. Einfacher wäre das CIE XYZ .
Hier ist eine Seite, auf der die Formeln aufgelistet sind, die zwischen verschiedenen Farbräumen konvertiert werden sollen, damit Sie ein wenig experimentieren können.
quelle
Alle folgenden Methoden führen zu einer Skala von 0-100.
quelle
Der beste Weg ist DeltaE. DeltaE ist eine Zahl, die den Unterschied der Farben anzeigt. Wenn Deltae <1 ist, kann der Unterschied mit menschlichen Augen nicht erkannt werden. Ich habe einen Code in canvas und js geschrieben, um rgb in lab zu konvertieren und dann Delta e zu berechnen. In diesem Beispiel erkennt der Code Pixel mit unterschiedlicher Farbe und einer Grundfarbe, die ich als LAB1 gespeichert habe. und wenn es dann anders ist, werden diese Pixel rot. Sie können die Empfindlichkeit des Farbunterschieds mit zunehmendem Wert erhöhen oder verringern oder den zulässigen Bereich von Delta e verringern. In diesem Beispiel habe ich in der von mir geschriebenen Zeile 10 für deltaE zugewiesen (deltae <= 10):
}}
// ------------------------------------------------ -------------------------------------------------- --- ---.
quelle
1/3
und16/116
beide bewerten0
, was mit ziemlicher Sicherheit nicht das ist, was Sie wollen. Wahrscheinlich ist Ihr Algorithmus korrekt, Ihr Code jedoch sicherlich nicht.Eine einfache Methode, die nur RGB verwendet, ist
Ich habe dieses Produkt schon eine Weile verwendet und es funktioniert für die meisten Zwecke gut genug.
quelle
1/3
Ich habe dies in meinem Android verwendet und es scheint zufriedenstellend, obwohl RGB-Speicherplatz nicht empfohlen wird:
Dann habe ich Folgendes verwendet, um Prozent der Ähnlichkeit zu erhalten:
Es funktioniert gut genug.
quelle
Ich habe verschiedene Methoden wie den LAB-Farbraum und HSV-Vergleiche ausprobiert und festgestellt, dass die Leuchtkraft für diesen Zweck ziemlich gut funktioniert.
Hier ist die Python-Version
Werde dir geben
quelle
ImageColor
? bearbeiten fand ich, es istfrom PIL import ImageColor
Ich gehe davon aus, dass Sie am Ende ein ganzes Bild analysieren möchten, nicht wahr? So können Sie nach dem kleinsten / höchsten Unterschied zur Identitätsfarbmatrix suchen.
Die meisten mathematischen Operationen zur Verarbeitung von Grafiken verwenden Matrizen, da die möglichen Algorithmen, die sie verwenden, häufig schneller sind als klassische Punkt-für-Punkt-Entfernungs- und Vergleichsberechnungen. (zB für Operationen mit DirectX, OpenGL, ...)
Also ich denke du solltest hier anfangen:
http://en.wikipedia.org/wiki/Identity_matrix
http://en.wikipedia.org/wiki/Matrix_difference_equation
... und wie Beska bereits oben kommentiert hat:
Dies bedeutet auch, dass Ihr Algorithmus von Ihrer Definition von "ähnlich wie" abhängt, wenn Sie Bilder verarbeiten.
quelle
Kotlin-Version mit wie viel Prozent möchten Sie übereinstimmen.
Methodenaufruf mit prozentualem optionalem Argument
Methodenkörper
quelle
Sie müssen alle RGB-Farben in den Lab-Farbraum konvertieren, um sie so vergleichen zu können, wie Menschen sie sehen. Andernfalls erhalten Sie RGB-Farben, die auf sehr seltsame Weise übereinstimmen.
Der Wikipedia-Link zu Farbunterschieden gibt Ihnen ein Intro in die verschiedene Lab - Farbraum Differenz Algorithmen , die im Laufe der Jahre festgelegt wurde. Das einfachste, das nur den euklidischen Abstand zweier Laborfarben überprüft, funktioniert, weist jedoch einige Mängel auf.
Praktischerweise gibt es eine Java-Implementierung des komplexeren CIEDE2000-Algorithmus im OpenIMAJ- Projekt. Geben Sie Ihre zwei Sätze von Laborfarben an, und Sie erhalten einen Wert für den einzelnen Abstand zurück.
quelle
Der einzige "richtige" Weg, Farben zu vergleichen, besteht darin, dies mit deltaE in CIELab oder CIELuv zu tun.
Aber für viele Anwendungen halte ich dies für eine hinreichend gute Annäherung:
distance = 3 * |dR| + 4 * |dG| + 3 * |dB|
Ich denke, eine gewichtete Manhattan-Distanz ist beim Vergleich von Farben viel sinnvoller. Denken Sie daran, dass Farbprimäre nur in unserem Kopf sind. Sie haben keine physikalische Bedeutung. CIELab und CIELuv werden statistisch aus unserer Farbwahrnehmung modelliert.
quelle
Für schnell und schmutzig können Sie tun
Verwendung der Ganzzahldivision zur Quantisierung der Farben.
quelle
Swift 5 Antwort
Ich habe diesen Thread gefunden, weil ich eine Swift-Version dieser Frage brauchte. Da niemand mit der Lösung geantwortet hat, ist hier meine:
Verwendung:
Ich habe einen Unterschied von weniger als 10% festgelegt, um ähnliche Farben zurückzugeben, aber Sie können dies selbst anpassen.
quelle
Android für ColorUtils API RGBToHSL: Ich hatte zwei int argb- Farben (color1, color2) und wollte Abstand / Unterschied zwischen den beiden Farben ermitteln. Hier ist was ich getan habe;
Dann habe ich den folgenden Code verwendet, um den Abstand zwischen den beiden Farben zu ermitteln.
quelle