Domanda

Questa domanda ha già una risposta qui:

Diciamo n = 100;Come posso generare 100 colori visivamente distinti?Ciò è matematicamente possibile?

È stato utile?

Soluzione

100 è un sacco di colori, ma si potrebbe essere in grado di farlo, distribuendo loro come scarsamente possibile nel HSB o nello spazio HSL; farlo in RGB è probabilmente difficile.

Per esempio, si potrebbe decidere di utilizzare 10 tonalità differenti, 4 diversi livelli di saturazione, e 3 impostazioni di luminosità differenti, che si darebbe fino a 120 colori. Avrai bisogno di scegliere con cura i valori di saturazione e luminosità; occhi umani sono sensori complicato e confuso. Se si trattano lo spazio colore come un cono, probabilmente si vuole un diverso numero di tonalità ad ogni / livello di saturazione leggerezza.

Ecco un link alla wikipedia ingresso sul HSB .

Altri suggerimenti

Sì. Definire distinta è un prodotto di rinviare ad uno spazio colore poi quando diciamo colori massimamente distinti ciò intendiamo dire è colori che sono più lontano possibile da tutti gli altri colori possibili. Ma dal momento che lo spazio colore non cambia la risposta non sta per cambiare. E l'attuazione di qualcosa che meglio si adatta con occhi umani e di come gli occhi umani vedono il colore come CIE-Lab distanza colore DE2000 fa rifare tutti i calcoli difficile, ma fa un elenco statico facile. Ecco 128 voci.

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"
};

Ecco la prima 256 sotto forma di immagine.

distanza massima

(da sinistra a destra) (dall'alto verso il basso). Potreste essere in grado di ottenere un paio di colori distinti se fatto in modo che ogni colore era equidistante possibile entro lo spazio colore. Che tabella di ricerca raccoglie ogni colore supplementare come massimo distinto da tutti i colori precedenti piuttosto che designa la N all'inizio e poi mappatura lo spazio colore. Quindi sì, la forza bruta e un algoritmo di colore dsitance di alto livello e il gioco è fatto per rendere questo stesso insieme di colori da soli. Nel corso di un giorno o due.

Modificare:

Non ho alcuna esperienza in questo settore e le mie capacità matematiche sono piuttosto nella media.Ma sono dell'opinione che la soluzione a questo problema sia più complessa e interessante di quanto suggeriscano molte risposte qui, dal momento che ho provato a fare qualcosa di simile di recente e non ho trovato una soluzione.

Differenza di colore

La percezione del colore è ovviamente soggettiva, ma esiste un accordo significativo tra gli esseri umani.Ad esempio, siamo tutti d’accordo sul fatto che il rosso, il verde e il blu sono colori molto diversi, e anche le persone daltoniche concordano sul fatto che il bianco e il nero sono molto diversi.

RGB

La rappresentazione più comune del colore nei sistemi informatici è il vettore (r, sol, b) che suggerisce una semplice funzione di distanza come

RGB color difference

Impostiamo l'intervallo per R, G E B A [0, 1] e guarda come funziona:

  1. Rosso (1, 0, 0) e rosso (1, 0, 0) ha la distanza di 0, il che dovrebbe essere ovvio
  2. Rosso (1, 0, 0) e giallo (1, 1, 0) ha la distanza di 1, che è inferiore alla distanza di
  3. Rosso (1, 0, 0) e blu (0, 0, 1) che è quadrato(2), il che è plausibile

Fin qui tutto bene.Il problema però è che il blu e il rosso hanno la stessa distanza 1 dal nero (0, 0, 0), ma guardando l'immagine questo non sembra essere vero:

blue and red on black

Anche giallo (1, 1, 0) e magenta (1, 0, 1) entrambi hanno la stessa distanza 1 dal bianco (1, 1, 1), anche questo non sembra avere senso:

yellow and magenta on white

HSL e HSV

Penso che sia lecito ritenere che le metriche analogiche per il Combinazioni di colori HSL e HSV hanno gli stessi problemi.Queste combinazioni di colori non sono progettate per confrontare i colori.

CIEDE2000

Fortunatamente, ci sono già scienziati che stanno cercando di trovare un buon modo per confrontare i colori.Hanno escogitato alcuni metodi elaborati, l'ultimo dei quali è stato CIEDE2000

CIEDE2000

(la formula completa descritta nell'articolo è Enorme)

Questa metrica prende in considerazione la percezione umana, come il fatto che sembriamo incapaci di distinguere molto bene le sfumature del blu.Quindi direi che usiamo questa come funzione di differenza cromatica.

L'algoritmo di selezione del colore

Soluzione ingenua

Alcune risposte hanno suggerito il seguente algoritmo

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

Questo algoritmo presenta alcuni problemi:

  1. La spaziatura dei colori non è ottimale.Se immaginiamo che i colori siano come numeri su una linea, tre numeri sarebbero distanziati in modo ottimale in questo modo:

    |a-----b-----c|

    Inserire un numero in più senza spostare a, b e c è chiaramente peggio che riallineare tutti i colori.

  2. Non è garantito che l'algoritmo termini.Cosa succede se non c'è nessun colore sufficientemente lontano dai colori esistenti nell'elenco?Il ciclo continuerà per sempre

Soluzione adeguata

BENE..Non ne ho uno.

Si desidera convertire in HSL e poi scorrere i valori della tonalità (H), mantenendo gli altri 2 valori costanti.

Per ogni valore si convertire da HSL torna a RGB .

Vedere le mie risposte qui e qui .

Se la N è molto grande e quindi i colori non sono visivamente distinte si potrebbe a quel punto ri-iterare su tutti gli stessi colori e cambiare gli altri componenti di variare la saturazione o la luminosità. Quindi, in pratica si potrebbe avere un numero massimo di valori di tonalità da usare, e una volta che è colpito si può ricominciare da capo con una saturazione o la luminosità differenti.

Non è una risposta alla tua domanda, ma, se n ha un valore massimo e la vostra applicazione lo consente, è possibile utilizzare un elenco predefinito di colori in questo modo:

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

Un vantaggio è che si potrebbe mostrare un nome di colore umanamente leggibile in un suggerimento per le persone con daltonismo.

Per cominciare, non usano lo spazio RGB; è difficile trovare uno spazio colore peggio per questo problema. (A seconda se si sta utilizzando i colori per la visualizzazione o per la stampa hai un gran numero di colori indistinguibili vicino nero o bianco vicino.)

Se si utilizza lo spazio Lab, ci sono modelli di colore percettivi (CIE 1996? E CIE 2000) per misurare la vicinanza visiva dei colori (per la stampa e la visualizzazione, rispettivamente).

Non si dice se si sta andando a calcolare i colori una volta e memorizzare il risultato, o se hanno bisogno di essere ricalcolato al volo (e in quel caso se deve essere deterministica o meno). Ovviamente ogni discussione del modo migliore per generare il set sarebbe dipendere da quello.

Ho però suggerire che uniformemente dividendo gli assi dello spazio colore (dicono in 8) e con quelli come punti iniziali sarebbe molto più efficiente di qualsiasi processo casuale. Certo, avete solo bisogno di confrontare qualsiasi punto per i suoi vicini (e solo se sono già nel set), che vi farà risparmiare un enorme numero di confronti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top