Acompanhamento: "Classificando" cores de distintividade

votos
18

Pergunta original

Se você é dado N maximamente cores distantes (e alguns métrica de distância associada), você pode vir acima com uma maneira de classificar essas cores em alguma ordem de modo que o primeiro M também são razoavelmente perto de ser um conjunto maximamente distinta?

Em outras palavras, dado um monte de cores distintas, chegar a uma ordenação para que eu possa usar tantas cores como eu preciso começar no início e ser razoavelmente seguro de que todos eles são distintos e que as cores próximas também são muito distintas (por exemplo, vermelho azulado não é próximo ao avermelhado azul).

Randomização é OK, mas certamente não ideal.

Esclarecimento: Dado um conjunto grande e visualmente distinta de cores (digamos 256, ou 1024), eu quero classificá-los de tal forma que quando eu uso o primeiro, digamos, 16 deles que eu recebo um subconjunto relativamente visualmente distinta de cores. Isso equivale, aproximadamente, a dizer Quero classificar esta lista de 1024 para que as cores individuais mais próximos são visualmente, o mais distantes eles estão na lista.

Publicado 04/08/2008 em 16:14
fonte usuário
Em outras línguas...                            


9 respostas

votos
2

N cores maximamente distantes pode ser considerado um conjunto de pontos bem distribuídos em um (cor) espaço 3-dimensional. Se você pode gerá-los a partir de uma seqüência de Halton , então qualquer prefixo (as primeiras cores M) também consiste em pontos bem distribuídos.

Respondeu 25/08/2008 em 09:44
fonte usuário

votos
2

Parece percepção é importante para você, nesse caso, você pode querer considerar trabalhando com um espaço de cor perceptual, como YUV, YCbCr ou Lab. Toda vez que eu usei aqueles, que me deram resultados muito melhores do que sozinho sRGB.

Convertendo de e para sRGB pode ser uma dor, mas no seu caso poderia realmente fazer o algoritmo mais simples e como um bônus que vai trabalhar principalmente para estores cor também!

Respondeu 12/08/2008 em 13:33
fonte usuário

votos
2

Este problema é chamado de quantização cor, e tem muitos algoritmos bem conhecidos: http://en.wikipedia.org/wiki/Color_quantization Sei que as pessoas que implementaram a abordagem octree para um bom efeito.

Respondeu 12/08/2008 em 13:11
fonte usuário

votos
2

Isso também me parece algum tipo de gráfico de resistência em que você tenta mapear o caminho de menor resistência. Se você inverter os requisitos, caminho de resistência máxima, talvez pudesse ser usado para produzir um conjunto que desde o início produz o máximo de diferença que você vá, e no final começa a voltar para valores mais próximos dos outros.

Por exemplo, aqui está uma maneira de talvez fazer o que quiser.

  1. Calcule a distância (ref seu outro post ) de cada cor para todas as outras cores
  2. Somar as distâncias para cada cor, isto dá-lhe uma indicação para o quão longe esta cor é de todas as outras cores no total
  3. Ordenar a lista pela distância, indo para baixo

Isso, ao que parece, produzir uma lista que começa com a cor que está mais longe de todas as outras cores, e depois ir para baixo, cores para o final da lista seria mais perto de outras cores em geral.

Edit: Lendo sua resposta ao meu primeiro post, sobre a subdivisão espacial, que não se encaixam exatamente a descrição acima, desde cores perto de outras cores iria cair para o fundo da lista, mas vamos dizer que você tem um conjunto de cores em algum lugar, em menos uma das cores de esse cluster seria localizado perto do início da lista, e seria a única que geralmente era mais distante de todas as outras cores no total. Se isso faz sentido.

Respondeu 04/08/2008 em 16:38
fonte usuário

votos
1

Você poderia apenas classificar as cores candidatos com base na máxima distanciada do mínimo distância para qualquer uma das cores de índice.

Usando distância cor euclidiana:

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

Embora você pode substituí-lo com o que quiser. Ele só precisa de uma rotina de distância de cor.

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;
            }
        }
    }
}
Respondeu 03/09/2012 em 21:50
fonte usuário

votos
1
  1. Comece com duas listas. CandidateColors, que inicialmente contém suas cores distintas e SortedColors, que é inicialmente vazio.
  2. Escolha qualquer cor e eliminar dos CandidateColors e colocá-lo em SortedColors. Esta é a primeira cor e será o mais comum, por isso é um bom lugar para escolher uma cor que jives bem com a sua aplicação.
  3. Para cada cor em CandidateColors calcular a distância total. A distância total é a soma da distância do CandidateColor para cada uma das cores em SortedColors.
  4. Remover a cor com a maior distância total de CandidateColors e adicioná-lo ao final de SortedColors.
  5. Se CandidateColors não está vazio, volte para o passo 3.

Este algoritmo guloso deve dar-lhe bons resultados.

Respondeu 21/11/2008 em 10:29
fonte usuário

votos
1

Se eu estou entendendo a pergunta corretamente, você deseja obter o subconjunto de M cores com a maior distância média entre as cores, dada alguma função distância d .

Dito de outra forma, considerando-se o conjunto inicial de N cores como um gráfico grande, sem direção em que todas as cores são conectados, você quer encontrar o caminho mais longo que visita quaisquer M nós.

Resolvendo problemas NP-completos gráfico é muito além de mim Eu estou com medo, mas você pode tentar executar uma simulação física simples:

  1. Gerar M pontos aleatórios no espaço de cor
  2. Calcular a distância entre cada ponto
  3. Calcular vectores de repulsão para cada ponto que vai mover-lo longe de todos os outros pontos (utilizando 1 / ( distância ^ 2) como a magnitude do vector)
  4. Somar os vectores de repulsão para cada ponto
  5. Actualizar a posição de cada ponto de acordo com os vectores de repulsão somados
  6. Restringir qualquer fora de coordenadas ligados (tal como luminosidade indo negativo ou superior a um)
  7. Repetir do passo 2 até que os pontos estabilizar
  8. Para cada ponto, selecione a cor mais próxima do conjunto original de N

Está longe de ser eficiente, mas para pequenas M pode ser eficiente o suficiente, e ele lhe dará perto os melhores resultados.

Se a sua função distância cor é simples, pode haver uma maneira mais determinista de gerar o subconjunto ideal.

Respondeu 16/10/2008 em 18:11
fonte usuário

votos
0

Você pode dividir-los em formato RGB HEX para que você possa comparar o R ​​com R da de uma cor diferente, mesmo com o G e B.

Mesmo formato 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

Assim, a única coisa que você precisa decidir é o quão perto você quer as cores eo que é uma diferença aceitável para os segmentos de ser considerado diferente.

Respondeu 04/08/2008 em 16:31
fonte usuário

votos
0

Quer dizer que a partir de um conjunto de cores N, você precisa escolher M cores, onde M <N, tal que M é a melhor representação das cores N no espaço M?

Como um exemplo melhor, reduzir a true-color (espaço de cor de 24 bits) para um espaço de cor mapeada 8-bit (GIF?).

Existem algoritmos de quantização para isso, como o Bairro espacial Adaptive algoritmo usado pelo ImageMagic.

Esses algoritmos geralmente não basta escolher as cores existentes no espaço de origem, mas cria novas cores no espaço-alvo que mais se assemelham as cores de origem. Como um exemplo simplificado, se você tem 3 cores da imagem original onde dois são vermelho (com diferente intensidade ou matizes azulados etc.) eo terceiro é azul, ea necessidade de reduzir a duas cores, a imagem-alvo pode ter uma cor vermelha que é uma espécie de média dos dois vermelha original + a cor azul da imagem original.

Se precisar de mais alguma coisa, então eu não entendi sua pergunta :)

Respondeu 04/08/2008 em 16:29
fonte usuário

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