Răspundeți: culori „Sortarea“ de caracter distinctiv

voturi
18

Întrebarea originală

Dacă vi se administrează N Maximum culori la distanță (și unele metrice distanță asociate), poate veni cu un mod de a sorta aceste culori într-o anumită ordine, astfel încât prima M sunt, de asemenea, în mod rezonabil aproape de a fi un set maximal distinct?

Cu alte cuvinte, având în vedere o grămadă de culori distincte, veni cu o ordonare, așa că am putea folosi cât mai multe culori ca am nevoie incepand de la început și să fie asigurată în mod rezonabil că acestea sunt distincte și că culorile din apropiere sunt, de asemenea, foarte distincte (de exemplu, roșu albăstrui nu se află lângă roșiatic albastru).

Randomizing este OK, dar cu siguranță nu optimă.

Clarificare: Având în vedere unele set mare și vizual distincte de culori (spun 256, sau 1024), vreau să le sortați astfel încât atunci când folosesc în primul rând, să zicem, 16 dintre ei că am obține un subset relativ distinctă vizual de culori. Acest lucru este echivalent, aproximativ, cu a spune că doresc să sortați această listă de 1024, astfel încât culorile individuale sunt mai apropiate de vedere vizual, cu atât mai departe în afară ei sunt pe listă.

Întrebat 04/08/2008 la 16:14
sursa de către utilizator
În alte limbi...                            


9 răspunsuri

voturi
2

N culori maximal la distanță poate fi considerat un set de puncte bine distribuite, într - o (culoare) spațiu 3-dimensional. Dacă aveți posibilitatea să le generați dintr - o secvență de Halton , atunci orice prefix (primele culori M) , de asemenea , este format din puncte bine distribuite.

Publicat 25/08/2008 la 09:44
sursa de către utilizator

voturi
2

Se pare că percepția este important pentru tine, în acest caz, ați putea dori să ia în considerare de lucru cu un spațiu de culoare perceptive, cum ar fi YUV, YCbCr sau Lab. De fiecare data l-am folosit pe cei, mi-au dat rezultate mult mai bune decât singur sRGB.

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

Publicat 12/08/2008 la 13:33
sursa de către utilizator

voturi
2

Această problemă se numește cuantizare de culoare, și are mulți algoritmi bine cunoscute: http://en.wikipedia.org/wiki/Color_quantization Cunosc oameni care au implementat abordarea octree pentru un efect bun.

Publicat 12/08/2008 la 13:11
sursa de către utilizator

voturi
2

Acest lucru pare , de asemenea , pentru mine ca un fel de grafic de rezistență în cazul în care încercați să cartografierea calea rezistenței. Dacă inversa cerințele, calea de rezistență maximă, aceasta ar putea fi , probabil , folosite pentru a produce un set care de la început produce o diferență maximă ca te duci, iar spre sfârșitul începe să se întoarcă la valori mai aproape de ceilalți.

De exemplu, aici este o modalitate de a face, probabil, ceea ce vrei.

  1. Calculați distanța (ref alte state post - ul ) de la fiecare culoare la toate celelalte culori
  2. Însumați distanțele pentru fiecare culoare, acest lucru vă oferă o indicație pentru cât de departe această culoare este de la toate celelalte culori în total
  3. Comanda lista de la distanță, merge în jos

Acest lucru ar, se pare, produce o listă care începe cu culoarea care este cel mai îndepărtat departe de toate celelalte culori, și apoi du-te în jos, culori spre sfârșitul listei ar fi mai aproape de alte culori, în general.

Editare: Citirea răspunsul la primul meu post, despre subdiviziunea spațială, nu s-ar potrivi exact descrierea de mai sus, deoarece culorile aproape de alte culori ar scădea la partea de jos a listei, dar să presupunem că aveți un grup de culori, undeva, la cel puțin una dintre culorile din acel grup ar fi situat în apropiere de începutul listei, și ar fi cel care, în general, a fost cel mai îndepărtat departe de toate celelalte culori în total. În cazul în care are sens.

Publicat 04/08/2008 la 16:38
sursa de către utilizator

voturi
1

Ai putea sorta doar culorile candidate, bazate pe maxim-distantat de minim distanța până la oricare dintre culorile index.

Folosind distanta de culoare euclidiană:

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 o puteți înlocui cu tot ce vrei. Este nevoie de doar o rutina distanta 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;
            }
        }
    }
}
Publicat 03/09/2012 la 21:50
sursa de către utilizator

voturi
1
  1. Începeți cu două liste. CandidateColors, care conține inițial culorile distincte și SortedColors, care este inițial gol.
  2. Alege orice culoare și scoateți-l din CandidateColors și a pus-o în SortedColors. Aceasta este prima culoare și va fi cea mai comună, deci este un loc bun pentru a alege o culoare care jives bine cu aplicația.
  3. Pentru fiecare culoare în CandidateColors calcula distanța totală. Distanța totală este suma distanței de la CandidateColor la fiecare dintre culorile din SortedColors.
  4. Scoateți culoarea cu cea mai mare distanță totală de la CandidateColors și adăugați-l la sfârșitul SortedColors.
  5. Dacă CandidateColors nu este gol, du-te înapoi la pasul 3.

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

Publicat 21/11/2008 la 10:29
sursa de către utilizator

voturi
1

Dacă am înțelege întrebarea în mod corect, doriți să obțineți subsetul de M culori cu cea mai mare distanta medie dintre culori, având în vedere o anumită funcție distanță d .

Pune - un alt mod, având în vedere setul inițial de N culori ca un mare grafic, neorientat în care sunt conectate toate culorile, pe care doriți să găsiți cel mai lung calea pe care vizitează orice M noduri.

Rezolvarea problemelor NP-complete, graficul este dincolo de mine mi-e teamă, dar ai putea încercați să rulați o simulare fizică simplu:

  1. Genera M puncte aleatorii în spațiu de culoare
  2. Se calculează distanța dintre fiecare punct
  3. Se calculează vectorii de repulsie pentru fiecare punct care se va muta departe de toate celelalte puncte (folosind 1 / ( distanța ^ 2) ca mărimea vectorului)
  4. Rezumarea vectorii de repulsie pentru fiecare punct
  5. Actualizați poziția fiecărui punct în funcție de vectorii de repulsie însumate
  6. Limitați oricare din coordonatele legat (cum ar fi luminozitatea merge negativ sau unul deasupra)
  7. Se repetă de la pasul 2 până la punctele de stabilizare
  8. Pentru fiecare punct, selectați cea mai apropiată culoare din setul original de N

Este departe de a fi eficient, dar pentru mici M poate fi destul de eficient, si va da aproape de rezultate optime.

În cazul în care funcția distanța de culoare este simplu, poate exista un mod mai determinist de generare subsetul optim.

Publicat 16/10/2008 la 18:11
sursa de către utilizator

voturi
0

Le puteți divizat în format RGB HEX, astfel încât să puteți compara R cu R de o culoare diferită, 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

Deci, singurul lucru pe care ar trebui să decidă este cât de aproape doriți culorile și ceea ce este o diferenta acceptabila pentru segmentele care urmează să fie luate în considerare diferite.

Publicat 04/08/2008 la 16:31
sursa de către utilizator

voturi
0

Vrei să spui că dintr - un set de N culori, aveți nevoie pentru a alege culorile M, unde M <N, astfel încât M este cea mai bună reprezentare a culorilor N în spațiul M?

Ca un exemplu mai bun, reduce un adevărat culoare (spațiu de culoare de 24 de biți) la un 8 biți mapate spațiu de culoare (GIF?).

Există algoritmi de cuantificare pentru acest lucru, cum ar fi Subdiviziune spațială Adaptive Algoritmul folosit de ImageMagic.

Acești algoritmi de obicei, nu aleg doar culorile existente din spațiul sursă, dar creează noi culori în spațiul țintă care se aseamănă cel mai bine culorile sursă. Ca un exemplu simplificat, dacă aveți 3 culori în imaginea originală în cazul în care două sunt roșii (cu intensitate diferită sau nuanțe albăstrui, etc.), iar al treilea este albastru, și necesitatea de a reduce la două culori, imaginea țintă ar putea avea o culoare roșie care este un fel de medie a originalului două roșii + culoarea albastră din imaginea originală.

Dacă aveți nevoie de ceva, atunci nu am înțeles întrebarea dvs. :)

Publicat 04/08/2008 la 16:29
sursa de către utilizator

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