Kontynuacja: „Sortowanie” kolory według odrębności

głosy
18

Oryginalny Pytanie

Jeśli podano N- maksymalnie odległe kolory (i niektóre związane odległość metryczny), można wymyślić sposób, aby uporządkować te kolory do jakiegoś celu, tak że pierwsza M są również dość blisko do bycia maksymalnie odrębny zestaw?

Innymi słowy, ponieważ grono różnych kolorach, wymyślić zamawiania więc mogę używać jak najwięcej kolorów jak trzeba zaczynając od początku i być racjonalnie pewność, że wszystkie one są różne i że w pobliżu kolory są również bardzo wyraźny (np niebieskawy czerwony nie jest obok czerwonawy kolor niebieski).

Losowanie jest OK, ale na pewno nie jest optymalna.

Wyjaśnienie: Biorąc pod uwagę niektóre duże i wizualnie odrębny zestaw kolorów (powiedzmy 256 lub 1024), chcę, aby posortować je tak, że gdy używam pierwsze, powiedzmy, 16 z nich, że mogę dostać stosunkowo wizualnie odrębny podzbiór kolorów. Jest to równoznaczne z grubsza mówiąc, chcę, aby posortować tę listę 1024 tak, że im bliżej poszczególne kolory są wizualnie, im dalej od siebie są na liście.

Utwórz 04/08/2008 o 16:14
źródło użytkownik
W innych językach...                            


9 odpowiedzi

głosy
2

N maksymalnie odległe kolory mogą być traktowane jako zestaw dobrze rozłożonych punktów w 3-wymiarowej przestrzeni (kolor). Jeśli można wygenerować je z sekwencji Halton , następnie każdy prefiks (pierwsze kolory M) składa się także z dobrze rozmieszczonych punktów.

Odpowiedział 25/08/2008 o 09:44
źródło użytkownik

głosy
2

Wydaje się percepcja jest dla Ciebie ważne w tym przypadku warto rozważyć współpracę z percepcyjnego przestrzeni barw, takich jak YUV, YCbCr lub Lab. Everytime Użyłem tych, one dały mi dużo lepsze rezultaty niż sRGB sam.

Konwersja do iz sRGB może być uciążliwe, ale w twoim przypadku może to rzeczywiście zrobić algorytm prostsze i jako bonus będzie pracować dla większości kolorów żaluzji też!

Odpowiedział 12/08/2008 o 13:33
źródło użytkownik

głosy
2

Ten problem nazywa się kolor kwantyzacji, i ma wiele dobrze znanych algorytmów: http://en.wikipedia.org/wiki/Color_quantization Znam ludzi, którzy wdrożone podejście Octree z dobrym skutkiem.

Odpowiedział 12/08/2008 o 13:11
źródło użytkownik

głosy
2

To brzmi dla mnie jak również pewnego rodzaju wykres oporu w której próbował nakreślić ścieżkę najmniejszego oporu. Jeśli odwrócić wymagania, ścieżka maksymalnej odporności, może to może być wykorzystywane do produkcji zestaw, który od samego początku produkuje maksymalną różnicę as you go, a pod koniec zaczyna wracać do wartości bliżej innych.

Na przykład, oto jeden sposób może robić, co chcesz.

  1. Oblicz odległość (ref swoim drugim poście ) z każdego koloru do wszystkich innych kolorach
  2. Podsumowując odległości dla każdego koloru, to daje wskazanie do jak daleko ten kolor jest od wszystkich innych kolorów w sumie
  3. Zamów listę według odległości, schodząc

To, zdaje się, że produkują listę rozpoczyna się od koloru, który jest najdalej od wszystkich innych kolorów, a następnie przejdź w dół, kolory w kierunku końca listy byłoby bliżej do innych kolorów w ogóle.

Edit: Czytanie odpowiedź na mój pierwszy post, o podziału przestrzennego, to nie do końca pasuje do powyższego opisu, ponieważ kolory blisko innych kolorach spadnie do dołu listy, ale powiedzmy, że masz klaster kolorów gdzieś na najmniej jeden z kolorów z tego klastra będzie usytuowany w pobliżu początku listy, a byłoby to ten, który zazwyczaj był najdalej od wszystkich innych kolorów w sumie. Jeśli to ma sens.

Odpowiedział 04/08/2008 o 16:38
źródło użytkownik

głosy
1

można po prostu uporządkować kolory kandydatów na maksymalną-zdystansowany minimalnej dystansach do każdego z kolorów indeksu.

Korzystanie odległość euklidesową kolorów:

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

Choć można zastąpić go z czymkolwiek chcesz. To po prostu potrzebuje rutyny odległość kolor.

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;
            }
        }
    }
}
Odpowiedział 03/09/2012 o 21:50
źródło użytkownik

głosy
1
  1. Start z dwóch list. CandidateColors, która początkowo zawiera swoje różne kolory i SortedColors, która jest początkowo pusta.
  2. Wybrać dowolny kolor i usunąć go z CandidateColors i umieścić go w SortedColors. Jest to pierwszy kolor i będzie najczęściej, więc jest to dobre miejsce, aby wybrać kolor, który jives dobrze z aplikacją.
  3. Dla każdego koloru w CandidateColors obliczyć jego całkowitą odległość. Całkowita odległość jest sumą odległości od CandidateColor do każdego z kolorów w SortedColors.
  4. Usunąć kolor z największą łączną odległość od CandidateColors i dodać go do końca SortedColors.
  5. Jeśli CandidateColors nie jest pusty, wróć do kroku 3.

Ten chciwy algorytm powinien dać dobre rezultaty.

Odpowiedział 21/11/2008 o 10:29
źródło użytkownik

głosy
1

Jeśli mam poprawnie zrozumieć pytanie, chcesz uzyskać podzbiór M kolorów z najwyższej średniej odległości pomiędzy kolorami, biorąc pod uwagę niektóre funkcja odległość d .

Innymi słowy, biorąc pod uwagę początkowy zestaw N kolorów jak dużej, undirected wykresu, w którym wszystkie kolory są połączone, chcesz znaleźć najdłuższą drogę , która odwiedza żadnych M węzły.

Rozwiązywanie problemów NP-complete wykres jest sposób poza mną boję, ale można spróbować uruchomić prostą symulację fizyczną:

  1. Generowanie M losowych punktów w przestrzeni barw
  2. Obliczenie odległości między każdym z punktów
  3. Oblicz wektorów odpychania dla każdego punktu, który będzie poruszać się od wszystkich innych miejscach (z użyciem 1 / ( odległość ^ 2), a wielkość wektora)
  4. Podsumowując wektory odpychania dla każdego punktu
  5. Aktualizowania położenia każdego punktu według sumowanych wektorów odpychania
  6. Ograniczyć jakikolwiek związany z współrzędnych (takich jak jasność będzie ujemny lub powyżej jednego)
  7. Powtórzyć w etapie 2, aż do ustabilizowania punktów
  8. Dla każdego punktu, wybierz najbliższy kolor z oryginalnego zbioru N

To daleko od efektywne, ale dla małego M może być wystarczająco skuteczne, a to daje blisko uzyskania optymalnych rezultatów.

Jeśli funkcja odległość kolor jest prosty, nie może być bardziej deterministyczny sposób generowania optymalnego podzbioru.

Odpowiedział 16/10/2008 o 18:11
źródło użytkownik

głosy
0

Można podzielić je w formacie HEX RGB, dzięki czemu można porównać R z R na inny kolor, tak samo z G i B.

Sam format jako 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

Więc jedyną rzeczą, którą musisz zdecydować, jak blisko chcesz kolory i jaka jest dopuszczalna różnica dla segmentów powinna być traktowana inaczej.

Odpowiedział 04/08/2008 o 16:31
źródło użytkownik

głosy
0

Czy to znaczy, że ze zbioru N barw, trzeba wybrać kolory M, gdzie M <N, takie, że M jest najlepsza reprezentacja kolorów nw przestrzeni M?

Jako lepszy przykład zmniejszyć true-color (24 bit przestrzeni kolorów) do 8-bitowej przestrzeni kolorów odwzorowanym (GIF?).

Istnieją algorytmy kwantyzacji do tego, takie jak Przestrzennego Dzielnica adaptacyjnego algorytmu stosowanego przez ImageMagick.

Algorytmy te zwykle nie tylko podnieść istniejących kolorów z przestrzeni źródłowej, ale tworzy nowe kolory w przestrzeni docelowej, które najbardziej przypominają barwy źródła. W uproszczonym przykładzie, jeśli 3 kolorów oryginalnego obrazu, przy czym dwa są czerwone (lub innego intensywności niebieskawym odcieniu itd.), A trzecia jest niebieski, i trzeba ograniczyć do dwóch kolorów, żądany obraz może mieć kolor czerwony że jest jakiś rodzaj średniej pierwotnego dwa czerwony + niebieski kolor z oryginalnego obrazu.

Jeśli potrzebujesz czegoś innego, to ja nie rozumiem pytanie :)

Odpowiedział 04/08/2008 o 16:29
źródło użytkownik

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