Quiero diseñar un programa que pueda ayudarme a evaluar entre 5 colores predefinidos cuál es más similar a un color variable y con qué porcentaje. El caso es que no sé cómo hacerlo manualmente paso a paso. Por lo tanto, es aún más difícil pensar en un programa.
Más detalles: Los colores son de fotografías de tubos con gel que en diferentes colores. Tengo 5 tubos con diferentes colores, cada uno representa 1 de 5 niveles. Quiero tomar fotografías de otras muestras y, en la computadora, evaluar a qué nivel pertenece esa muestra comparando colores, y también quiero saberlo con un porcentaje de aproximación. Me gustaría un programa que haga algo como esto: http://www.colortools.net/color_matcher.html
Si me puede decir qué pasos tomar, incluso si son cosas que debo pensar y hacer manualmente. Sería muy útil.
Respuestas:
Consulte el artículo de Wikipedia sobre la diferencia de color para conocer las pistas correctas. Básicamente, desea calcular una métrica de distancia en algún espacio de color multidimensional. Pero RGB no es "perceptualmente uniforme", por lo que su métrica de distancia Euclidiana RGB sugerida por Vadim no coincidirá con la distancia percibida por los humanos entre los colores. Para empezar, L a b * está destinado a ser un espacio de color perceptualmente uniforme, y la métrica deltaE se usa comúnmente. Pero hay espacios de colores más refinados y fórmulas deltaE más refinadas que se acercan a la percepción humana.
Tendrás que aprender más sobre espacios de colores e iluminantes para hacer las conversiones. Pero para una fórmula rápida que sea mejor que la métrica Euclidean RGB, solo haga esto: suponga que sus valores RGB están en el espacio de color sRGB, encuentre las fórmulas de conversión sRGB a L a b *, convierta sus colores sRGB a L a b *, y calcule deltaE entre sus dos valores L a b *. No es computacionalmente costoso, son solo algunas fórmulas no lineales y algunas multiplicaciones y sumas.
fuente
color
gema que implementa deltaE entre otras operaciones de color.Solo una idea que primero vino a mi mente (lo siento si es estúpida). Se pueden suponer tres componentes de colores coordenadas 3D de puntos y luego se puede calcular la distancia entre puntos.
FE
La distancia entre colores es
El porcentaje es
fuente
De hecho, caminé por el mismo camino hace un par de meses. no hay una respuesta perfecta a la pregunta (que se hizo aquí un par de veces), pero hay una respuesta más sofisticada que la sqrt (rr, etc.) y más fácil de implementar directamente con RGB sin moverse a todo tipo de espacios de color alternativos. Encontré esta fórmula aquí, que es una aproximación de bajo costo de la fórmula real bastante complicada (por el CIE, que es el W3C del color, ya que esta es una búsqueda no terminada, puede encontrar ecuaciones de diferencia de color más antiguas y simples allí). buena suerte
Editar: para la posteridad, aquí está el código C relevante:
fuente
Un valor de color tiene más de una dimensión, por lo que no hay una forma intrínseca de comparar dos colores. Debe determinar para su caso de uso el significado de los colores y, por lo tanto, cómo compararlos mejor.
Lo más probable es que desee comparar las propiedades de matiz, saturación y / o luminosidad de los colores opuestos a los componentes rojo / verde / azul. Si tiene problemas para determinar cómo quiere compararlos, tome algunos pares de colores de muestra y compárelos mentalmente, luego intente justificarse / explicarse por qué son similares / diferentes.
Una vez que sepa qué propiedades / componentes de los colores desea comparar, deberá descubrir cómo extraer esa información de un color.
Lo más probable es que solo necesite convertir el color de la representación común de RedGreenBlue a HueSaturationLightness, y luego calcular algo como
Este ejemplo le daría un valor escalar simple que indica qué tan lejos están el gradiente / tono de los colores entre sí.
Ver HSL y HSV en Wikipedia .
fuente
Si tiene dos
Color
objetosc1
yc2
, simplemente puede comparar cada valor RGBc1
con el dec2
.Esos valores se pueden dividir por la cantidad de saturación de diferencia (255), y obtendrá la diferencia entre los dos.
Después de lo cual puede encontrar la diferencia de color promedio en porcentaje.
Lo que te daría una diferencia en porcentaje entre
c1
yc2
.fuente
pctDiffRed = diffRed / 255;
te dará 0 a menos que lances a un flotador en alguna parte. <b> 2 </b> Tendrá que multiplicar por 100 en algún lugar para obtener un porcentaje.Uno de los mejores métodos para comparar dos colores por percepción humana es CIE76. La diferencia se llama Delta-E. Cuando es menor que 1, el ojo humano no puede reconocer la diferencia.
Existe una maravillosa clase de utilidades de color ColorUtils (código a continuación), que incluye métodos de comparación CIE76. Está escrito por Daniel Strebel, Universidad de Zurich.
De ColorUtils.class utilizo el método:
r1, g1, b1: valores RGB del primer color
r2, g2, b2: valores RGB del segundo color que desea comparar
Si trabaja con Android, puede obtener estos valores de esta manera:
r1 = Color.red(pixel);
g1 = Color.green(pixel);
b1 = Color.blue(pixel);
ColorUtils.class por Daniel Strebel, Universidad de Zurich:
fuente
Solo otra respuesta, aunque es similar a la de Supr: solo un espacio de color diferente.
La cuestión es: los humanos perciben la diferencia de color de manera no uniforme y el espacio de color RGB lo ignora. Como resultado, si usa el espacio de color RGB y solo calcula la distancia euclidiana entre 2 colores, puede obtener una diferencia que es matemáticamente absolutamente correcta, pero que no coincidiría con lo que los humanos le dirían.
Esto puede no ser un problema, creo que la diferencia no es tan grande, pero si desea resolver este "mejor", debe convertir sus colores RGB en un espacio de color diseñado específicamente para evitar el problema anterior. Hay varios, mejoras de modelos anteriores (dado que esto se basa en la percepción humana, necesitamos medir los valores "correctos" en base a datos experimentales). Existe el espacio de color Lab, que creo que sería el mejor, aunque un poco complicado para convertirlo. Más simple sería el CIE XYZ .
Aquí hay un sitio que enumera las fórmulas para convertir entre diferentes espacios de color para que pueda experimentar un poco.
fuente
Todos los métodos a continuación dan como resultado una escala de 0 a 100.
fuente
La mejor manera es deltaE. DeltaE es un número que muestra la diferencia de los colores. Si deltae <1, entonces la diferencia no puede ser reconocida por los ojos humanos. Escribí un código en canvas y js para convertir rgb a lab y luego calcular delta e. En este ejemplo, el código reconoce píxeles que tienen un color diferente con un color base que guardé como LAB1. y luego, si es diferente, esos píxeles se vuelven rojos. Puede aumentar o reducir la sensibilidad de la diferencia de color al aumentar o disminuir el rango aceptable de delta e. En este ejemplo, asigné 10 para deltaE en la línea que escribí (deltae <= 10):
}
// ------------------------------------------------ -------------------------------------------------- ---
fuente
1/3
y16/116
ambos evalúan0
, lo que casi seguro no es lo que quieres. Probablemente su algoritmo sea correcto, pero su código ciertamente no lo es.Un método simple que solo usa RGB es
He usado este por un tiempo ahora, y funciona lo suficientemente bien para la mayoría de los propósitos.
fuente
1/3
Utilicé esto en mi Android y parece satisfactorio, aunque no se recomienda el espacio RGB:
Luego usé lo siguiente para obtener el porcentaje de similitud:
Funciona bastante bien.
fuente
He probado varios métodos como el espacio de color LAB, las comparaciones de HSV y he descubierto que la luminosidad funciona bastante bien para este propósito.
Aquí está la versión de Python
Te regalaré
fuente
ImageColor
? editar Encontré, esfrom PIL import ImageColor
Espero que quieras analizar una imagen completa al final, ¿no? Entonces puede verificar la diferencia más pequeña / más alta en la matriz de color de identidad.
La mayoría de las operaciones matemáticas para procesar gráficos usan matrices, porque los posibles algoritmos que las usan son a menudo más rápidos que los cálculos clásicos de distancia por punto y de comparación. (por ejemplo, para operaciones con DirectX, OpenGL, ...)
Así que creo que deberías comenzar aquí:
http://en.wikipedia.org/wiki/Identity_matrix
http://en.wikipedia.org/wiki/Matrix_difference_equation
... y como Beska ya comentó anteriormente:
Lo que significa también que su algoritmo depende de su definición de "similar a" si está procesando imágenes.
fuente
Versión de Kotlin con cuánto porcentaje quieres igualar.
Llamada de método con argumento opcional porcentual
Cuerpo del método
fuente
Deberá convertir los colores RGB en el espacio de color Lab para poder compararlos de la forma en que los humanos los ven. De lo contrario, obtendrá colores RGB que 'coinciden' de maneras muy extrañas.
El enlace de Wikipedia en Color Differences le ofrece una introducción a los diversos algoritmos de diferencia de espacio de color de Lab que se han definido a lo largo de los años. El más simple que solo verifica la distancia euclidiana de dos colores de laboratorio, funciona pero tiene algunos defectos.
Convenientemente, hay una implementación de Java del algoritmo CIEDE2000 más sofisticado en el proyecto OpenIMAJ . Proporcione sus dos conjuntos de colores Lab y le devolverá un valor de distancia única.
fuente
La única forma "correcta" de comparar colores es hacerlo con deltaE en CIELab o CIELuv.
Pero para muchas aplicaciones, creo que esta es una aproximación lo suficientemente buena:
distance = 3 * |dR| + 4 * |dG| + 3 * |dB|
Creo que una distancia ponderada de Manhattan tiene mucho más sentido al comparar colores. Recuerda que los colores primarios solo están en nuestra cabeza. No tienen ningún significado físico. CIELab y CIELuv se modelan estadísticamente a partir de nuestra percepción del color.
fuente
Para rápido y sucio, puedes hacer
haciendo uso de la división entera para cuantizar los colores.
fuente
Respuesta rápida 5
Encontré este hilo porque necesitaba una versión rápida de esta pregunta. Como nadie ha respondido con la solución, aquí está el mío:
Uso:
Configuré menos del 10% de diferencia para devolver colores similares, pero puedes personalizarlo tú mismo.
fuente
Android para ColorUtils API RGBToHSL: Tenía dos colores int argb (color1, color2) y quería obtener la distancia / diferencia entre los dos colores. Aquí esta lo que hice;
Luego usé el siguiente código para encontrar la distancia entre los dos colores.
fuente