Как рассчитать координаты для вторичных цветов на диаграмме цветности CIE? - Фотопедия
6 голосов
/ 01 марта 2016

Представьте типичную гамму устройств на диаграмме CIE xy:

enter image description here

x и y координаты для основных цветов (красный, зеленый и синий) определены и известны, как рассчитать вторичные цвета (голубой, пурпурный и желтый)?

1 Ответ

6 голосов
/ 01 марта 2016

Выполнение операции непосредственно с использованием координат цветности (т. Е. Взятие средней точки между двумя координатами цветности) приведет к неверным результатам, поскольку диаграмма цветности весьма неоднородна.

Если вы используете линейные значения освещенности, вы можете выполнить следующую цепочку вычислений:

  • CIE xy - CIE xyY (необязательно) для каждой пары координат цветности, где значение яркости Y извлекается из нормализованной первичной матрицы sRGB. Важно признать, что когда вы используете только координаты цветности, у вас нет информации о яркости, которая также может привести к неожиданным результатам.
  • CIE xy - CIE XYZ для каждой пары координат цветности
  • от CIE XYZ до sRGB для каждой пары значений трехлистников
  • sRGB добавьте вашей пары значений RGB
  • от sRGB до CIE XYZ из полученных вами значений RGB
  • CIE XYZ - CIE xy

Теперь это, вероятно, больше предназначено для SO, но вы можете использовать color для выполнения этих вычислений:

% 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)

Secondary Chromaticity Coordinates

...