¿Cómo calculo las coordenadas de los colores secundarios en un diagrama de cromaticidad CIE?

Imagine una gama de dispositivos típica en el diagrama CIE xy:

ingrese la descripción de la imagen aquí

Las coordenadas x e y para los colores primarios (rojo, verde y azul) están definidas y conocidas, ¿cómo calcular los colores secundarios (cian, magenta y amarillo)?

Esto es interesante, y obviamente el color es relevante para la fotografía en general , pero ¿podría explicarnos la aplicación fotográfica particular que tiene en mente aquí?
@mattdm Estoy trabajando con proyectores y la combinación de colores entre ellos.
¿De cyan, magenta, yellowqué estás hablando? son blue+green, red+blue, red+greenrespectivamente?
@EuriPinhollow Como mencioné antes, estoy trabajando con un sistema de combinación de colores con proyectores. En cada menú del proyector, tengo que configurar las coordenadas CIE xy medidas reales para los primarios R, G, B. Luego tengo que calcular la gama alcanzable común. Es fácil calcular las coordenadas R, G, B, pero el proyector también requiere C, M, Y, que tengo que calcular de alguna manera.
@jeka: ¿no deberían medirse también? Si tiene un perfil LUT (es decir, no matriz) para su proyector, puede deducir esas coordenadas a partir de él.

Respuestas (1)

Realizar la operación directamente usando las coordenadas de cromaticidad (es decir, tomar el punto medio entre las dos coordenadas de cromaticidad) arrojará resultados incorrectos ya que el diagrama de cromaticidad es altamente no uniforme.

Suponiendo que está utilizando valores de luz lineales, podría realizar la siguiente cadena de cálculos:

  • CIE xy a CIE xyY (opcional) para cada par de coordenadas de cromaticidad donde el valor de luminancia Y se recupera de la matriz primaria normalizada sRGB. Es importante reconocer que cuando usa coordenadas de cromaticidad solo, no tiene ninguna información de luminancia que también puede producir resultados inesperados.
  • CIE xy a CIE XYZ para cada par de coordenadas de cromaticidad
  • CIE XYZ a sRGB para cada par de valores triestímulo
  • Agrega sRGB de tu par de valores RGB
  • sRGB a CIE XYZ de sus valores RGB resultantes
  • CIE XYZ a CIE xy

Ahora, es probable que esto esté más dedicado a SO, pero podría usar el color para realizar esos cálculos:

% matplotlib inline

import numpy as np
import pylab

import colour
from colour.plotting import *

# Conversion from RGB to chromaticity coordinates.
# Defining RGB values for reference.
RGB_r = np.array([1, 0, 0])
RGB_g = np.array([0, 1, 0])

# We assume they are encoded in *sRGB* colourspace.
XYZ_r = colour.sRGB_to_XYZ(RGB_r, apply_EOCF=False)
XYZ_g = colour.sRGB_to_XYZ(RGB_g, apply_EOCF=False)

# Conversion to chromaticity coordinates.
xy_r = colour.XYZ_to_xy(XYZ_r)
print(xy_r)
# [ 0.64  0.33]

xy_g = colour.XYZ_to_xy(XYZ_g) 
print(xy_g)
# [ 0.3  0.6]


# Conversion to CIE xyY in order to maintain Luminance ratios.
# Using sRGB Luminance ratios, second row of the NPM.
xyY_r = [0.64, 0.33, colour.sRGB_COLOURSPACE.RGB_to_XYZ_matrix[1, 0]]
xyY_g = [0.3, 0.6, colour.sRGB_COLOURSPACE.RGB_to_XYZ_matrix[1, 1]]

xy_s = colour.XYZ_to_xy(
    colour.sRGB_to_XYZ(
        colour.XYZ_to_sRGB(colour.xyY_to_XYZ(xyY_r), apply_OECF=False) +
        colour.XYZ_to_sRGB(colour.xyY_to_XYZ(xyY_g), apply_OECF=False)))
print(xy_s)
# [ 0.41930366  0.50525886]

# Plotting.
RGB_colourspaces_CIE_1931_chromaticity_diagram_plot(
    ('sRGB', ),
    bounding_box=(-0.1, 0.9, -0.1, 0.9), 
    standalone=False)

pylab.plot(xy_r[0], xy_r[1], 'o', markersize=15, color=RGB_r)
pylab.plot(xy_g[0], xy_g[1], 'o', markersize=15, color=RGB_g)
pylab.plot(xy_s[0], xy_s[1], 'o', markersize=15, color=RGB_s)

Coordenadas de cromaticidad secundaria

Estoy corregido :-). Buen paquete de Python por cierto.
Gracias, parece prometedor, lo implementaré en C++, pero gracias por el código Python. ¿Podría explicar por qué deberíamos usar sRGB? También tengo datos de luminancia (cd/m2 o foot-lambert) ¿pueden ser útiles? para ser honesto, no entiendo la parte opcional donde sugieres convertir xy a xyY
Tengo problemas para ejecutar su código: Rastreo (última llamada más reciente): Archivo "C:/Users/Жека/PycharmProjects/SecondaryColors/colors.py", línea 6, en <módulo> de color.models.rgb.derivation import xy_to_z ImportError: ningún módulo llamado 'color.modelos.rgb.derivación'; 'colour.models.rgb' no es un paquete ¿Es xy_to_z solo 1 - x - y?
> ¿Podría explicar por qué deberíamos usar sRGB? Elijo sRGB porque tenemos envoltorios convenientes a su alrededor, pero en realidad podrías haber elegido cualquier espacio de color RGB ( XYZ_to_RGB, RGB_to_XYZ). > Para ser honesto, no entiendo la parte opcional en la que sugiere convertir xy en xyY Al usar solo las coordenadas de cromaticidad, no sabe qué es la Luminancia. Es posible que desee elegir un valor de Luminancia por coordenadas de cromaticidad que preserve las proporciones de la sensibilidad del sistema visual humano al brillo.
Pero esto es opcional, si tiene los valores de Luminancia, entonces es aún mejor. > Tengo problemas para ejecutar tu código Ah, sí, lo estoy ejecutando desde la última rama de desarrollo en Github: github.com/colour-science/colour
Por cierto, tenemos una sala Gitter (gitter.im/colour-science/colour), siéntete libre de entrar o enviarme un correo electrónico directamente para discutir más sobre eso, ya que la sección de comentarios lo hace muy inconveniente. :)
Los marcadores de longitud de onda no son claramente visibles cuando exporta el archivo para algún propósito. ¿Puedes mejorarlo para que pueda ser útil para el propósito?
@vishal: Simplemente cambie el colorargumento en las tres últimas líneas ( pylab.plot(xy_s[0], xy_s[1], 'o', markersize=15, color=RGB_s)) a lo que quiera: color='black', etc...