Ähnlichkeit von Farben bestimmen

Schöne Pfingsten allen!

Welche(r) Farbe kommt cyan/CYAN am nächsten? Zur Auswahl stehen:
aqua, black, blue, fuchsia, gray, green, lime, maroon, navy,
olive, orange, purple, red, silver, teal, white -and- yellow.

?

Zufällig hab’ ich mich heute nacht mit der gleichen Frage beschäftigt. Aber wie ich schon in

schrieb: Die Distanz zwischen Farben auszurechnen macht meistens keinen Sinn (wenn man nicht seeehr tief in die Materie einsteigt…)

Welcher Berg kommt dem Matterhorn am nächsten? Welcher Papst kommt Bud Spencer am nächsten? Solche Fragen sind ohne Kriterium sinnlos. Wie stark wichtet man Unterschiede in der Helligkeit gegenüber Abweichungen im Farbton? Rechnet man ein, dass das(*) menschliche Auge bestimmte Farbtöne besser auseinanderhalten kann als andere? Physikalisch kann man den „Abstand“ der Wellenlängen heranziehen - aber das funktioniert nur für monochromatisches Licht. Und so weiter.

(*) wobei „das“ Auge wieder nur ein fiktionaler Durchschnitt ist. An dieser Stelle berühren wir das alte philosophische Qualia-Problem

Das ist aber wirklich Zufall gewesen!
Ich brauche gut „unterscheidbare“ Farben für ein Dokument, und rot, blau und grün reichen nicht mehr…

An HSV (nicht der Sportverein :roll_eyes: ) dachte ich auch schon.

Und, @Landei , bitte keine Wissenschaft raus machen, etwas wie:

‚Ich finde‘, Cyan ähnelt ‚für mich‘ Blau-grün, und das wiederum ähnelt Olive (nur ein Beispiel) ‚meiner subjektiven Wahrnehmung nach‘ am ehesten, also würd’ ich diese Farbe wählen,

das würd’ mir schon völlig reichen!

Erinnert mich an meine Anfangszeit bei meinem jetztigen Arbeitgeber. Da hatten wir extra kleine Post-Its die an die Tasks dran gehängt wurden - und ich hatte einen Blau-ton. Leider lagen da verschieden Post-its mit blau tönen und meine damalige Team Leiterin fand es ausgesprochen witzig zu sehen, wie ich jedes mal alle blauen Post-Its geholt hab, an einen meiner alten Tasks gegangen bin und die Farben verglichen hab^^.

Ich hatte im Discord Chat vor kurzem mein Microcontroller zur LED Steuerung vorgestellt den ich programmiert und verlötet hatte. Da musste ich feststellen, dass die Farbenlehre ein überaus krasses Thema ist und es einen gewaltigen Unterschied zwischen physikalischen Farben und vom menschlichen Auge empfundenen Farben gibt.

Mehrdimensionale logarithmische Funktionen, unterschiedliche Empfindlichkeit verschiedener Farben aber auch Helligkeiten bis zu Farben die das menschliche Auge überhaupt nicht sehen kann und das ganze darf man dann noch mischen.
Da ist 50 % Rot und 50 % Grün halt nicht Gelb, sondern Hellgrün - aber halt auch nur auf dieser Helligkeitsstufe. Boah.

Jetzt weiß ich zumindest warum manche so ein Theater um Farbwidergabe -Werte von Bildschirmen und Laptops machen.

Das Magenta der Telekom soll es angeblich gar nicht geben. :blush:

Ich hab mich jetzt hier durchgewühlt(ff.):

Der Vergleich von Farben macht schon Sinn, und ist auch wichtig, im Sinne eines Ähnlichkeitsmaßes. Ein Einstieg dafür kann das hier sein:

Man hat nun mal nicht sooo viele visuelle Variablen zur Verfügung, und eine davon ist Farbe. Das Problem hat man oft, in verschiedenen Visualisierungen: Wenn man z.B. irgendwelche Clustering-Ergebnisse (oder schon die Linien von einem Line-Chart!) mit verschiedenen Farben darstellen will, dann müssen die Farben „möglichst unterschiedlich“ sein. Rot, Grün, Blau - OK. Aber schon ein 0x00FF00-Grün hat ein gewaltiges Problem: Es sieht viel heller aus, als ein 0xFF0000-Rot oder ein 0x0000FF-Blau.

Als Mensch nimmt man Grüntöne viel prominenter wahr. Und wenn man z.B. das Hue vom HSV-Space gleichmäßig absamplet, um da z.B. 10 Farben rauszuziehen, dann hat man Rot, Gelb, Grün, Grün, Grün, Grün, Grün, Cyan, Blau, Lila … :unamused:

Das sieht man auch in den MacAdam-Ellipsen:

Die Ellipsen beschreiben (in dem Bild vergrößert dargestellt) den Bereich um einen Punkt im Farbraum, in dem man keinen Farbunterschied erkennen kann (JND, „Just Noticable Distance“). Im grünen Bereich sieht man, dass die Ellipsen viel größer sind.

(Ich hatte mit mit dem Thema mal ein bißchen beschäftigt. Unter anderem hatte ich beim GitHub - igd-iva/colormap-explorer: A tool for exploring 2D colormaps mitgebastelt (und gerade gesehen, dass ich auf dem Poster (abstract), das da rauskam, sogar als First Author draufstehe - hatte ich glatt verdrängt) - da kann man sich die MacAdams-Ellipsen für verschiedene ColorMaps anzeigen lassen)

Wie auch immer, auf der Wikipedia-Seite gibt’s die Links (und Formeln…) für eine „sinnvolle, wahrnehmungsbezogene Abstandsberechnung von Farben“. Ist alles nicht so trivial.

Für die faulen: Man kann sich auch einfach eine Palette von http://colorbrewer2.org/ schnappen, wenn’s schnell gehen muss…

Die Seite funktioniert gerade nicht. :frowning:

Aber, generell Danke für die Info!

Also die Farbdistanz ist schon mal ein guter Anzatz.

	private int nearestIndex(int color1) {
		if (((color1 & 0xFF000000) == 0) && (data.transparencyIndex >= 0)) {
			return data.transparencyIndex;
		}
		int smallestError = Integer.MAX_VALUE;

		int rc = -1;

		for (int n = 0; n < data.size; n++) {
			int color2 = data.get(n);
			if (color1 == color2) {
				return n;
			}
			int currentError = distanceSquared(color1, color2);
			if (smallestError > currentError) {
				smallestError = currentError;
				rc = n;
			}
		}
		return rc;
	}

In dem Int-Array data hält man die Farben vor, die in Frage kommen und cyan/CYAN übergibt man dann an die Methode.

Wie das nun helfen soll? Dass man sich für die Suche dann was bastelt…

...was man auch etwas allgemeiner schreiben könnte...
private static <T> int indexOfClosest(List<? extends T> list, T element,
    ToDoubleBiFunction<? super T, ? super T> distanceFunction)
{
    int minDistanceIndex = -1;
    double minDistance = Double.POSITIVE_INFINITY;
    for (int i = 0; i < list.size(); i++)
    {
        T other = list.get(i);
        double distance = distanceFunction.applyAsDouble(element, other);
        if (distance < minDistance)
        {
            minDistance = distance;
            minDistanceIndex = i;
        }
    }
    return minDistanceIndex;
}    

…ist ja klar. Die Frage ist ja: Was berechnet distanceSquared?