¿Hay algún algoritmo para mezclar colores que funcione como mezclar colores reales?

La mezcla común de colores RGB es muy diferente de mezclar colores para pinturas, es la mezcla de luz en lugar de la mezcla de pigmentos.

Por ejemplo:

Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128) 

(Debe ser azul + amarillo = verde)

¿Hay algún algoritmo conocido para mezclar colores que funcione como mezclar colores reales?


Mi acercamiento

Ya he intentado seguir:

Convirtiendo ambos colores a HSV y mezclando matices (multiplicado por el coeficiente calculado a partir de la saturación), y un promedio simple para saturación y canales de valores. Luego calculé la luminancia promedio de ambos colores y ajusté el color resultante para que coincida con esta luminancia. Esto funcionó bastante bien, pero la mezcla de tonos a veces era incorrecta, por ejemplo:

 Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°) 

He descubierto que a veces necesito cambiar el valor del tono en 360 ° (cuando la diferencia entre los tonos es mayor que 180 °).

 Red (Hue 360°) + Blue (Hue 240°) = Magenta/fuchsia (Hue 300°) 

Pero este cambio tampoco fue muy bueno, por ejemplo:

 Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5° Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performed (the difference is greater than 180°) Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5° 

(Tono 179 + Rojo) y (Tono 181 + Rojo) da como resultado dos colores completamente diferentes.


Luego probé el espacio de color CIE Lab (como en Photoshop), que está diseñado para estar más cerca de cómo los humanos perciben los colores.

Utilicé solo un promedio simple para cada uno de los dos canales correspondientes, pero los resultados no fueron satisfactorios, por ejemplo, obtuve el rosa (64, 26, -9.5) de azul (98, -16, 93) y amarillo (30, 68, -112). Estos coeficientes fueron tomados de Photoshop.

Tal vez si utilicé una operación diferente a la media, podría funcionar, pero no sé qué.


CMYK tampoco funcionó , los resultados son como en RGB o LAB.


Parece que ni el aditivo trivial ni la mezcla de color sustractiva en ninguno de estos espacios de color produce resultados naturales.


Implementaciones de trabajo

Krita – Mezclador pictórico

El editor de gráficos ráster Krita tuvo una implementación de trabajo de mezcla de color más realista en algún momento: http://commit-digest.org/issues/2007-08-12/ (Plugin de mezclador Painterly)

Dicen que es la primera aplicación pública que implementa tecnología especial usando ecuaciones de Kubelka y Munk que describen el comportamiento de los pigmentos.

Aquí hay un video de la mezcla de colores Krita: https://www.youtube.com/watch?v=lyLPZDVdQiQ

Papel de FiftyThree

También hay un artículo sobre la mezcla de colores en la aplicación Paper para iOS desarrollado por FiftyThree . Describen cómo innovan y experimentan en el área y también ofrecen muestras de mezcla de azul y amarillo que resultan en verde. Sin embargo, el proceso o algoritmo real no se describe realmente allí.

Citando:

“Al buscar un buen algoritmo de mezcla, inicialmente intentamos interpolar en varios espacios de color: RGB, HSV y HSL, luego CieLAB y CieLUV. Los resultados fueron decepcionantes”, dice Chen. “Sabemos que el rojo y el amarillo deben producir naranja, o el rojo y el azul deben ser purpúreos, pero no hay forma de llegar a estos colores sin importar el color-espacio que uses. Hay un axioma de ingeniería: haz lo más simple que podría funcionar. Bueno, ahora habíamos intentado los enfoques más fáciles y no se sentían remotamente correctos “.

Parece lo mismo que Krita, Paper implementa el modelo de Kubelka-Munk:

[…] el modelo Kubelka-Munk tenía al menos seis valores para cada color, incluidos los valores de reflexión y absorción para cada uno de los colores RGB. “Si bien la apariencia de un color en una pantalla se puede describir en tres dimensiones, la combinación de color realmente está sucediendo en un espacio de seis dimensiones”, explica Georg Petschnigg, cofundador y CEO de FiftyThree. El documento de Kubelka-Munk había permitido al equipo traducir un problema estético en un marco matemático. […]

De toda esta información, parece que la implementación basada en el modelo Kubelka-Munk podría ser el camino a seguir y ofrecer resultados que estén mucho más cerca de la realidad.

Aunque parece un proceso complicado, todavía no he visto mucha información buena sobre cómo implementar algo como esto.


Preguntas relacionadas

Estas preguntas fueron publicadas después de esta, todas relacionadas con la misma cosa.

Ninguno de ellos realmente tiene la respuesta.

  • Cálculo de un color mezclado en RGB
  • Algoritmo para encontrar el color entre otros dos: en el espacio de color de los colores pintados
  • Implementando Kubelka-Munk como Krita para mezclar colores como pintura

Otros enlaces y recursos relacionados

  • Kubelka-Munk busca en Twitter
  • Mezcla de pinturas (!! Con 2016) por Diana Liao
    • diapositivas
    • vídeo
  • Paint Inspired Color Mixing and Compositing para visualización (N. Gossett, B. Chen)

La respuesta correcta es NO, porque no existe un modelo de trabajo correcto sobre cómo funciona realmente la “mezcla de colores en el mundo real”. Es demasiado complejo y condicional, y no se parece en nada al simple material rojo-azul-amarillo que aprendimos en la escuela (de hecho, requiere toda la Química y mucha Física y Biología para resolver).

Sin embargo, la respuesta simplista es: SÍ, use mezcla sustractiva en lugar de mezcla aditiva .

La mezcla de colores que aprendimos en la escuela primaria se basa en combinaciones de pigmentos que son una forma de mezcla de color sustractiva (muy simplista). Es decir, mientras más colores agreguemos, más oscuro se vuelve porque cada pigmento resta un poco más de luz.

Por otro lado, casi todos los esquemas de color de las computadoras son aditivos, ya que se basan en la combinación de ondas de luz (muy simplistas), por lo que se vuelven más shinys, ya que cada color agrega un poco más de luz.

El esquema RGB + es de alguna manera, el complemento aditivo al esquema sustractivo que aprendimos en la mayoría de las escuelas primarias de EE. UU. (Que es RBY-). Sin embargo, no coinciden exactamente y puede ser difícil convertirlos (investigando ahora …)


De acuerdo, si solo quiere cambiar de combinaciones aditivas en RGB a sustractivas, puede usar la siguiente fórmula de tipo reverse-bayesan para combinar dos colores:

 NewColor.R = (Color1.R * Color2.R)/255 NewColor.G = (Color1.G * Color2.G)/255 NewColor.B = (Color1.B * Color2.B)/255 

Ajustar por la diferencia en los polos cromáticos (G a Y, luego volver a G) es mucho más difícil …


Se ha señalado que esto produce negro para el problema de ejemplo, y técnicamente esto es correcto para un verdadero sistema sustractivo, sin embargo, si quieres más sistema de dilución / sustracción, puedes intentar esto en su lugar:

 NewColor.R = 255 - SQRT(((255-Color1.R)^2 + (255-Color2.R)^2)/2) NewColor.G = 255 - SQRT(((255-Color1.G)^2 + (255-Color2.G)^2)/2) NewColor.B = 255 - SQRT(((255-Color1.B)^2 + (255-Color2.B)^2)/2) 

Esto produce un gris oscuro en lugar de negro. Pero para obtener el amarillo o cualquier cosa cercana, todavía tiene que arreglar el problema de alineación de polos del esquema de colores.

hay dos posibilidades diferentes combinando colores:

  1. mezcla aditiva (como RGB)

  2. mezcla sustractiva (como CMYK)

Entonces, en la mezcla de color sustractiva, el resultado es lo que esperaba, pero no hay azul, en cambio hay cian:

Amarillo + cian = verde

En general, la mezcla de color sustractiva es simplemente “quitar” (filtrar) del blanco, mientras que la mezcla de color aditiva se sum al negro. (los colores base de sustractivo son inversos desde el aditivo: rojo -> cian; verde -> magenta; azul -> amarillo)

Entonces, si comienzas con la pantalla blanca aplicando filtros:

min (blanco (255,255,255), amarillo (255,255,0), cian (0,255,255)) = verde (0,255,0)

Existe un código para mezclar colores de forma realista en krita: https://projects.kde.org/projects/calligra/repository/revisions/master/show/krita/plugins/extensions/painterlyframework .

Tenga en cuenta que el código que incluye el archivo de iluminantes es GPLv2 +. Puede convertir de RGB a longitudes de onda, hacer composición y convertir de nuevo.

Creo que tu problema con la combinación de matices es que lo haces sumndo los dos angularjs y dividiéndolos por dos. Como habrás notado, el resultado a menudo no tiene sentido. Creo que sería mejor convertir los angularjs en coordenadas cartesianas en el círculo unitario, promediarlas y encontrar el ángulo del punto resultante (ignorando la magnitud).

Una forma de hacer una mezcla sustractiva de colores RGB es convertir primero los colores RGB en curvas de reflectancia espectral. La conversión es bastante simple, y una vez que lo haya hecho, puede hacer una verdadera mezcla sustractiva de las curvas de reflectancia, y luego convertir el resultado a RGB. Hay otra pregunta similar: stackoverflow.com/questions/10254022/ , donde este proceso se analiza con más detalle.

Preguntándose si el cálculo de la inversión del valor RGB funciona. Dado que se trata de resta de luces, técnicamente la parte de resta se puede calcular mediante cálculos simples.

Por ejemplo, cian + amarillo

cyan = 0x00ffff amarillo = 0xffff00

Sus inversiones son 0xff0000 y 0x0000ff, lo que significa que absorbieron por completo las luces rojas y azules. Su mezcla 1: 1 debe absorber la mitad de las luces rojas y azules (ya que la otra mitad de la mezcla todavía puede reflejar algo de luz roja y azul), lo cual es consistente con (0xff0000 + 0x00ffff) / 2 = 0x7f007f. Ahora restamos el valor de 0xffffff tenemos 0x80ff80 que es verde!

Verifique esta implementación para las aloritmos de mezcla aditiva, sustractiva y otras.

Es completamente funcional (escrito en java), por lo que puedes probar cualquier color que necesites mezclar y ver si se ajusta a tus necesidades.

Como señalaron otras respuestas, Azul + Amarillo (exactamente Cian + Amarillo ) es Verde en alginorum CMYK sustractivo. Vea usted mismo