Say n = 100; Cum pot genera 100 de culori distincte vizual? Este posibil matematic?
Cum de a genera culori n diferite pentru orice număr natural n?
Vrei să se convertească la HSL și apoi itera valorile nuanței (H), păstrând în același timp celelalte 2 valori constante.
Pentru fiecare valoare pe care convertesc la HSL înapoi la RGB .
A se vedea răspunsurile mele aici și aici .
În cazul în care dvs. N este foarte mare și, prin urmare, culorile nu sunt vizual distincte ai putea la acel punct de re-itera peste tot din aceleași nuanțe și modificați celelalte componente pentru a varia saturația sau luminozitatea. Deci, practic ai putea avea un număr maxim de valori de nuanță utiliza, și o dată că este lovit puteți începe peste cu o altă saturație sau luminozitate.
100 este o mulțime de culori, dar s-ar putea fi capabil să o facă prin distribuirea lor ca slab posibil în HSB sau spațiul HSL; o fac în RGB este, probabil, dificil.
De exemplu, s-ar putea decide să utilizeze 10 nuanțe diferite, 4 nivele diferite de saturație și 3 setări de luminozitate diferite, care le-ar da de până la 120 de culori. Va trebui să alegeți cu atenție valorile de saturație și luminozitate; ochii umani sunt senzori de complicate și confuze. Dacă trata spațiul de culoare ca un con, veți dori, probabil, un număr diferit de nuanțe de la fiecare nivel de luminozitate / saturație.
Iată un link la wikipedia intrarea pe HSB .
Editați | ×:
Nu am nici o expertiză în acest domeniu și abilitățile mele de matematica sunt destul de medie. Dar am de părere că soluția la această problemă este mult mai complexă și mai interesant decât multe răspunsuri sugerează aici, din moment ce am încercat să fac ceva similar recent și nu a găsit o soluție.
diferenţă de culoare
Percepția culorii este, desigur, subiectiv, dar există un acord între om important. De exemplu, putem cu toții de acord că roșu, verde și albastru sunt culori foarte diferite, chiar și oamenii colorblind sunt de acord că alb-negru sunt foarte diferite.
RGB
Cea mai comună reprezentare a culorii în sistemele de calcul este vectorul (r, g, b) ceea ce sugerează o funcție simplă distanță cum ar fi

Permite seta domeniul pentru r , g și b până la [0, 1] și a vedea cum funcționează:
- Red (1, 0, 0) și roșu (1, 0, 0) are distanța de 0 , care ar trebui să fie evident
- Red (1, 0, 0) și galben (1, 1, 0) are distanța de 1 , care este mai mică decât distanța de
- Red (1, 0, 0) și albastru (0, 0, 1) , care este sqrt (2) , care este plauzibilă
Până acum, bine. Problema este însă că albastru și roșu au aceeași distanță de 1 de la negru (0, 0, 0) , dar atunci când se uită la imaginea aceasta nu pare să dețină adevărate:

De asemenea , galben (1, 1, 0) și magenta (1, 0, 1) , ambele au au aceeași distanță de 1 de la alb (1, 1, 1) , care nu pare să aibă sens , fie:

HSL și HSV
Cred că este sigur să se presupună că valorile analogice pentru schemele de HSL și HSV culoare au aceleași probleme. Aceste scheme de culori nu sunt proiectate pentru a compara culoarea.
CIEDE2000
Din fericire, există oameni de știință deja încearcă să găsească o modalitate buna de a compara culori. Ei au venit cu unele metode elaborate, ultima dintre ele fiind CIEDE2000

(formula integral descrisă în articol este imens )
Această valoare ia în considerare percepția umană, cum ar fi faptul că se pare că suntem în imposibilitatea de a discerne nuanțe de albastru, foarte bine. Deci, aș spune că vom folosi acest lucru ca funcție noastră diferență de culoare.
Algoritmul cules de culoare
soluţie naiv
Unele răspunsuri au sugerat următorul algoritm
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
Acest algoritm are unele probleme:
Distanțarea culorilor nu este optimă. Dacă ne imaginăm culorile să fie ca numere pe o linie, trei numere ar fi distanțate optim ca aceasta:
| A ----- ----- b c |
Ambalare încă un număr de acolo fără a se deplasează a, b și c este în mod clar mai rău decât realinierea toate culorile.
Algoritmul nu este garantat pentru a termina . Ce se întâmplă dacă nu există nici o culoare , care este destul de departe forma culorile existente din listă? Bucla va continua pentru totdeauna
soluţie adecvată
Ei bine .. Nu am unul.
Nu este un răspuns la întrebarea dvs., dar, în cazul în care n are o valoare maximă și aplicația dvs. permite, puteți utiliza o listă predefinită de culori , cum ar fi aceasta:
http://en.wikipedia.org/wiki/List_of_colors
Un avantaj este că ai putea afișa un nume de culoare omenește poate fi citit într-un tooltip pentru persoanele cu daltonism.
Pentru început, nu utilizați spațiu RGB; este greu de a găsi un spațiu de culoare mai rău pentru această problemă. (În funcție de faptul dacă utilizați culorile pentru afișare sau pentru imprimare trebuie fie un număr foarte mare de culori pot fi distinse in apropiere de negru sau in apropiere de alb.)
Dacă utilizați spațiu Lab, există modele de culoare perceptuale (CIE 1996? Si CIE 2000) pentru măsurarea apropierii vizuale de culori (pentru imprimare și de afișare, respectiv).
Nu spui dacă ai de gând pentru a calcula culorile o dată și stoca rezultatul, sau în cazul în care au nevoie să fie recalculată pe zbor (și în acest caz, în cazul în care trebuie să fie deterministă sau nu). Evident, orice discuție despre modul în care cele mai bune pentru a genera setul ar depinde de asta.
Deși aș sugera că împărțirea în mod egal axele spațiul de culoare (spune în 8) și folosind cele ca puncte inițiale ar fi mult mai eficient decât orice proces aleator. Desigur, trebuie doar să compare orice punct pentru vecinii săi (și numai dacă acestea sunt deja în setul), pe care le va salva un număr foarte mare de comparații.
Da. Definirea distinct este un produs de la un spațiu de amânare de culoare, atunci când spunem culori distincte la maximum ceea ce vrem să spunem este culori, care sunt la fel de departe de toate celelalte culori posibil. Dar, din moment ce spațiul de culoare nu se schimba răspunsul nu se va schimba. Și punerea în aplicare a ceva care să se potrivească mai bine cu ochii umani și modul în care ochii uman vedea culoarea ca CIE-Lab distanță de culoare de2000 face redoing toate calculele greu, dar face ușor o listă statică. Iată 128 de intrări.
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"
};
Iată prima 256 ca o imagine.

(De la stânga la dreapta) (sus in jos). S-ar putea fi capabil de a obține câteva culori distincte, dacă ați asigurat că fiecare culoare a fost la fel echidistantă cât posibil, în spațiul de culoare. Asta tabel de căutare alege fiecare culoare suplimentară ca maxim distinct fata de toate culorile anterioare, mai degrabă decât desemnează N la început și apoi schițării de culoare pe care. Deci da, forță brută și un algoritm de culoare dsitance la nivel înalt și sunteți gata pentru a face același set de tine culori. Pe parcursul unei zile sau cam asa ceva.













