Zeggen n = 100; Hoe genereer ik 100 visueel verschillende kleuren? Is dit mathematisch mogelijk?
Hoe kan n verschillende kleuren voor elk natuurlijk getal n te genereren?
U converteren naar HSL en doorloopt de waarden van de tint (H) terwijl de andere 2 waarden constant.
Voor elke waarde die u converteren van HSL terug naar RGB .
Zie mijn antwoorden hier en hier .
Als uw N erg groot is en dus de kleuren zijn niet visueel te onderscheiden kon je op dat punt opnieuw itereren over alle van dezelfde tinten en verander de andere componenten om de verzadiging of helderheid variëren. Dus eigenlijk zou je een maximum aantal hue waarden te gebruiken, en zodra dat wordt geraakt kun je opnieuw beginnen met een andere verzadiging of helderheid.
100 is een veel kleuren, maar je zou in staat zijn om dit te doen door het verspreiden ze zo dun mogelijk in het HSB of HSL ruimte; doet het in RGB is het waarschijnlijk moeilijk.
Bijvoorbeeld, kunt u ervoor kiezen om 10 verschillende tinten, 4 verschillende verzadiging niveaus, en 3 verschillende helderheid instellingen te gebruiken, zou dat geeft je tot 120 kleuren. Je moet de verzadiging en helderheid van de waarden zorgvuldig te halen; menselijke ogen zijn ingewikkeld en verwarrend sensoren. Als u de kleurruimte te behandelen als een kegel, zult u waarschijnlijk een verschillend aantal tinten bij elke helderheid / verzadiging niveau willen.
Hier is een link naar de wikipedia inschrijving op HSB .
Bewerk:
Ik heb geen ervaring op dit gebied en mijn wiskunde vaardigheden zijn vrij gemiddeld. Maar ik heb de mening dat de oplossing voor dit probleem is complexer en interessanter dan vele antwoorden hier suggereren, omdat ik probeerde onlangs iets soortgelijks te doen en niet een oplossing te vinden.
Kleurverschil
De perceptie van kleur is natuurlijk subjectief, maar er is belangrijke overeenkomst tussen de mens. Zo kunnen we allemaal over eens dat rood, groen en blauw zijn zeer verschillende kleuren en zelfs kleurenblind mensen het erover eens dat zwart en wit zijn zeer verschillend.
RGB
De meest voorkomende weergave van kleur computersystemen de vector (r, g, b) die een eenvoudige afstandsfunctie dergelijke suggereert

Laat bereik instellen van r , g en b tot [0, 1] en hoe deze werkt:
- Rood (1, 0, 0) en rood (1, 0, 0) heeft de afstand van 0 , wat duidelijk zou moeten zijn
- Rood (1, 0, 0) en geel (1, 1, 0) is de afstand 1 , die kleiner is dan de afstand
- Rood (1, 0, 0) en blauw (0, 0, 1) hetgeen sqrt (2) , die aannemelijk
So far, so good. Het probleem is echter dat blauw en rood hebben dezelfde afstand 1 van zwart (0, 0, 0) , maar als we kijken naar het beeld lijkt dit niet waar te houden:

Ook geel (1, 1, 0) en magenta (1, 0, 1) hebben beide dezelfde afstand 1 van wit (1, 1, 1) , die lijkt niet zinvol ofwel:

HSL en HSV
Ik denk dat het veilig is om te veronderstellen dat analoge statistieken voor de HSL en HSV kleurenschema's hebben dezelfde problemen. Deze kleuren zijn niet ontworpen voor het vergelijken van kleur.
CIEDE2000
Gelukkig zijn er wetenschappers al op zoek naar een goede manier om kleuren te vergelijken vinden. Ze kwam met een aantal ingewikkelde methodes, waarbij het laatst binnengekomen CIEDE2000

(volledige formule beschreven in het artikel is enorm )
Deze waarde neemt de menselijke waarneming in aanmerking, zoals het feit dat we niet in staat lijken om de kleuren blauw onderscheiden zeer goed te zijn. Dus ik zou zeggen dat we dit gebruiken als onze kleurverschil functie.
The Color Picking algoritme
Naive oplossing
Sommige antwoorden stelde de volgende algoritme
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
Dit algoritme heeft een aantal problemen:
De afstand van de kleuren niet optimaal. Als we de kleuren voorstellen te zijn als nummers op een lijn staan zal drie nummers optimaal worden verdeeld als volgt:
| A ----- b ----- c |
Verpakking een extra getal daar zonder te bewegen a, b en c is duidelijk slechter dan heroriëntering alle kleuren.
Het algoritme is niet gegarandeerd te beëindigen . Wat als er geen kleur die is ver genoeg vormen de bestaande kleuren in de lijst? De loop zal voor altijd doorgaan
De juiste oplossing
Nou .. Ik heb er geen.
Niet een antwoord op uw vraag, maar als n heeft een maximale waarde en uw toepassing toelaat, kun je een vooraf gedefinieerde lijst van kleuren zoals dit gebruiken:
http://en.wikipedia.org/wiki/List_of_colors
Een voordeel is dat je een menselijk leesbare kleur naam in een tooltip voor mensen met kleurenblindheid kon laten zien.
Om te beginnen, geen gebruik maken van RGB ruimte; het is moeilijk om een slechtere kleurruimte voor dit probleem te vinden. (Afhankelijk van het feit of u de kleuren voor weergave of voor print u ofwel hebben enorme aantallen niet te onderscheiden kleuren in de buurt zwart of in de buurt van wit.)
Als je Lab ruimte te gebruiken, er zijn perceptuele kleurmodellen (CIE 1996? En CIE 2000) voor het meten van de visuele nabijheid van kleuren (voor print en weergave respectievelijk).
Je zegt niet als je gaat om de kleuren eenmaal berekenen en het resultaat, of als ze moeten worden herberekend on the fly (en in dat geval als het deterministische of niet te zijn). Het is duidelijk dat elke discussie over de beste manier om de set te genereren afhankelijk zou zijn van dat.
Hoewel ik stel dat gelijkmatig de assen van de kleurruimte delen (zeg tot 8) en het gebruik van deze als initiële punten zou veel efficiënter dan elk willekeurig proces. Zeker, je hoeft alleen maar naar een willekeurig punt te vergelijken met de buren (en alleen als ze al in de set), dat bespaart u een groot aantal vergelijkingen.
Ja. Het definiëren van duidelijke is een product van het uitstellen van een kleurruimte dan wanneer we zeggen maximaal verschillende kleuren wat we bedoelen te zeggen is kleuren die zo ver van alle andere kleuren mogelijk zijn. Maar omdat de kleurruimte het antwoord niet veranderen niet gaat veranderen. En implementeren van iets dat beter past bij het menselijk oog en hoe het menselijk oog te zien kleur zoals CIE-lab DE2000 kleurenafstand maakt overdoen alle berekeningen hard, maar maakt een statische lijst eenvoudig. Hier is 128 inzendingen.
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 is de eerste 256 als een afbeelding.

(Van links naar rechts) (boven naar beneden). Je zou in staat zijn om een paar verschillende kleuren als je zorgen dat elke kleur was zo op gelijke afstand mogelijk binnen de kleurruimte gemaakt. Dat opzoektabel pakt elke extra kleur maximaal tegenstelling tot alle voorgaande kleuren in plaats aanwijzing van N aan het begin en vervolgens in kaart brengen van de kleurruimte. Dus ja, brute kracht en een hoog niveau kleur dsitance algoritme en je bent klaar om dit dezelfde reeks zelf kleuren maken. In de loop van een dag of zo.













