Hvordan å generere n forskjellige farger for ethvert naturlig tall n?

stemmer
35

Si n = 100; Hvordan genererer jeg 100 visuelt forskjellige farger? Er dette matematisk mulig?

Publisert på 24/02/2010 klokken 18:09
kilden bruker
På andre språk...                            


6 svar

stemmer
4

Du ønsker å konvertere til HSL og iterere gjennom verdiene i hue (H) mens de andre 2 verdier konstant.

For hver verdi du konvertere fra HSL tilbake til RGB .

Se svarene mine her og her .

Hvis N er svært store og derfor fargene er ikke visuelt tydelig du kan på det tidspunktet re-iterere over alle de samme fargetoner og endre de andre komponentene å variere metning eller lysstyrke. Så i utgangspunktet du kan ha en maks antall hue verdier å bruke, og når det er truffet du kan starte på nytt med en annen metning eller lysstyrke.

Svarte 24/02/2010 kl. 18:11
kilden bruker

stemmer
4

100 er mye farger, men du kan være i stand til å gjøre det ved å fordele dem så tynt som mulig i HSB eller HSL plass; gjør det i RGB er nok vanskelig.

For eksempel kan du velge å bruke 10 forskjellige farger, 4 forskjellige metningsnivåer, og 3 forskjellige innstillinger for lysstyrke, som vil gi deg opp til 120 farger. Du må plukke metning og lysstyrkeverdier nøye; menneskelige øyne er kompliserte og forvirrende sensorer. Hvis du behandler fargerommet som en kjegle, vil du sannsynligvis ha en annen rekke fargetoner i hver lyshet / metningsnivået.

Her er en link til wikipedia oppføring på HSB .

Svarte 24/02/2010 kl. 18:11
kilden bruker

stemmer
34

Redigere:

Jeg har ikke noen kompetanse på dette området og mine matematiske ferdigheter er ganske gjennomsnittlig. Men jeg har den oppfatning at løsningen på dette problemet er mer kompleks og interessant enn mange svar her foreslår, siden jeg prøvde å gjøre noe lignende nylig, og fant ikke en løsning.

farge~~POS=TRUNC

Oppfatningen av farge er selvfølgelig subjektivt, men det er betydelig enighet mellom mennesker. For eksempel kan vi alle enige om at rødt, grønt og blått er svært forskjellige farger, og selv fargeblinde mennesker er enige om at svart og hvitt er svært forskjellige.

RGB

Den vanligste representasjon av farge i datasystemer er vektoren (r, g, b) som foreslår en enkel avstand funksjon som

RGB fargeforskjell

Lar angir området for r , g og b til [0, 1] og se hvordan dette:

  1. Red (1, 0, 0) og rød (1, 0, 0) har en avstand på 0 , noe som burde være opplagt
  2. Rød (1, 0, 0) og gul (1, 1, 0) har en avstand på 1 , som er mindre enn avstanden
  3. Rød (1, 0, 0) og blå (0, 0, 1) som er sqrt (2) , som er plausibelt

Så langt så bra. Problemet er imidlertid at blått og rødt har samme avstand 1 fra svart (0, 0, 0) , men når du ser på bildet dette ser ikke ut til å holde til stede:

blått og rødt på svart

Også gul (1, 1, 0) og magenta (1, 0, 1) begge har den samme avstand 1 fra hvite (1, 1, 1) , som ikke synes å være fornuftig enten:

gul og magenta på hvitt

HSL og HSV

Jeg tror det er trygt å anta at analoge beregninger for HSL og HSV fargevalg har de samme problemene. Disse fargevalg er ikke designet for å sammenligne fargen.

CIEDE2000

Heldigvis er det forskere allerede prøver å finne en god måte å sammenligne farger. De kom opp med noen forseggjort metoder, senest ett vesen CIEDE2000

CIEDE2000

(den fullstendige formelen som er beskrevet i artikkelen er stor )

Denne beregningen tar menneskelig persepsjon i betraktning, som det faktum at vi ser ut til å være ute av stand til å skjelne nyanser av blått veldig godt. Så jeg vil si at vi bruker dette som vårt fargeforskjell funksjon.

The Color Plukke algoritme

naive løsning

Noen svar foreslo følgende 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

Denne algoritmen har noen problemer:

  1. Avstanden mellom fargene er ikke optimal. Hvis vi tenker oss at fargene skal være som tall på en linje, ville tre tall optimalt fordelt slik:

    | A ----- b ----- c |

    Pakking ytterligere ett nummer i det uten å flytte a, b, og c er klart dårligere enn omstilling alle fargene.

  2. Algoritmen er ikke garantert å avslutte . Hva om det ikke er noen farge som er langt nok danne de eksisterende fargene i listen? Sløyfen vil fortsette for alltid

riktig løsning

Vel .. Jeg har ikke en.

Svarte 24/02/2010 kl. 18:17
kilden bruker

stemmer
2

Ikke et svar på spørsmålet ditt, men hvis n har en maksimal verdi og søknaden din tillater det, kan du bruke en forhåndsdefinert liste over farger som dette:

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

En fordel er at du kan vise et menneskelig lesbart fargenavn i et verktøytips for folk med fargeblindhet.

Svarte 24/02/2010 kl. 18:31
kilden bruker

stemmer
1

For det første må du ikke bruke RGB plass; det er vanskelig å finne en verre fargerom for dette problemet. (Avhengig av om du bruker farger for visning eller for utskrifts du enten har et stort antall utvisket farger nærheten svart eller i nærheten av hvitt.)

Hvis du bruker Lab plass, er det perseptuelle fargemodeller (CIE 1996? Og CIE 2000) for å måle visuell nærhet av farger (for print og skjerm henholdsvis).

Du trenger ikke si om du kommer til å beregne farger en gang og lagre resultatet, eller om de trenger å bli omregnet på fly (og i så fall om det har å være deterministisk eller ikke). Tydeligvis noen diskusjon om hvordan best å generere settet vil avhenge av det.

Selv om jeg vil foreslå at jevnt å dele aksene for fargerommet (si til 8), og ved hjelp av de som utgangspunkter ville være mye mer effektiv enn en hvilken som helst tilfeldig prosess. Gjerne trenger du bare å sammenligne et punkt til sine naboer (og bare hvis de allerede er i settet), noe som vil spare deg for et stort antall sammenligninger.

Svarte 24/02/2010 kl. 19:19
kilden bruker

stemmer
36

Yeah. Definere tydelig er et produkt av utsette til et fargerom så når vi sier maksimalt forskjellige farger hva vi mener å si er farger som er så langt fra alle de andre fargene som mulig. Men siden fargerommet endrer ikke svaret ikke kommer til å endre seg. Og implementere noe som passer bedre med menneskelige øyne og hvordan menneskelige øyne se farger som CIE-lab de2000 farge avstanden gjør gjøre om alle beregningene hardt, men gjør en statisk liste lett. Her er 128 oppføringer.

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

Her er den første 256 som et bilde.

max avstand

(Fra venstre til høyre) (topp-til-bunn). Du kan være i stand til å få noen flere forskjellige farger hvis du sørget for hver farge var så like langt som mulig innenfor fargerom. Det oppslagstabell plukker hver ekstra farge som maksimalt forskjellig fra alle tidligere farger i stedet for å utpeke N i starten og deretter kartlegge fargerom. Så ja, brute force og et høyt nivå farge dsitance algoritme og du er klar til å gjøre det samme sett med farger selv. I løpet av en dag eller så.

Svarte 30/11/2013 kl. 08:18
kilden bruker

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