Выполнение операции непосредственно с использованием координат цветности (т. Е. Взятие средней точки между двумя координатами цветности) приведет к неверным результатам, поскольку диаграмма цветности весьма неоднородна.
Если вы используете линейные значения освещенности, вы можете выполнить следующую цепочку вычислений:
- 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](https://i.stack.imgur.com/Q3x4Q.png)