Как определить, находится ли цвет xyY в гамме CIE 1931?

Я пытаюсь построить цветовую гамму CIE 1931, используя математику.

Я беру цвет xyY с Y, установленным на 1,0, затем меняю x и y от 0.0 до 1.0.

Если я нанесу результирующие цвета как изображение (т. Е. Пиксель в точке (x, y) - это мой цвет xyY, преобразованный в RGB), я получу красивую картинку с цветовой гаммой CIE 1931 где-то посередине, например:

xyY от 0,0 до 1,0:

образ

Теперь мне нужно классическое изображение в форме языка, поэтому мой вопрос: как отбраковать пиксели за пределами диапазона цветовой гаммы CIE 1931?

то есть. Как я могу определить, находится ли мой цвет xyY внутри / вне цветовой гаммы CIE 1931?

1 ответ

Решение

Вы можете использовать цвет и colour.is_within_visible_spectrum определение:

>>> import numpy as np
>>> is_within_visible_spectrum(np.array([0.3205, 0.4131, 0.51]))
array(True, dtype=bool)
>>> a = np.array([[0.3205, 0.4131, 0.51],
...               [-0.0005, 0.0031, 0.001]])
>>> is_within_visible_spectrum(a)
array([ True, False], dtype=bool)

Обратите внимание, что в этом определении ожидаются значения CIE XYZ tristimulus, поэтому вам придется преобразовать значения цвета CIE xyY в XYZ, используя colour.xyY_to_XYZ определение.

Я столкнулся с этим вопросом, когда искал немного другую, но связанную проблему, и что сразу бросилось в глаза, так это рендеринг вверху. Он идентичен рендерингу, который я произвел несколькими часами ранее, и отчасти я попытался выяснить, почему он не имел смысла.

Для читателей: рендеринг - это результат преобразования из {x ∈ [0, 1], y ∈ [0, 1], Y = 1} к XYZпреобразовать этот цвет в sRGB, а затем закрепите отдельные компоненты [0, 1].

На первый взгляд все нормально. На второй взгляд это выглядит нечетко... кажется, менее насыщенным, чем ожидалось, и есть видимые линии перехода под странными углами. При ближайшем рассмотрении становится ясно, что основные цвета не переходят плавно друг в друга. Большая часть диапазона, например, между красным и синим, просто пурпурным - обаR а также Bсоставляют 100% практически на всем расстоянии между ними. Когда вы затем добавляете флажок, чтобы пропустить рисование любых цветов, которые имеют компонент вне диапазона, вместо зажима все исчезает. Это все за пределами гаммы. Так что же происходит?

Я думаю, что я разобрался с этой маленькой частью колориметрии, по крайней мере, на 80%, поэтому я излагаю ее в значительно упрощенном виде для назидания всех, кто может найти это интересным или полезным. Я тоже пытаюсь ответить на вопрос.

Раскрашивание диаграммы цветности

Диаграмма цветности xy - это не просто срез xyYКосмос. По сути, он двухмерный. Точка вxyПлоскость представляет собой цветность отдельно от яркости, поэтому в той степени, в которой там есть цвет, она должна как можно лучше представлять только цветность, а не какой-либо конкретный цвет. Обычно цвета кажутся самыми яркими, наиболее насыщенными для этой цветности или чего-то другого, что ближе всего к цветовому пространству дисплея, но это произвольное дизайнерское решение.

То есть: в той степени, в которой нарисованы иллюстративные цвета, они обязательно вымышлены, во многом так же, как раскраска избирательной карты - это чисто вопрос визуализации данных: удобство для облегчения понимания. Просто в данном случае мы используем цвета для визуализации одного аспекта колориметрии, поэтому очень легко объединить эти две вещи.

(Изображение предоставлено Майклом Хорватом)

Ложность и необходимость цветов становится очевидной, если мы рассмотрим полную трехмерную форму видимого спектра в xyYКосмос. Классический спектральный локус ("подкова") можно легко увидеть как основание квазигибральтианского объема, самого широкого в спектральном локусе и сужающегося к вершине (белая точка) в точке.{Y = 1}. Если рассматривать проекцию сверху вниз, то цвета, расположенные на спектральном локусе и рядом с ним, будут очень темными (хотя все еще самым ярким из возможных цветов для этой цветности) и будут становиться все более яркими к центру. Если рассматривать как кусокxyY объем, через определенное значение Y, цвета будут одинаково яркими, но в целом станут ярче, а форма границы будет уменьшаться, опять же неравномерно, с увеличением Y, пока он полностью не исчез. Насколько я могу судить, ни одна из этих возможностей не имеет большого практического применения, если вообще имеет вообще, хотя они могут быть интересными.

Вместо этого диаграмма раскрашена наизнанку: отображаемая гамма раскрашена с максимальной интенсивностью (каждый основной цвет имеет максимальную яркость, а затем линейные смеси внутри), а цвета вне гаммы проецируются из треугольника внутренней гаммы в спектральную. локус. Это раздражает, потому что вы не можете просто использовать матричное преобразование, чтобы повернуть точку наxy плоскость в разумный цвет, но с точки зрения передачи полезной и в некоторой степени точной информации, это кажется, к сожалению, неизбежным.

Рисование спектрального локуса

Самый простой способ получить характерную форму подковы - это просто использовать таблицу эмпирических данных.

(http://cvrl.ioo.ucl.ac.uk/index.htm, прокрутите вниз и найдите "исторические" наборы данных, которые будут наиболее точно соответствовать другим источникам, предназначенным для непрофессионала. Их слишком умная схема значков для выбора данных такова, что значок с пунктирной линией - для данных, отобранных при 5 нм, значок сплошной линии - для данных, отобранных на 1 нм.)

Постройте путь с точками в качестве вершин (вы можете захотеть обрезать верхнюю часть, я сократил ее до 700 нм, основной красный цвет CIERGB) и используйте полученную форму в качестве маски. С образцами 1 нм полилиния должна быть достаточно гладкой для почти любого разрешения: нет необходимости подгонять кривые Безье или еще много чего.

(Примечание: только каждый 5-й пункт показан в иллюстративных целях.)

Если все, что нам нужно, это нарисовать стандартную подкову, ограниченную треугольником {x = 0, y = 0}, {0, 1}, а также {1, 0}тогда этого должно хватить. Обратите внимание, что мы можем сэкономить время рендеринга, пропустив любые координаты, гдеx + y >= 1. Если мы хотим делать более сложные вещи, например, строить изменяющуюся границу для разныхYзначений, то мы говорим о функциях сопоставления цветов, которые определяютXYZ Космос.

Функции согласования цветов

(Изображение предоставлено пользователем:Acdx - собственная работа, CC BY-SA 4.0)

Основная правда для XYZпространство имеет форму трех функций, которые отображают спектральные распределения мощности в{X, Y, Z} трехцветные значения. Для построения модели потребовалось много данных и расчетов.XYZ пространство, но все это запекается в этих трех функциях, которые однозначно определяют {X, Y, Z}значения для данного спектра света. Фактически, функции определяют 3 воображаемых основных цвета, которые не могут быть созданы с помощью какого-либо реального светового спектра, но могут быть смешаны вместе для создания воспринимаемых цветов. Поскольку они могут быть смешаны, каждая неотрицательная точка вXYZ Пространство имеет математическое значение, но не каждая точка соответствует реальному цвету.

Сами функции фактически определены как справочные таблицы, а не как уравнения, которые можно точно вычислить. Лаборатория науки о цвете Манселла (https://www.rit.edu/science/munsell-color-lab) предоставляет образцы с разрешением 1 нм: прокрутите вниз до раздела "Полезные данные о цвете" в разделе "Образовательные ресурсы". К сожалению, это в формате Excel. Другие источники могут предоставить данные 5 нм, и что-либо более точное, чем 1 нм, вероятно, является современной реконструкцией, которая может не соответствовать пространству 1931 года.

(Для интереса: этот документ - http://jcgt.org/published/0002/02/01/ - предоставляет аналитические аппроксимации с ошибкой в ​​пределах изменчивости исходных данных о человеке, но в основном они предназначены для конкретных случаев использования. Для наших целей предпочтительнее и проще придерживаться эмпирически отобранных данных.)

Функции называются , , а также (или x bar, y bar, а также z barВ совокупности они известны как стандартный наблюдатель 2 степени CIE 1931 года. Есть отдельный стандартный наблюдатель 1964 года, построенный из более широкого поля зрения 10 градусов с небольшими отличиями, который может использоваться вместо стандартного наблюдателя 1931 года, но который, возможно, создает другое цветовое пространство. (Стандартный наблюдатель 1964 года не следует путать с отдельным цветовым пространством CIE 1964).

Чтобы вычислить трехцветные значения, вы берете внутреннее произведение (1) спектра цвета и (2) функции согласования цветов. Это просто означает, что каждая точка (или образец) в спектре умножается на соответствующую точку (или образец) в функции согласования цветов, которая служит для повторного взвешивания данных. Затем вы берете интеграл (или суммирование, точнее, поскольку мы имеем дело с дискретными выборками) по всему диапазону видимого света ([360 нм, 830 нм].) Функции нормализуются так, чтобы они имели равную площадь под своими кривыми., поэтому равный энергетический спектр (выборочное значение для каждой длины волны одинаковое) будет иметь{X = Y = Z}. (FWIW, данные Munsell Color Lab правильно нормализованы, но они в сумме составляют 106 и по какой-то причине изменяются.)

Еще раз взглянув на трехмерный график xyY пространства, мы снова замечаем, что знакомая форма спектрального геометрического места кажется формой объема в {Y = 0}, т.е. когда эти цвета на самом деле черные. Теперь в этом есть какой-то смысл, так как это монохроматические цвета, а их спектр должен состоять из одной точки, и поэтому, когда вы берете интеграл по одной точке, вы всегда получаете 0. Однако тогда возникает вопрос: как они вообще имеют цветность, если две другие функции также должны быть равны 0?

Самое простое объяснение состоит в том, что Yв основании формы на самом деле чуть больше нуля. Использование выборки означает, что спектры монохроматических источников не считаются мгновенными значениями. Вместо этого это узкие полосы спектра, близкие к их длинам волн. Вы можете сколь угодно близко приблизиться к мгновенному и все же ожидать значимой цветности в пределах точности, поэтому предел, когда ширина полосы дискретизации достигает 0, является идеальным спектральным локусом, даже если он исчезает ровно в 0. Однако спектральный год как фактически производное вычисляется только на основе одновыборочных значений для, , а также функции согласования цветов.

Это означает, что вам действительно нужен только один набор данных - таблицы поиска для , , а также . Спектральный годограф можно вычислить для каждой длины волны, просто разделивx̅(wl) а также y̅(wl) от x̅(wl) + y̅(wl) + z̅(wl).

(Изображение предоставлено Apple, снимок экрана из утилиты ColorSync)

Иногда вы увидите подобный график, с драматически изогнутой линией цвета радуги, поднимающейся вверх и вокруг графика, а затем снова снижающейся до 0 в дальнем красном конце спектра. Это просто функция, построенная вдоль спектрального годографа, масштабированная так, чтобы y̅ = Y. Обратите внимание, что это не контур трехмерной формы видимой гаммы. Такой контур будет находиться внутри спектрального локуса в сине-зеленом диапазоне, если его построить в двух измерениях.

Обозначение видимого спектра в пространстве XYZ

Последний вопрос: с учетом этих трех функций сопоставления цветов, как мы можем использовать их, чтобы решить, {X, Y, Z} находится в пределах цветового восприятия человека?

Полезный факт: не может быть светимости самой по себе. Любой реальный цвет также будет иметь ненулевое значение для одной или обеих других функций. Мы также знаемY по определению имеет диапазон [0, 1], поэтому на самом деле мы говорим только о том, {X, Z} действительно для данного Y.

Теперь возникает вопрос: какие спектры (упрощенные для наших целей: массив из 471 значений, 0 или 1, для длин волн [360 нм, 830 нм], ширина полосы 1 нм), при взвешивании , в сумме составит Y?

В XYZпространство аддитивно, как и RGB, поэтому любой немонохроматический свет эквивалентен линейной комбинации монохроматических цветов с различной интенсивностью. Другими словами, любая точка внутри спектрального локуса может быть создана некоторой комбинацией точек, расположенных точно на границе. Если вы возьмете монохроматические основные цвета CIE RGB и просто сложите их трехцветные значения, вы получите белый цвет, а спектр этого белого будет просто спектром трех наложенных основных цветов, тонкой полосой на длине волны для каждого основного цвета.

Из этого следует, что все возможные комбинации монохроматических цветов находятся в пределах диапазона человеческого зрения. Однако есть масса совпадений: разные спектры могут давать один и тот же воспринимаемый цвет. Это называется метамеризмом. Таким образом, хотя может быть непрактично перечислять все возможные индивидуально воспринимаемые цвета или спектры, которые могут их произвести, на самом деле относительно легко вычислить общую форму пространства из тривиально перечислимого набора спектров.

Что мы делаем, так это шагаем по длине волны гаммы за длиной волны, и для этой длины волны мы итеративно суммируем все большие срезы спектра, начиная с этой точки, пока мы не достигнем нашего Yцель или выход за пределы спектра. Вы можете представить это как движение по кругу, рисование все более крупных дуг из одной начальной точки и нанесение центра получившейся формы - когда вы дойдете до дуги, которая представляет собой всего лишь полный круг, центры совпадают, и вы получаете белый цвет, но до тех пор точки, которые вы наносите, будут закручиваться по спирали внутрь от края. Повторите это для каждой точки на окружности, и у вас будут точки, закручивающиеся по спирали вдоль всех возможных путей, покрывая всю гамму. Вы действительно можете иногда видеть это спиралевидное движение на графиках трехмерного цветового пространства.

На практике это принимает форму двух циклов: внешний цикл идет от 360 до 830, а внутренний цикл идет от 1 до 470. В моей реализации то, что я сделал для внутреннего цикла, - это сохранить текущее и последнее суммированные значения, и как только сумма превышает целевое значение, я использую разницу для вычисления дробного количества полос и вставляю счетчик внешнего цикла и эту интерполированную ширину в массив, а затем выхожу из внутреннего цикла. Интерполяция полос значительно сглаживает кривые, особенно на носу.

Когда у нас есть набор спектров нужной яркости, мы можем вычислить их X а также Zценности. Для этого у меня есть высший заказsummationфункция, которой передаются функция для суммирования и интервал. Оттуда форма гаммы на диаграмме цветности для этогоY это просто путь, образованный производным {x, y} координаты, поскольку этот метод перечисляет только поверхность гаммы без внутренних точек.

По сути, это более простая версия того, что делают библиотеки, подобные упомянутой в принятом ответе: они создают трехмерную сетку путем исчерпания пространства непрерывного спектра, а затем интерполируют между точками, чтобы решить, находится ли точный цвет внутри или за пределами гаммы.. Да, это довольно грубый метод, но он простой, быстрый и достаточно эффективный для демонстрационных целей и визуализации. Визуализация 20-ступенчатого контурного графика общей формы цветного пространства в браузере выполняется мгновенно, например, с почти идеальными кривыми (есть пара мест, где неточность не может быть полностью устранена: два углы возле оранжевого обрезаются, а нос{Y = 0.05}немного волнистый. Неясно, сможет ли подход с использованием сетки сначала избежать этих мелких дефектов.)

Вывод

Конечно, это своего рода высокотехнологичная и подверженная ошибкам проблема (PPP), которую лучше всего передать на аутсорсинг качественной сторонней библиотеке. Однако знание основных методов и научных знаний, лежащих в основе этого, демистифицирует весь процесс и помогает нам эффективно использовать эти библиотеки и адаптировать наши решения по мере изменения потребностей.

Другие вопросы по тегам