Dire n = 100; Come faccio a generare 100 colori visivamente distinti? È questo matematicamente possibile?
Come generare i colori n diversi per ogni numero naturale n?
Si desidera convertire in HSL e poi scorrere i valori della tonalità (H), mantenendo gli altri 2 valori costanti.
Per ogni valore si converte da HSL torna a RGB .
Vedere le mie risposte qui e qui .
Se il N è molto grande e pertanto i colori non sono visivamente distinte si potrebbe a questo punto ri-iterazioni su tutte le stesse tonalità e modificare gli altri componenti per variare la saturazione o 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.
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.
Ad 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 luminosità / saturazione.
Ecco un link alla wikipedia ingresso su HSB .
Modificare:
Non ho alcuna esperienza in questo settore e le mie abilità matematiche sono piuttosto mediocre. Ma ho l'opinione che la soluzione a questo problema è più complesso e interessante di molte risposte qui suggeriscono, dal momento che ho cercato di fare qualcosa di simile da poco e non ho trovato una soluzione.
Differenza di colore
La percezione del colore è naturalmente soggettivo, ma non v'è significativo accordo tra gli esseri umani. Ad esempio, siamo tutti d'accordo che il rosso, verde e blu sono colori molto diversi, e anche le persone daltonici d'accordo che in bianco e nero sono molto diversi.
RGB
La rappresentazione più comune di colore nei sistemi di computer è il vettore (r, g, b) che suggerisce una semplice funzione di distanza come

Consente di impostare l'intervallo per r , g e b a [0, 1] e vedere come funziona:
- Rosso (1, 0, 0) e rosso (1, 0, 0) è la distanza di 0 , che dovrebbe essere ovvio
- Rosso (1, 0, 0) e giallo (1, 1, 0) ha la distanza di 1 , che è minore della distanza di
- Rosso (1, 0, 0) e blu (0, 0, 1) che è sqrt (2) , 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 quando si guarda l'immagine questo non sembra valere:

Anche gialla (1, 1, 0) e magenta (1, 0, 1) entrambi hanno la stessa distanza di 1 dal bianco (1, 1, 1) , che non sembra avere senso sia:

HSL e HSV
Penso che sia lecito ritenere che i parametri analogici per gli schemi di HSL e di colori HSV hanno gli stessi problemi. Queste combinazioni di colori non sono progettati per il confronto di colore.
CIEDE2000
Per fortuna, ci sono scienziati già cercando di trovare un buon modo per confrontare i colori. Sono venuti su con alcuni metodi elaborati, l'ultima delle quali CIEDE2000

(la formula piena descritto in questo articolo è enorme )
Questa metrica prende la percezione umana in considerazione, come il fatto che ci sembra di non essere in grado di discernere tonalità di blu molto bene. Quindi direi che usiamo questo come la nostra funzione differenza di colore.
Il Picking algoritmo a colori
soluzione naive
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 ha qualche problema:
La spaziatura dei colori non è ottimale. Se immaginiamo i colori per essere come i numeri su una linea, tre numeri sarebbero distanziati in modo ottimale in questo modo:
| A ----- ----- b c |
Imballaggio un ulteriore numero in là senza muoversi a, b, ec è chiaramente peggiore di riallineare tutti i colori.
L'algoritmo non è garantito per terminare . Che cosa succede se non c'è colore che è abbastanza lontano formare i colori esistenti nella lista? Il ciclo continuerà per sempre
soluzione adeguata
Beh .. non ho uno.
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 come questo:
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 utilizzare 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 dire che se avete intenzione di 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 deterministico o non). Ovviamente ogni discussione del modo migliore per generare il set sarebbe dipendere da quello.
Sebbene Vorrei suggerire che uniformemente dividendo gli assi dello spazio colore (dire 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.
Si. 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 il primo 256 come immagine.

(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.













