Vă mulțumim pentru susținere

Urmărire: "Sortarea" culorilor după caracterul distinctiv

Întrebare inițială

Dacă vi se dau culori maxime la distanță N (și o anumită măsură de distanță asociată), puteți găsi o modalitate de a sorta aceste culori într-o anumită ordine astfel încât primele M să fie, de asemenea, relativ apropiate de a fi un set maxim distinct?

Cu alte cuvinte, dat o grămadă de culori distincte, veniți cu o comandă pentru a putea folosi cât mai multe culori de care am nevoie începând de la început și să fiu sigur că ele sunt distincte și că culorile din apropiere sunt de asemenea foarte distincte (de exemplu, albastru roșu nu este lângă albastru roșiatic).

Randomizarea este în regulă, dar cu siguranță nu este optimă.

Clarificare: Având în vedere un set mare de culori (adică 256 sau 1024), vreau să le sortez astfel încât atunci când folosesc primul, să zicem, 16 dintre ele, am un subset de culori distinct vizibil . Acest lucru este echivalent, aproximativ, spunând că vreau să sortez această listă de 1024, astfel încât culorile individuale mai apropiate să fie vizual, cu cât sunt mai departe pe listă.

0
adăugat editat

9 răspunsuri

Puteți să le împărțiți în format RGB HEX astfel încât să puteți compara R cu R de altă culoare, aceeași cu G și B.

Același format ca HTML

XX XX XX
RR GG BB

00 00 00 = black
ff ff ff = white
ff 00 00 = red
00 ff 00 = green
00 00 ff = blue

Singurul lucru pe care trebuie să-l decideți este cât de aproape doriți culorile și ce diferență este acceptabilă pentru ca segmentele să fie considerate diferite.

0
adăugat

Se pare că percepția este importantă pentru dvs., în acest caz vă recomandăm să luați în considerare lucrul cu un spațiu de culoare perceptual, cum ar fi YUV, YCbCr sau Lab. De fiecare dată când le-am folosit, mi-au dat rezultate mult mai bune decât sRGB singur.

Conversia la și de la sRGB poate fi o durere, dar în cazul tău ar putea de fapt să facă algoritmul mai simplu și ca un bonus va lucra mai ales pentru jaluzele color prea!

0
adăugat

Do you mean that from a set of N colors, you need to pick M colors, where M < N, such that M is the best representation of the N colors in the M space?

Ca exemplu mai bun, reduceți culoarea reală (spațiu de culoare de 24 de biți) într-un spațiu de culoare mapat pe 8 biți (GIF?).

Există algoritmi de cuantificare pentru acest lucru, precum algoritmul Adaptive Spatial Spatial folosit de ImageMagic.

De obicei, acești algoritmi nu selectează doar culorile existente din spațiul sursă, ci creează noi culori în spațiul țintă care seamănă cel mai mult cu culorile sursă. Ca exemplu simplificat, dacă aveți 3 culori în imaginea originală unde două sunt roșii (cu intensitate diferită sau nuanțe albastre etc.), iar a treia este albastră și trebuie redusă la două culori, imaginea țintă ar putea avea o culoare roșie care este un fel de medie a originale două roșu + culoarea albastru de la imaginea originală.

Dacă ai nevoie de altceva, atunci nu ți-am înțeles întrebarea :)

0
adăugat

Acest lucru mi se pare, de asemenea, ca un fel de grafic de rezistență în care încerci să trasezi calea cea mai mică rezistență. Dacă inversați cerințele, calea rezistenței maxime, ar putea fi folosită pentru a produce un set care, de la început, produce diferența maximă pe măsură ce mergeți și spre sfârșit începe să revină la valori mai apropiate de celelalte.

De exemplu, iată o modalitate de a face ceea ce vreți.

  1. Calculate the distance (ref your other post) from each color to all other colors
  2. Sum the distances for each color, this gives you an indication for how far away this color is from all other colors in total
  3. Order the list by distance, going down

Aceasta pare să producă o listă care începe cu culoarea cea mai îndepărtată de toate celelalte culori și apoi să coboare, culorile spre sfârșitul listei ar fi mai aproape de alte culori în general.

Editare: Citirea răspunsului dvs. la prima mea postare despre subdiviziunea spațială nu ar corespunde descrierii de mai sus, deoarece culorile apropiate de alte culori ar cădea în partea de jos a listei, dar să spunem că aveți un grup de culori undeva, la cel puțin una dintre culorile din grupa respectivă ar fi situată aproape de începutul listei și ar fi cel care, în general, era cel mai îndepărtat de toate celelalte culori în total. Dacă acest lucru are sens.

0
adăugat

Puteți să sortați culorile candidat în funcție de distanța maximă a distanței minime la oricare dintre culorile indexului.

Utilizarea distanței de culoare Euclideană:

public double colordistance(Color color0, Color color1) {
    int c0 = color0.getRGB();
    int c1 = color1.getRGB();
    return distance(((c0>>16)&0xFF), ((c0>>8)&0xFF), (c0&0xFF), ((c1>>16)&0xFF), ((c1>>8)&0xFF), (c1&0xFF));
}

public double distance(int r1, int g1, int b1, int r2, int g2, int b2) {
    int dr = (r1 - r2);
    int dg = (g1 - g2);
    int db = (b1 - b2);
    return Math.sqrt(dr * dr + dg * dg + db * db);
}

Deși îl puteți înlocui cu orice doriți. Este nevoie doar de o rutină de distanță de culoare.

public void colordistancesort(Color[] candidateColors, Color[] indexColors) {
    double current;

    double distance[] = new double[candidateColors.length];
    for (int j = 0; j < candidateColors.length; j++) {
        distance[j] = -1;
        for (int k = 0; k < indexColors.length; k++) {
            current = colordistance(indexColors[k], candidateColors[j]);
            if ((distance[j] == -1) || (current < distance[j])) {
                distance[j] = current;
            }
        }
    }

    //just sorts.
    for (int j = 0; j < candidateColors.length; j++) {
        for (int k = j + 1; k < candidateColors.length; k++) {
            if (distance[j] > distance[k]) {
                double d = distance[k];
                distance[k] = distance[j];
                distance[j] = d;

                Color m = candidateColors[k];
                candidateColors[k] = candidateColors[j];
                candidateColors[j] = m;
            }
        }
    }
}
0
adăugat
Deși, într-adevăr, acest lucru ar putea să aleagă două culori foarte asemănătoare cu cele ale candidaților. S-ar putea să doriți doar să găsiți cel mai bun candidatColor, să îl adăugați la culorile indexului și să începeți din nou.
adăugat autor Tatarize

Dacă înțeleg corect întrebarea, doriți să obțineți submulțimea culorilor M cu cea mai mare distanță medie între culori, dat fiind o anumită distanță d .

Altfel, luând în considerare setul inițial de culori N ca un grafic mare, nedirecționat, în care sunt conectate toate culorile, doriți să găsiți cea mai lungă cale care vizitează orice > M .

Rezolvarea problemelor grafice NP-complete este mult dincolo de mine, mi-e teamă, dar ați putea încerca să executați o simulare fizică simplă:

  1. Generate M random points in colour space
  2. Calculate the distance between each point
  3. Calculate repulsion vectors for each point that will move it away from all other points (using 1 / (distance ^ 2) as the magnitude of the vector)
  4. Sum the repulsion vectors for each point
  5. Update the position of each point according to the summed repulsion vectors
  6. Constrain any out of bound coordinates (such as luminosity going negative or above one)
  7. Repeat from step 2 until the points stabilise
  8. For each point, select the nearest colour from the original set of N

Este departe de a fi eficient, dar pentru un mic M acesta poate fi suficient de eficient și va da rezultate apropiate.

Dacă funcția de distanță a culorilor este simplă, poate exista un mod mai determinist de generare a subsetului optim.

0
adăugat
Nu este NP-completă. Este vorba de sortarea O (NLog (N)) cu maximul distanței minime față de orice indice O (N) sau cu media O (N). Este evident O (N + NLog (N)) sau O (NLog (N)). Cel mai rău caz trebuie să adăugați culorile sortate la culorile indexului, făcându-l N²Log (N). Găsiți cele mai bune, adăugați-o la lista de culori index. Începeți.
adăugat autor Tatarize

Această problemă se numește cuantificare a culorii și are numeroși algoritmi bine cunoscuți: http://en.wikipedia.org/ wiki / Color_quantization Îl cunosc pe cei care au implementat abordarea octrică pentru un efect bun.

0
adăugat

N culorile îndepărtate maxim pot fi considerate un set de puncte bine distribuite într-un spațiu tridimensional (color). Dacă le puteți genera dintr-o secvență secvență Halton , atunci orice prefix (primele M culori) de asemenea este format din puncte bine distribuite.

0
adăugat
  1. Începeți cu două liste. CandidateColors, care conține inițial culorile dvs. distincte și SortedColors, care este inițial gol.
  2. Alegeți orice culoare și eliminați-o din CandidateColors și puneți-o în SortedColors. Aceasta este prima culoare și va fi cea mai obișnuită, deci este un loc bun pentru a alege o culoare care să se potrivească bine cu aplicația dvs.
  3. Pentru fiecare culoare din CandidateColors se calculează distanța totală. Distanța totală este suma distanței de la culoarea CandidateColor la fiecare dintre culorile din SortedColors.
  4. Eliminați culoarea cu cea mai mare distanță totală de la CandidateColors și adăugați-o la sfârșitul SortedColors.
  5. Dacă CandidateColors nu este goală, reveniți la pasul 3.

Acest algoritm greoi ar trebui să vă dea rezultate bune.

0
adăugat