Ich habe die beiden folgenden Methoden geschrieben, um automatisch N verschiedene Farben auszuwählen. Es funktioniert durch Definieren einer stückweise linearen Funktion auf dem RGB-Würfel. Dies hat den Vorteil, dass Sie auch eine progressive Skala erhalten können, wenn Sie dies wünschen. Wenn N jedoch groß wird, können die Farben ähnlich aussehen. Ich kann mir auch vorstellen, den RGB-Würfel gleichmäßig in ein Gitter zu unterteilen und dann Punkte zu zeichnen. Kennt jemand andere Methoden? Ich schließe es aus, eine Liste zu definieren und sie dann einfach durchzugehen. Ich sollte auch sagen, dass es mir im Allgemeinen egal ist, ob sie zusammenstoßen oder nicht gut aussehen, sie müssen nur visuell unterschiedlich sein.
public static List<Color> pick(int num) {
List<Color> colors = new ArrayList<Color>();
if (num < 2)
return colors;
float dx = 1.0f / (float) (num - 1);
for (int i = 0; i < num; i++) {
colors.add(get(i * dx));
}
return colors;
}
public static Color get(float x) {
float r = 0.0f;
float g = 0.0f;
float b = 1.0f;
if (x >= 0.0f && x < 0.2f) {
x = x / 0.2f;
r = 0.0f;
g = x;
b = 1.0f;
} else if (x >= 0.2f && x < 0.4f) {
x = (x - 0.2f) / 0.2f;
r = 0.0f;
g = 1.0f;
b = 1.0f - x;
} else if (x >= 0.4f && x < 0.6f) {
x = (x - 0.4f) / 0.2f;
r = x;
g = 1.0f;
b = 0.0f;
} else if (x >= 0.6f && x < 0.8f) {
x = (x - 0.6f) / 0.2f;
r = 1.0f;
g = 1.0f - x;
b = 0.0f;
} else if (x >= 0.8f && x <= 1.0f) {
x = (x - 0.8f) / 0.2f;
r = 1.0f;
g = 0.0f;
b = x;
}
return new Color(r, g, b);
}
Antworten:
Sie können das HSL-Farbmodell verwenden , um Ihre Farben zu erstellen.
Wenn Sie nur unterschiedliche Farbtöne (wahrscheinlich) und geringfügige Abweichungen in Bezug auf Helligkeit oder Sättigung wünschen, können Sie die Farbtöne wie folgt verteilen:
quelle
Diese Frage taucht in einigen SO-Diskussionen auf:
Es werden verschiedene Lösungen vorgeschlagen, aber keine ist optimal. Zum Glück kommt die Wissenschaft zur Rettung
Willkürlich N.
Die letzten 2 sind über die meisten Universitätsbibliotheken / Proxies kostenlos.
N ist endlich und relativ klein
In diesem Fall könnte man sich für eine Listenlösung entscheiden. Ein sehr interessanter Artikel zu diesem Thema ist frei verfügbar:
Es sind mehrere Farblisten zu berücksichtigen:
Ich bin auch auf diese Palette von einem MIT-Studenten gestoßen. Schließlich können die folgenden Links beim Konvertieren zwischen verschiedenen Farbsystemen / -koordinaten hilfreich sein (einige Farben in den Artikeln sind beispielsweise nicht in RGB angegeben):
Für Kellys und Boyntons Liste habe ich bereits die Konvertierung in RGB vorgenommen (mit Ausnahme von Weiß und Schwarz, was offensichtlich sein sollte). Etwas C # -Code:
Und hier sind die RGB-Werte in Hex- und 8-Bit-pro-Kanal-Darstellungen:
Für alle Java-Entwickler sind hier die JavaFX-Farben:
Das Folgende sind die unsortierten Kellyfarben gemäß der obigen Reihenfolge.
Das Folgende sind die sortierten Kellyfarben nach Farbtönen (beachten Sie, dass einige Gelbtöne nicht sehr kontrastreich sind).
quelle
Wie Uri Cohens Antwort, ist aber stattdessen ein Generator. Beginnen Sie mit Farben, die weit voneinander entfernt sind. Deterministisch.
Beispiel, linke Farben zuerst:
quelle
Hier ist eine Idee. Stellen Sie sich einen HSV-Zylinder vor
Definieren Sie die gewünschten oberen und unteren Grenzen für Helligkeit und Sättigung. Dies definiert einen Ring mit quadratischem Querschnitt innerhalb des Raums.
Streuen Sie nun N Punkte zufällig in diesen Raum.
Wenden Sie dann einen iterativen Abstoßungsalgorithmus auf sie an, entweder für eine feste Anzahl von Iterationen oder bis sich die Punkte stabilisieren.
Jetzt sollten Sie N Punkte haben, die N Farben darstellen, die innerhalb des gewünschten Farbraums so unterschiedlich wie möglich sind.
Hugo
quelle
Für die kommenden Generationen füge ich hier die akzeptierte Antwort in Python hinzu.
quelle
Jeder scheint die Existenz des sehr nützlichen YUV-Farbraums übersehen zu haben, der entworfen wurde, um wahrgenommene Farbunterschiede im menschlichen visuellen System darzustellen. Entfernungen in YUV repräsentieren Unterschiede in der menschlichen Wahrnehmung. Ich brauchte diese Funktionalität für MagicCube4D, das 4-dimensionale Rubik-Würfel und eine unbegrenzte Anzahl anderer 4D-Twisty-Puzzles mit einer beliebigen Anzahl von Gesichtern implementiert.
Meine Lösung beginnt damit, zufällige Punkte in YUV auszuwählen und dann die nächsten zwei Punkte iterativ aufzubrechen und erst dann in RGB zu konvertieren, wenn das Ergebnis zurückgegeben wird. Die Methode ist O (n ^ 3), aber das spielt keine Rolle für kleine Zahlen oder solche, die zwischengespeichert werden können. Es kann sicherlich effizienter gemacht werden, aber die Ergebnisse scheinen ausgezeichnet zu sein.
Die Funktion ermöglicht die optionale Angabe von Helligkeitsschwellenwerten, um keine Farben zu erzeugen, bei denen keine Komponente heller oder dunkler als die angegebenen Mengen ist. IE Sie möchten möglicherweise keine Werte in der Nähe von Schwarz oder Weiß. Dies ist nützlich, wenn die resultierenden Farben als Grundfarben verwendet werden, die später durch Beleuchtung, Überlagerung, Transparenz usw. schattiert werden und sich dennoch von ihren Grundfarben unterscheiden müssen.
quelle
Das HSL-Farbmodell eignet sich möglicherweise gut zum "Sortieren" von Farben. Wenn Sie jedoch nach visuell unterschiedlichen Farben suchen, benötigen Sie definitiv das Lab- Farbmodell.
Sobald Sie wissen, dass das Finden der optimalen Teilmenge von N Farben aus einer Vielzahl von Farben immer noch ein (NP) schwieriges Problem ist, das dem Problem des reisenden Verkäufers ähnelt und alle Lösungen, die k-Mittelwert-Algorithmen verwenden, oder etwas anderes nicht wirklich Hilfe.
Das heißt, wenn N nicht zu groß ist und Sie mit einem begrenzten Satz von Farben beginnen, finden Sie leicht eine sehr gute Teilmenge von unterschiedlichen Farben entsprechend einer Laborentfernung mit einer einfachen Zufallsfunktion.
Ich habe ein solches Tool für meinen eigenen Gebrauch codiert (Sie finden es hier: https://mokole.com/palette.html ). Folgendes habe ich für N = 7 erhalten:
Es ist alles Javascript, also schauen Sie sich die Quelle der Seite an und passen Sie sie an Ihre eigenen Bedürfnisse an.
quelle
L
0-128 unda
undb
von -128 bis 128. ¶ Ich begann mitL
= 0,a
= -128,b
= -128 , die ein helles Blau. Dann habe icha
dreimal zugenommen . ❶ Die große Änderung (+128)a
= 50 führt zu einem nur geringfügig dunkleren Blau. ❷ (+85)a
= 85 ergibt immer noch blau. ❸ Die relativ kleine Änderung (+43)a
= 128 ändert jedoch die Farbe vollständig in Fuchsia.Hier ist eine Lösung zur Verwaltung Ihres "eindeutigen" Problems, die völlig übertrieben ist:
Erstellen Sie eine Einheitskugel und legen Sie Punkte mit abstoßenden Ladungen darauf ab. Führen Sie ein Partikelsystem aus, bis sie sich nicht mehr bewegen (oder das Delta "klein genug" ist). Zu diesem Zeitpunkt sind alle Punkte so weit wie möglich voneinander entfernt. Konvertiere (x, y, z) in rgb.
Ich erwähne es, weil diese Art der Lösung für bestimmte Problemklassen besser funktionieren kann als rohe Gewalt.
Ich habe diesen Ansatz ursprünglich hier gesehen, um eine Kugel zu tesselieren.
Auch hier funktionieren die naheliegendsten Lösungen zum Durchlaufen von HSL- oder RGB-Speicher wahrscheinlich einwandfrei.
quelle
Ich würde versuchen, die Sättigung und die Beleuchtung auf das Maximum zu bringen und mich nur auf den Farbton zu konzentrieren. Wie ich es sehe, kann H von 0 auf 255 gehen und sich dann umwickeln. Wenn Sie nun zwei kontrastierende Farben möchten, nehmen Sie die gegenüberliegenden Seiten dieses Rings, dh 0 und 128. Wenn Sie 4 Farben möchten, nehmen Sie einige, die durch 1/4 der 256 Länge des Kreises getrennt sind, dh 0, 64.128.192. Und natürlich, wie andere vorgeschlagen haben, wenn Sie N Farben benötigen, können Sie diese einfach durch 256 / N trennen.
Was ich dieser Idee hinzufügen möchte, ist die Verwendung einer umgekehrten Darstellung einer Binärzahl, um diese Sequenz zu bilden. Schau dir das an:
... auf diese Weise können Sie, wenn Sie N verschiedene Farben benötigen, einfach die ersten N Zahlen nehmen, diese umkehren und so viele entfernte Punkte wie möglich erhalten (wobei N die Zweierpotenz ist), während Sie gleichzeitig jedes Präfix der beibehalten Reihenfolge unterscheidet sich sehr.
Dies war ein wichtiges Ziel in meinem Anwendungsfall, da ich ein Diagramm hatte, in dem die Farben nach dem von dieser Farbe abgedeckten Bereich sortiert waren. Ich wollte, dass die größten Bereiche des Diagramms einen großen Kontrast haben, und ich war damit einverstanden, dass einige kleine Bereiche ähnliche Farben wie die Top 10 haben, da es für den Leser offensichtlich war, welcher welcher ist, indem er nur den Bereich beobachtete.
quelle
getfracs
. Aber Ihr Ansatz ist schnell und „einfach“ in Low-Level - Sprachen: Bit in C umgekehrt .Wenn N groß genug ist, erhalten Sie einige ähnlich aussehende Farben. Es gibt nur so viele von ihnen auf der Welt.
Warum verteilen Sie sie nicht einfach gleichmäßig über das Spektrum?
Wenn Sie die Sequenz so mischen möchten, dass ähnliche Farben nicht nebeneinander liegen, können Sie die resultierende Liste möglicherweise mischen.
Denke ich das?
quelle
Dies ist in MATLAB trivial (es gibt einen hsv-Befehl):
quelle
Ich habe ein Paket für R namens qualpalr geschrieben , das speziell für diesen Zweck entwickelt wurde. Ich empfehle Ihnen, sich die Vignette anzusehen , um herauszufinden, wie sie funktioniert, aber ich werde versuchen, die wichtigsten Punkte zusammenzufassen.
qualpalr nimmt eine Spezifikation von Farben im HSL-Farbraum (der zuvor in diesem Thread beschrieben wurde), projiziert sie in den DIN99d-Farbraum (der wahrnehmungsmäßig einheitlich ist) und findet die
n
, die den Mindestabstand zwischen ihnen maximieren.quelle
Ich denke, dieser einfache rekursive Algorithmus ergänzt die akzeptierte Antwort, um unterschiedliche Farbtonwerte zu erzeugen. Ich habe es für hsv gemacht, kann aber auch für andere Farbräume verwendet werden.
Es erzeugt Farbtöne in Zyklen, die in jedem Zyklus so getrennt wie möglich voneinander sind.
Ich konnte diese Art von Algorithmus hier nicht finden. Ich hoffe es hilft, es ist mein erster Beitrag hier.
quelle
Diese OpenCV-Funktion verwendet das HSV-Farbmodell, um
n
gleichmäßig verteilte Farben um 0 <= H <= 360º mit maximal S = 1,0 und V = 1,0 zu erzeugen . Die Funktion gibt die BGR-Farben aus inbgr_mat
:quelle