Quero criar um programa que possa me ajudar a avaliar entre 5 cores predefinidas, qual é mais semelhante a uma cor variável e com qual porcentagem. O fato é que eu não sei como fazer isso manualmente passo a passo. Portanto, é ainda mais difícil pensar em um programa.
Mais detalhes: As cores são de fotografias de tubos com gel que são de cores diferentes. Eu tenho 5 tubos com cores diferentes, cada um é representativo de 1 de 5 níveis. Quero tirar fotografias de outras amostras e, no computador, avaliar em que nível essa amostra pertence comparando cores, e também quero saber isso com uma porcentagem de aproximação. Eu gostaria de um programa que faça algo assim: http://www.colortools.net/color_matcher.html
Se você pode me dizer que medidas tomar, mesmo que sejam coisas para eu pensar e fazer manualmente. Seria muito útil.
Respostas:
Consulte o artigo da Wikipedia sobre Diferença de cores para obter as pistas certas. Basicamente, você deseja calcular uma métrica de distância em algum espaço de cores multidimensional. Como o RGB não é "perceptualmente uniforme", sua métrica de distância RGB euclidiana sugerida por Vadim não corresponderá à distância percebida pelo homem entre as cores. Para começar, L a b * pretende ser um espaço de cores perceptualmente uniforme, e a métrica deltaE é comumente usada. Mas existem espaços de cores mais refinados e fórmulas delta mais refinadas que se aproximam da correspondência da percepção humana.
Você precisará aprender mais sobre espaços de cores e iluminantes para fazer as conversões. Mas, para uma fórmula rápida melhor que a métrica RGB euclidiana, faça o seguinte: assuma que seus valores RGB estão no espaço de cores sRGB, encontre as fórmulas de conversão de sRGB em L a b *, converta suas cores sRGB em L a b *, e calcule o deltaE entre seus dois valores L a b *. Não é computacionalmente caro, são apenas algumas fórmulas não lineares e algumas multiplicam e adicionam.
fonte
color
gema que implementa o deltaE entre outras operações de cores.Apenas uma idéia que me veio à mente (desculpe se for estúpido). Três componentes de cores podem ser assumidas coordenadas 3D de pontos e, em seguida, você pode calcular a distância entre os pontos.
FE
A distância entre cores é
Porcentagem é
fonte
na verdade, eu segui o mesmo caminho alguns meses atrás. não há resposta perfeita para a pergunta (que foi feita aqui algumas vezes), mas há uma mais sofisticada do que a resposta sqrt (rr) etc. e mais fácil de implantar diretamente com RGB sem mover para todos os tipos de espaços de cores alternativos. Encontrei essa fórmula aqui, que é uma aproximação de baixo custo da fórmula real bastante complicada (pela CIE, que é o W3C da cor, já que essa é uma busca ainda não concluída, você pode encontrar equações de diferença de cor mais antigas e simples). boa sorte
Edit: Para posteridade, aqui está o código C relevante:
fonte
Um valor de cor possui mais de uma dimensão, portanto, não há uma maneira intrínseca de comparar duas cores. Você precisa determinar para o seu caso de uso o significado das cores e, assim, a melhor forma de compará-las.
Provavelmente, você deseja comparar as propriedades de matiz, saturação e / ou luminosidade das cores, em oposição aos componentes vermelho / verde / azul. Se você está tendo problemas para descobrir como deseja compará-las, pegue alguns pares de cores de amostra e compare-as mentalmente, depois tente justificar / explicar por que elas são semelhantes / diferentes.
Depois de saber quais propriedades / componentes das cores você deseja comparar, você precisará descobrir como extrair essas informações de uma cor.
Provavelmente, você precisará converter a cor da representação comum RedGreenBlue em HueSaturationLightness e calcular algo como
Este exemplo forneceria um valor escalar simples, indicando a que distância o gradiente / matiz das cores está um do outro.
Veja HSL e HSV na Wikipedia .
fonte
Se você tiver dois
Color
objetosc1
ec2
, poderá comparar cada valor RGB com o valorc1
dec2
.Esses valores podem ser divididos pela quantidade de saturações de diferença (255) e você obterá a diferença entre os dois.
Após o qual você pode apenas encontrar a diferença média de cores em porcentagem.
O que lhe daria uma diferença percentual entre
c1
ec2
.fonte
pctDiffRed = diffRed / 255;
lhe dará 0, a menos que você jogue para um flutuador em algum lugar. <b> 2 </b> Você precisará multiplicar por 100 em algum lugar para obter uma porcentagem.Um dos melhores métodos para comparar duas cores pela percepção humana é o CIE76. A diferença é chamada Delta-E. Quando é menor que 1, o olho humano não consegue reconhecer a diferença.
Há uma maravilhosa classe de utilitários de cores ColorUtils (código abaixo), que inclui métodos de comparação CIE76. É escrito por Daniel Strebel, Universidade de Zurique.
No ColorUtils.class eu uso o método:
r1, g1, b1 - valores RGB da primeira cor
r2, g2, b2 - valores RGB da segunda cor que você deseja comparar
Se você trabalha com Android, pode obter estes valores assim:
r1 = Color.red(pixel);
g1 = Color.green(pixel);
b1 = Color.blue(pixel);
ColorUtils.class de Daniel Strebel, Universidade de Zurique:
fonte
Apenas mais uma resposta, embora seja semelhante à do Supr - apenas um espaço de cores diferente.
A questão é: os seres humanos percebem a diferença de cores de maneira não uniforme e o espaço de cores RGB está ignorando isso. Como resultado, se você usar o espaço de cores RGB e apenas calcular a distância euclidiana entre duas cores, poderá obter uma diferença matematicamente absolutamente correta, mas que não coincidiria com o que os humanos lhe diriam.
Isso pode não ser um problema - acho que a diferença não é tão grande, mas se você quiser resolver isso "melhor", converta suas cores RGB em um espaço de cores projetado especificamente para evitar o problema acima. Existem vários aprimoramentos de modelos anteriores (já que isso é baseado na percepção humana, precisamos medir os valores "corretos" com base em dados experimentais). Existe o espaço de cores do laboratório que eu acho que seria o melhor, embora um pouco complicado para convertê-lo. Mais simples seria o CIE XYZ .
Aqui está um site que lista as fórmulas para converter entre diferentes espaços de cores, para que você possa experimentar um pouco.
fonte
Todos os métodos abaixo resultam em uma escala de 0 a 100.
fonte
A melhor maneira é deltaE. DeltaE é um número que mostra a diferença de cores. Se deltae <1, a diferença não pode ser reconhecida pelos olhos humanos. Eu escrevi um código em canvas e js para converter rgb em laboratório e depois calcular delta e. Neste exemplo, o código está reconhecendo pixels que possuem cores diferentes com uma cor base que eu salvei como LAB1. e se for diferente, torna esses pixels vermelhos. Você pode aumentar ou reduzir a sensibilidade da diferença de cores, aumentando ou diminuindo o intervalo aceitável de delta e. Neste exemplo, designei 10 para deltaE na linha que escrevi (deltae <= 10):
}
// ------------------------------------------------ -------------------------------------------------- ---
fonte
1/3
e16/116
ambos avaliam0
, o que quase certamente não é o que você deseja. Provavelmente seu algoritmo está correto, mas seu código certamente não está.Um método simples que usa apenas RGB é
Eu usei este por um tempo agora, e funciona bem o suficiente para a maioria dos propósitos.
fonte
1/3
Eu usei isso no meu android e parece satisfatório, embora o espaço RGB não seja recomendado:
Então usei o seguinte para obter porcentagem de similaridade:
Funciona bem o suficiente.
fonte
Eu tentei vários métodos como espaço de cores LAB, comparações HSV e descobri que a luminosidade funciona muito bem para esse fim.
Aqui está a versão do Python
Darei à você
fonte
ImageColor
? edit Eu encontrei, é #from PIL import ImageColor
Espero que você queira analisar uma imagem inteira no final, não é? Assim, você pode verificar a menor / maior diferença na matriz de cores da identidade.
A maioria das operações matemáticas para processamento de gráficos usa matrizes, porque os possíveis algoritmos que os utilizam são geralmente mais rápidos que os cálculos ponto a ponto clássicos de distância e comparação. (por exemplo, para operações usando DirectX, OpenGL, ...)
Então eu acho que você deveria começar por aqui:
http://en.wikipedia.org/wiki/Identity_matrix
http://en.wikipedia.org/wiki/Matrix_difference_equation
... e como Beska já comentou acima:
O que significa também que seu algoritmo depende da definição de "similar a" se você estiver processando imagens.
fonte
Versão Kotlin com quanto por cento você deseja corresponder.
Chamada de método com o argumento opcional de porcentagem
Corpo do método
fonte
Você precisará converter todas as cores RGB no espaço de cores do laboratório para poder compará-las da maneira que os humanos as veem. Caso contrário, você obterá cores RGB que 'combinam' de maneiras muito estranhas.
O link da Wikipedia sobre Diferenças de cores fornece uma introdução aos vários algoritmos de diferença de espaço de cores do laboratório que foram definidos ao longo dos anos. O mais simples que apenas verifica a distância euclidiana de duas cores de laboratório, funciona, mas tem algumas falhas.
Convenientemente, há uma implementação em Java do algoritmo CIEDE2000 mais sofisticado no projeto OpenIMAJ . Forneça seus dois conjuntos de cores de laboratório e retornará o valor da distância única.
fonte
A única maneira "correta" de comparar cores é fazê-lo com deltaE no CIELab ou CIELuv.
Mas, para muitas aplicações, acho que essa é uma aproximação suficientemente boa:
distance = 3 * |dR| + 4 * |dG| + 3 * |dB|
Eu acho que uma distância ponderada de Manhattan faz muito mais sentido ao comparar cores. Lembre-se de que as cores primárias estão apenas na nossa cabeça. Eles não têm nenhum significado físico. O CIELab e o CIELuv são modelados estatisticamente a partir da nossa percepção da cor.
fonte
Para rápido e sujo, você pode fazer
fazendo uso da divisão inteira para quantizar as cores.
fonte
Resposta rápida 5
Encontrei este tópico porque precisava de uma versão Swift desta pergunta. Como ninguém respondeu com a solução, aqui está a minha:
Uso:
Defino menos de 10% de diferença para retornar cores semelhantes, mas você pode personalizar isso sozinho.
fonte
API do Android for ColorUtils RGBToHSL: eu tinha duas cores int argb (cor1, cor2) e queria obter distância / diferença entre as duas cores. Aqui está o que eu fiz;
Então usei o código abaixo para encontrar a distância entre as duas cores.
fonte