Cum de a genera culori n diferite pentru orice număr natural n?

voturi
35

Say n = 100; Cum pot genera 100 de culori distincte vizual? Este posibil matematic?

Întrebat 24/02/2010 la 19:09
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
4

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.

Publicat 24/02/2010 la 19:11
sursa de către utilizator

voturi
4

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 .

Publicat 24/02/2010 la 19:11
sursa de către utilizator

voturi
33

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

diferența de culoare RGB

Permite seta domeniul pentru r , g și b până la [0, 1] și a vedea cum funcționează:

  1. Red (1, 0, 0) și roșu (1, 0, 0) are distanța de 0 , care ar trebui să fie evident
  2. Red (1, 0, 0) și galben (1, 1, 0) are distanța de 1 , care este mai mică decât distanța de
  3. 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:

albastru și roșu pe negru

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:

galben și magenta pe alb

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

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:

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

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

Publicat 24/02/2010 la 19:17
sursa de către utilizator

voturi
2

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.

Publicat 24/02/2010 la 19:31
sursa de către utilizator

voturi
1

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.

Publicat 24/02/2010 la 20:19
sursa de către utilizator

voturi
34

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.

distanta maxima

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

Publicat 30/11/2013 la 09:18
sursa de către utilizator

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