2012-08-22 23 views
5

Dado que en RGB podemos representar 256^3 combinaciones = 16,777,216 colores, y dado que el ojo humano solo puede distinguir aproximadamente 10,000,000, obviamente hay un exceso de 6,777,216 combinaciones de RGB que cromáticamente son indistinguibles de los colores de contraparte .RGB Algoritmo de aproximación de color similar

Los algoritmos de compresión funcionan sobre esta base al aproximar la diferencia espacial en rangos de color en un marco, creo. Teniendo esto en cuenta, ¿cómo se puede calcular de forma fiable si un color determinado se encuentra dentro de un rango de "similitud" con otro?

Por supuesto, 'similitud' será algún tipo de parámetro arbitrario/sintonizable que se puede modificar, pero esta es una aproximación de todos modos. Entonces, ¿algún puntero, pseudocódigo, muestras de código intuitivas, recursos para ayudarme a modelar tal función?

Muchas gracias por su ayuda

+0

Dice "un excedente de 6.777.216" como si se desperdiciara casi la mitad de la información. No es el caso. Estos 6,777,216 colores representan '1-log2 (1000000)/24', es decir. 3.11% de la información. ¡No cuentes con eso para comprimir! –

+0

Años después, esta pregunta todavía parece relevante. En caso de que ayude a alguien, encontré una solución diferente usando HSL sobre la que escribí recientemente [aquí] (https://medium.com/@dariushodaei/colour-coding-part-1-aa0d9910592) – ComethTheNerd

Respuesta

5

La diferencia de color perceptual se puede calcular con The CIEDE2000 Color-Difference Formula. El CIEDE2000 formula se basa en el espacio de color de LCH (luminosidad, croma y tono). El espacio de color de LCH se representa como un cilindro (vea la imagen here).

Un modelo menos preciso (pero más manejable), es la fórmula Diferencia de color CIE76, que se basa en el Lab color space (L*a*b*). No hay fórmulas simples para la conversión entre valores RGB o CMYK y L * a * b *, porque los modelos de color RGB y CMYK dependen del dispositivo. Los valores RGB o CMYK primero deben transformarse en un espacio de color absoluto específico, como sRGB o Adobe RGB. Este ajuste dependerá del dispositivo, pero los datos resultantes de la transformación serán independientes del dispositivo, permitiendo que los datos se transformen en el espacio de color CIE 1931 y luego se transformen en L * a * b *. El artículo This explica el procedimiento y las fórmulas.

+0

Excelentes recursos! Trae recuerdos de un módulo de gráficos de grado que hice sobre la percepción del color. Gracias por los indicadores – ComethTheNerd

1

sistema de color RGB está diseñado de tal manera que si 2 colores tienen valores que están cerca uno del otro y luego los colores también son perceptualmente cerca.

Ejemplo:

de color definida por RGB = (100, 100, 100) es perceptivamente casi el mismo que los colores RGB = (101, 101, 100), RGB = (98, 100, 99), etc. ...

+0

Entonces, un grado de varianza de tal vez n <5 en cualquier columna no debería arrojar una diferencia cromática perceptible entonces? Ese es un buen lugar para comenzar las pruebas, gracias – ComethTheNerd

+0

Sí. Pruebe esta herramienta en línea para probar: [Esquema de colores] (http://www.colorschemer.com/online.html) –

+0

Tenga en cuenta que debe verificar la cercanía de los valores * componente-sabio *, no puede simplemente irse (color1 - color2) Thomas

9

Hay muchas formas de calcular las distancias entre los colores, las más simples se definen en los componentes de color en cualquier espacio de color. Estos son "distancias" comunes o métricas entre los colores RGB (R1, G1, B1) y (R2, G2, B2):

  • L : abs (r1-r2) + abs (g1-g2) + abs (b1-b2)
  • L : sqrt ((R1-R2) ² + (G1-G2) ² + (b1-b2) ²)
  • L : max (abs (r1-r2), abs (g1-g2), abs (b1-b2))

Sin embargo, estos no tienen en cuenta el hecho de que la visión humana es les s sensible al color que al brillo. Para obtener resultados óptimos, debe convertir de RGB a un espacio de color que codifica el brillo y el color por separado. Luego, use una de las métricas anteriores en el nuevo espacio de color, posiblemente otorgue más peso al componente de brillo y menos a los componentes de color.

Las áreas de color indistinguibles entre sí se llaman MacAdam ellipses.Las elipsis se vuelven casi circulares en los espacios de color CIELUV y CIELAB, lo que es ideal para el cálculo, pero desafortunadamente, pasar de RGB a estos espacios de color no es tan simple.

JPEG convierte los colores en YCbCr, donde Y es el brillo y las dos C codifican el color, y luego reduce a la mitad la resolución de los componentes C. Se podría hacer lo mismo y luego usar una versión pesada de uno de los indicadores anteriores, por ejemplo:

diff = sqrt(1.4*sqr(y1-y2) + .8*sqr(cb1-cb2) + .8*sqr(cr1-cr2)) 

El artículo sobre color difference en Wikipedia tiene más ejemplos de diferentes espacios de color.

+0

Esto es realmente genial, y gracias por las sugerencias. ¡Negocio complicado que se aproxima al color! – ComethTheNerd