Wie n verschiedene Farben für jede natürliche Zahl n generieren?

stimmen
35

Sagen, n = 100; Wie generiere ich 100 visuell unterschiedliche Farben? Ist dies mathematisch möglich?

Veröffentlicht am 24/02/2010 um 19:09
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
4

Sie wollen HSL und dann durchlaufen die Werte des Farbtons (H) während die anderen zwei Werte konstant zu konvertieren.

Für jeden Wert , den Sie konvertieren von HSL zu RGB zurück .

Sehen Sie meine Antworten hier und hier .

Wenn Ihr N sehr groß ist und damit die Farben nicht visuell verschieden Sie an diesem Punkt könnte erneut durchlaufen alle die gleichen Farben über und die anderen Komponenten ändern, um die Sättigung oder Helligkeit zu variieren. Also im Grunde können Sie eine maximale Anzahl von Farbtonwerten haben zu verwenden, und einmal, dass getroffen ist, können Sie mit einer anderen Sättigung oder Helligkeit von vorn beginnen.

Beantwortet am 24/02/2010 um 19:11
quelle vom benutzer

stimmen
4

100 ist eine Menge von Farben, aber Sie könnten es tun können, indem sich als dünn wie möglich in den HSB oder HSL Raum zu verteilen; tut es in RGB ist wahrscheinlich schwierig.

Zum Beispiel können entscheiden, ob Sie 10 verschiedene Farbtöne zu verwenden, 4 verschiedene Sättigungswerte und 3 verschiedene Helligkeitseinstellungen, das würde Sie zu 120 Farben verzichten. Hier finden Sie die Sättigung und Helligkeitswerte sorgfältig auswählen müssen; das menschliche Auge sind kompliziert und verwirrend Sensoren. Wenn Sie den Farbraum als Kegel behandeln, werden Sie wahrscheinlich bei jeder Helligkeit / Sättigung Ebene eine unterschiedliche Anzahl von Farbtönen wollen.

Hier ist ein Link zu Wikipedia - Eintrag auf HSB .

Beantwortet am 24/02/2010 um 19:11
quelle vom benutzer

stimmen
33

Bearbeiten:

Ich habe keine Erfahrung auf diesem Gebiet und meine mathematischen Fähigkeiten sind ziemlich durchschnittlich. Aber ich habe die Meinung, dass die Lösung für dieses Problem ist komplexer und interessanter als viele Antworten hier vorschlagen, da ich versuchte, etwas ähnliches vor kurzem zu tun, und das fand keine Lösung.

Farblicher Unterschied

Die Wahrnehmung von Farbe ist natürlich subjektiv, aber es gibt signifikante Übereinstimmung zwischen den Menschen. Zum Beispiel können wir uns alle einig, dass Rot, Grün und Blau sind sehr verschieden Farben und sogar farbenblinde Menschen stimmen darin überein, dass schwarz und weiß sehr unterschiedlich sind.

RGB

Die gebräuchlichste Darstellung der Farbe in Computersystemen ist der Vektor (r, g, b) was darauf schließen läßt , eine einfache Abstandsfunktion wie

RGB-Farbdifferenz

Lässt den Bereich für setzen r , g und b auf [0, 1] und sehen Sie, wie das funktioniert:

  1. Red (1, 0, 0) und rot (1, 0, 0) hat den Abstand von 0 , was offensichtlich sein sollte
  2. Red (1, 0, 0) und Gelb (1, 1, 0) , muss den Abstand von 1 , die kleiner ist als der Abstand von
  3. Red (1, 0, 0) und Blau (0, 0, 1) , das ist sqrt (2) , was plausibel ist

So weit, ist es gut. Das Problem ist jedoch, dass blau und rot , um den gleichen Abstand haben 1 von Schwarz (0, 0, 0) , aber wenn auf das Bild schaut das scheint nicht zu halten wahr:

blau und rot auf schwarz

Auch gelb (1, 1, 0) und Magenta (1, 0, 1) haben beide den gleichen Abstand haben 1 von Weiß (1, 1, 1) , die scheint nicht sinnvoll , entweder:

Gelb und Magenta auf Weiß

HSL und HSV

Ich denke , es ist sicher , dass die analogen Messwerte für die davon ausgehen , HSL und HSV - Farbschemata die gleichen Probleme haben. Diese Farbschemata sind nicht für den Vergleich von Farbe gestaltet.

CIEDE2000

Zum Glück gibt es Wissenschaftler bereits einen guten Weg zu finden versuchen , Farben zu vergleichen. Sie kamen mit einigen aufwendigen Methoden auf, die letzte ein Wesen CIEDE2000

CIEDE2000

(die vollständige Formel in dem Artikel beschrieben ist riesig )

Diese Metrik nimmt die menschliche Wahrnehmung in Betracht zieht, wie die Tatsache, dass wir sehr gut zu sein, nicht in der Lage scheinen Schattierungen von Blau zu erkennen. Also würde ich sagen, dass wir dies als unsere Farbdifferenzfunktion.

Der Color Picking-Algorithmus

naive Lösung

Einige Antworten vorgeschlagen, den folgenden Algorithmus

colors = []
for n in range(n):
    success=False
    while not success:
        new_color = random_color()
        for color in colors:
            if distance(color, new_color)>far_enough:
                colors.append(new_color)
                success = True
                break

Dieser Algorithmus hat einige Probleme:

  1. Der Abstand der Farben ist nicht optimal. Wenn wir die Farben vorstellen, wie Zahlen zu sein, auf einer Linie, würden drei Zahlen optimal wie folgt angeordnet werden:

    | A ----- ----- b c |

    eine zusätzliche eine Zahl dort Verpackung ohne sich zu bewegen a, b, und c ist deutlich schlechter als alle Farben neu auszurichten.

  2. Der Algorithmus ist nicht zu beenden garantiert . Was , wenn es keine Farbe , die weit genug bildet die vorhandenen Farben in der Liste? Die Schleife wird auch weiterhin für immer

Die richtige Lösung

Nun .. ich habe nicht ein.

Beantwortet am 24/02/2010 um 19:17
quelle vom benutzer

stimmen
2

Keine Antwort auf Ihre Frage, aber, wenn n einen Maximalwert hat und Ihre Anwendung ermöglicht es, könnten Sie eine vordefinierte Liste von Farben wie folgt verwenden:

http://en.wikipedia.org/wiki/List_of_colors

Ein Vorteil ist, dass Sie eine menschlich lesbare Farbbezeichnung in einem Tooltip für Menschen mit Farbenblindheit zeigen konnten.

Beantwortet am 24/02/2010 um 19:31
quelle vom benutzer

stimmen
1

Für den Anfang verwenden RGB-Raum nicht; es ist schwer, einen schlechteren Farbraum für dieses Problem zu finden. (Je nachdem, ob Sie die Farben für die Anzeige verwenden oder für den Druck Sie haben entweder große Anzahl von nicht zu unterscheiden Farben in der Nähe von Schwarz oder in der Nähe weiß.)

Wenn Sie Lab-Raum verwenden, gibt es wahrnehmbare Farbmodelle (CIE 1996? Und CIE 2000) für die visuelle Nähe von Farben Messung (für Druck und Anzeige respectively).

Was Sie nicht sagen, wenn Sie die Farben einmal berechnen gehen und das Ergebnis, oder wenn sie benötigen, im laufenden Betrieb neu berechnet werden (und in diesem Fall, wenn es hat deterministisch oder nicht sein). Offensichtlich jede Diskussion darüber, wie am besten den Satz zu erzeugen, würde sich verlassen.

Obwohl ich, dass gleichmäßig Aufteilen der Achsen des Farbraumes (sagen wir in 8) und unter Verwendung von jenen als Anfangspunkte vorschlagen würde viel effizienter als irgendein zufälliger Prozess wäre. Sicherlich müssen Sie nur jeden Punkt zu seinen Nachbarn vergleichen (und nur dann, wenn sie sind bereits im Set), mit dem Sie eine große Anzahl von Vergleichen sparen.

Beantwortet am 24/02/2010 um 20:19
quelle vom benutzer

stimmen
34

Ja. Definieren verschieden ist ein Produkt in einen Farbraum von Aufschieben dann, wenn wir maximal verschiedene Farben sagen, was wir zu sagen, meine sind, Farben, die so weit von allen anderen Farben wie möglich sind. Aber da der Farbraum die Antwort nicht ändern wird sich nicht ändern würde. Und die Umsetzung etwas, das besser passt mit menschlichen Augen und wie das menschliche Auge sehen Farbe wie CIE-Lab DE2000 Farbabstand macht schwer, alle Berechnungen redoing, sondern macht eine statische Liste einfach. Hier ist 128 Einträge.

private static final String[] indexcolors = new String[]{
        "#000000", "#FFFF00", "#1CE6FF", "#FF34FF", "#FF4A46", "#008941", "#006FA6", "#A30059",
        "#FFDBE5", "#7A4900", "#0000A6", "#63FFAC", "#B79762", "#004D43", "#8FB0FF", "#997D87",
        "#5A0007", "#809693", "#FEFFE6", "#1B4400", "#4FC601", "#3B5DFF", "#4A3B53", "#FF2F80",
        "#61615A", "#BA0900", "#6B7900", "#00C2A0", "#FFAA92", "#FF90C9", "#B903AA", "#D16100",
        "#DDEFFF", "#000035", "#7B4F4B", "#A1C299", "#300018", "#0AA6D8", "#013349", "#00846F",
        "#372101", "#FFB500", "#C2FFED", "#A079BF", "#CC0744", "#C0B9B2", "#C2FF99", "#001E09",
        "#00489C", "#6F0062", "#0CBD66", "#EEC3FF", "#456D75", "#B77B68", "#7A87A1", "#788D66",
        "#885578", "#FAD09F", "#FF8A9A", "#D157A0", "#BEC459", "#456648", "#0086ED", "#886F4C",

        "#34362D", "#B4A8BD", "#00A6AA", "#452C2C", "#636375", "#A3C8C9", "#FF913F", "#938A81",
        "#575329", "#00FECF", "#B05B6F", "#8CD0FF", "#3B9700", "#04F757", "#C8A1A1", "#1E6E00",
        "#7900D7", "#A77500", "#6367A9", "#A05837", "#6B002C", "#772600", "#D790FF", "#9B9700",
        "#549E79", "#FFF69F", "#201625", "#72418F", "#BC23FF", "#99ADC0", "#3A2465", "#922329",
        "#5B4534", "#FDE8DC", "#404E55", "#0089A3", "#CB7E98", "#A4E804", "#324E72", "#6A3A4C",
        "#83AB58", "#001C1E", "#D1F7CE", "#004B28", "#C8D0F6", "#A3A489", "#806C66", "#222800",
        "#BF5650", "#E83000", "#66796D", "#DA007C", "#FF1A59", "#8ADBB4", "#1E0200", "#5B4E51",
        "#C895C5", "#320033", "#FF6832", "#66E1D3", "#CFCDAC", "#D0AC94", "#7ED379", "#012C58"
};

Hier ist die erste 256 als ein Bild.

maximale Entfernung

(Von links nach rechts) (von oben nach unten). Sie könnten in der Lage, ein paar verschiedene Farben zu erhalten, wenn Sie sich vergewissern jede Farbe im Farbraum als gleich weit wie möglich war. Die Lookup-Tabelle nimmt jede weitere Farbe als maximal unterscheidet sie von allen bisherigen Farben anstatt die N am Anfang benannt und dann den Farb abbildet. Also ja, Brute-Force und ein hoher Farb dsitance Algorithmus und Sie setzen Sie sich mit diesem gleichen Satz von Farben zu machen. Im Laufe eines Tages oder so.

Beantwortet am 30/11/2013 um 09:18
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more