Эта короткая статья посвящена приблизительному описанию того, что происходит в моём инструменте для смешивания красок.

Инструмент предназначен для виртуального смешения красок, он содержит солвер, генерирующий рецепты для создания цвета из имеющихся красок. Инструмент поставляется с замеренными мной данными для красок Kimera. Он написан на Python 3; в репозитории есть все исходники, и если у вас есть дистрибутив Python, то его можно просто запустить. Также в репозитории есть исполняемый файл Windows, созданный при помощи PyInstaller (см. раздел Releases справа). Ещё я добавил версию для Mac; это файл .dmg и в нём что-то есть, а если нажать на него, инструмент запустится, так что, кажется, всё работает. Но, честно говоря, я редко пользуюсь Mac, поэтому мне сложно сказать, есть ли там всё нужное или требуется что-то ещё...

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

Ниже представлено более-менее полное описание его работы (и условия, при которых он не работает).

Введение

Недавно я открыл для себя раскрашивание миниатюр. Я никогда не увлекался WH40K или чем-то подобным, но у меня сохранились тёплые воспоминания об играх в настольные RPG. Просмотрев кучу видео на YouTube, я решил, что попробовать будет довольно легко. Я по-прежнему плохо справляюсь, но мне нравится успокаивающий процесс нанесения тонких слоёв краски на фигурки высотой 3 см.

В повседневной жизни я занимаюсь разработкой графики реального времени для видеоигр, поэтому быстро понял, что многие из проблем, с которыми я сталкиваюсь на работе, очень похожи на проблемы покраски миниатюр: ты анализируешь, как ведёт себя освещение, как оно взаимодействует с различными поверхностями, как его воспринимает глаз и так далее. Разумеется, раскрашивание — это не просто разработка, это Искусство (с большой буквы «И»), однако, похоже, в мире существует консенсус, что художники должны понимать этих технические аспекты, даже просто для того, чтобы знать, когда их намеренно нарушать.

На стыке миниатюр и компьютерной графики было множество тем, которые было бы интересно исследовать, но особенно сильно меня заинтересовали краски. Краски для миниатюр обычно имеют очень загадочные названия: Skrag Brown, Tombstone Horror и тому подобное. Лично я не против, но изготовители никогда не говорят, какие же это на самом деле краски. А когда у тебя мало опыта, бывает сложно понять, подойдёт ли конкретная краска в качестве полутона или окажется слишком тёмной. Во многих туториалах на YouTube говорят, какие именно краски используются, но чаще всего они берутся из разных линеек, некоторые из них легко достать, другие нет, а некоторые приходиться и ждать. А рисовать-то я хочу прямо сейчас! Мне показалось очевидным, что вместо покупки всех возможных красок логичнее будет выбрать какие-то базовые краски и научиться смешивать их, чтобы получить нужные цвета.

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

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

Примечание: да, я знаю, что на практике так никто не работает. Особенно если солвер даёт соотношения типа «88 частей белого, 3 части синего и 2 части жёлтого» — ты никак не смешаешь что-то подобное на влажной палитре, где работа ведётся крошечными объёмами краски. Но, по крайней мере, мне всё равно полезно знать, что по большей части это белый с небольшой долей синего и жёлтого, чтобы когда я смешивал их на палитре, это не происходило полностью вслепую. Да, если вы какое-то время будете заниматься покраской, то научитесь этому и выработаете интуитивное понимание, но для раскрашивания требуется много практики, поэтому если некоторые эксперименты можно проводить в цифровом виде, я обеими руками за. И, если уж быть откровенным, это больше интересный хобби-проект, чем что-либо иное.

Я решил описать всю теоретическую базу разработанного мной простого инструмента и дополнить её простым кодом на Python. Так как у меня появилось много свободного времени (заболел COVID) и я только что получил набор красок Kimera (однопигментных, поэтому невероятно насыщенных цветов, идеальных для смешивания), мне удалось потратить на это неделю. Статью могут читать люди, не имеющие технических знаний, так что я постарался объяснять всё простым языком и чтобы в ней была изложена вся необходимая информация. Не знаю, получилось ли у меня, но если что-то непонятно, то можете связаться со мной и спросить подробнее. На самом деле, в этом нет ничего особо сложного; по большей мере это математика и физика старших классов (но если у вас на них аллергия, предупреждаю: здесь будет математика).

Свет

Свет — электромагнитная волна, распространяющиеся колебания электрического и магнитного полей. Глаз человека чувствителен к длинам волн примерно от 400 до 700 нанометров, которые мы воспринимаем как цвета от фиолетового к синему, зелёному, жёлтому, оранжевому и красному.

Обычно достигающий наших глаз свет оказывается смешением множества различных длин волн. В зависимости от соотношения величин конкретных длин волн мы воспринимаем свет как разные цвета. Если он состоит в основном из коротких видимых длин волн, мы воспринимаем его синим. Если в основном из длинных, то красным. В целом всё обстоит так, а ниже представлены подробности.

Чтобы рассуждать об этих характеристиках более точно, можно использовать полезный инструмент — так называемое спектральное распределение излучения (spectral power distribution, SPD). Это функция, которая, грубо говоря, описывает величину конкретной длины волны в каком-то излучении. Обычно её отображают в виде графика, где длину волны откладывают на горизонтальной оси, а связанную с энергией величину — на вертикальной (то есть чем сильнее конкретная длина волны, тем выше график).

Например, «по большей части синий» свет может иметь подобное SPD:

А «по большей части красный» — больше похожее на такое:

Особо интересное семейство SPD — это распределения различных источников света. Можно взять любой источник света и замерить, какая величина излучаемого им света поступает от определённых длин волн. В физике есть понятие излучения чёрного тела, описывающее SPD абсолютно чёрного тела (такого, которое не отражает никакой цвет, только генерирует его), нагретого до определённой температуры (всё это напрямую привело к открытию квантовой механики и к тому миру, в котором мы живём сегодня; изучение спектров звёздного света привело к пониманию того, что далёкие звёзды вырабатывают энергию так же, как наше Солнце; линии, появляющиеся в спектрах возбуждённых газов, стали ещё одним катализатором эволюции квантовой механики а сдвиг в спектрах света из разных галактик привёл к открытию расширения Вселенной; и всё это благодаря спектру). Наверно, вы видели маркировки типа «свет 2700K», «свет 5000K»; это именно оно — описание цвета освещения как цвета, излучаемого чёрным телом указанной в Кельвинах температуре.

SPD стандартной лампы накаливания с ~2800K выглядит так:

а флуоресцентный свет ~4200K выглядит так:

SPD того, что мы считаем солнечным светом — это довольно сложное распределение, включающее в себя не только само SPD генерируемого Солнцем света, но и поглощение и рассеяние его части, происходящие при прохождении света через атмосферу. Так как солнечный свет в разное время суток проходит через разные объёмы атмосферы (меньше в полдень, больше вечером), SPD солнечного света также зависит от времени суток и атмосферных условий. В обычный солнечный день оно может выглядеть так:

Так как мы здесь занимаемся наукой, всё должно быть стандартизировано, измерено и выражено количественно. Поэтому CIE (Международная комиссия по освещению) представила «образцовые источники света» — множество SPD, описывающих крайне конкретные источники света. Стандартное излучение A — это стандартная лампочка с вольфрамовой нитью накала, чёрное тело-излучатель с температурой 2856K. Стандартные излучения B и C сегодня уже устарели; в основном используются стандартные излучения D. Существует целое их семейство; они описывают дневное освещение при различных условиях, от более «тёплого» (D50, D55) до «холодного» (D65, D70). Числа 50/55/65/70 приблизительно соответствуют температуре чёрного тела, испускающего свет схожего цвета (5000K, 5500K, 6500K, 7000K), но это обширная тема, не очень относящаяся к нашей. Существуют и другие стандартные излучения (например, E и F), но в наиболее практических ситуациях в основном интересны A, D50 и D65 (особенно последнее).

И последнее замечание, которое может показаться довольно очевидным, но в дальнейшем оно будет важно: поведение света линейно (математически). Если взять два источника света с двумя SPD и включить их одновременно, получившееся в результате освещение будет иметь SPD, представляющее сумму двух компонентов. Если сделать свет вдвое ярче, то получившееся SPD будет в два раза больше.

Отражение

Мы редко видим свет, испускаемый каким-то источником. Прежде чем попасть в глаза, он обычно отражается от предметов, и мы улавливаем этот непрямой, отражённый свет.

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

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

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

С точки зрения покраски миниатюр проще изучать взаимодействие света и материалов, разбив его на два компонента. Я назову их diffuse (рассеяние) и specular (зеркальность), потому что эти термины используются в компьютерной графике и я к ним привык.

Компонент specular отражения — это всё то, что происходит на границе между воздухом и объектом. Часть света отражается от неё. В общем случае он подчиняется законам отражения, так что угол между направлением падения света на объект и нормалью равен углу между направлением отражённого света и нормалью. Я говорю «в общем случае», потому что если поверхность неидеально гладкая, то свет будет рассеиваться в разных направлениях; чем шероховатее поверхность, тем рассеяннее он будет; но в общем случае он рассеивается в направлении отражения. Очень важный момент: в случае неметаллических материалов отражаемый таким образом свет не меняет своего цвета. Отражённый свет будет иметь то же SPD, что и падающий. Интересно, что такое поведение очень схоже для большинства неметаллов. Настолько, что в компьютерной графике мы часто работаем со всеми неметаллическими поверхностями одинаково: они могут быть шероховатыми или гладкими, но всё равно отражают одинаковое количество света, будь то пластик, кожа или бетон. Это очень хорошая аппроксимация. Металлы из-за своей атомарной структуры отличаются. Когда свет отражается от их поверхности в зеркальном (specular) отражении, он меняет цвет. Именно поэтому золото жёлтое, а медь оранжевая.

Компонент diffuse — это весь свет, падающий на объект, который потом выходит из него и в общем случае равномерно рассеивается во всех направлениях (точнее, так мы считаем для упрощения, это достаточно хорошая аппроксимация). Неважно, как мы смотрим на поверхность; её рассеянное освещение (diffuse) одинаково под всеми углами (в отличие от specular, которое сильно заметно только при взгляде под одним конкретным углом и не так сильно заметно под другими). Не весь попадающий в объект свет рассеивается. Часть его поглощается и превращается в тепло. Компонент diffuse сильно различается для металлов и неметаллов. Для неметаллов спектр отражённого света сильно зависит от объекта: в конечном итоге, свет попадает на поверхность, отражается и выходит, поэтому он передаёт некоторые из характеристик объекта. У металлов компонент diffuse отсутствует. Свет не выходит; он или поглощается, или отражается зеркально. Кроме того, строго говоря, компонент diffuse — это не «отражение», а, скорее, рассеяние, происходящее на короткие расстояния внутри материала. Иногда я для упрощения просто буду говорить «рассеянное отражение» (diffuse reflection).

Примечание: хотя можно безопасно считать diffuse reflection одинаковым во всех направлениях, его яркость всё равно зависит от величины света, падающего на конкретную часть объекта. И эта величина связана с углом между нормалью к поверхности и направлением относительно света: чем больше угол, тем меньше света получает конкретная часть объекта (на самом деле, количество света одинаково, она просто распределяется по большей поверхности, поэтому количество света на единицу площади становится меньше; это и считается яркостью). В физике это называется законом Ламберта. Во многих туториалах о покраске миниатюр люди говорят о затенении основных форм определённым образом: сферы имеют круглое затенение ближе к свету, цилинды имеют засветы вдоль оси, кубы/поверхности в общем случае имеют плоскую освещённость в зависимости от их ориентации. Это практическое применение закона Ламберта. У сфер нормали плавно меняются во всех направлениях, поэтому самыми яркими их областями будут те, которые направлены в сторону источника света. Нормали цилиндра меняются при движении по кругу, но одинаковы при движении вдоль оси, так что по всех длине цилиндр затенён одинаково. Плоские плоскости имеют постоянную нормаль, так что каждая точка получает одинаковое освещение.

(Примечание к примечанию: разумеется, это справедливо, только если мы предполагаем, что направление относительно света одинаково на всей поверхности! Но так ли это? Если рассматривать солнечный свет, то источник находится так далеко, что можно уверенно утверждать, что каждая точка получает свет с одного направления — это направленное освещение. Но в случае других источников важно и расположение света. А если источник света — не единственная точка, а что-то более крупное, то всё становится ещё сложнее).

В случае красок мы можем учитывать только компонент diffuse. Высыхая, краски для миниатюр становятся довольно матовыми, так что поверхность высохшей краски достаточно шероховата. Компонент specular отражения очень слаб и немного освещает поверхность светлым цветом, однако основные характеристики внешнего вида зависят от diffuse. Позже я представлю теории, описывающие происходящее со светом в слое краски, но пока мы можем рассматривать макроскопический эффект: свет с конкретным SPD падает на слой краски, часть его равномерно рассеивается по всех направлениях, а часть поглощается. Мы можем вычислить соотношение этого рассеянного света к падающему. Это называется коэффициентом отражения (reflectance); этот показатель, как и SPD — спектральная характеристика: объекты отражают разные длины волн по-разному. Некоторые длины волн больше отражаются, другие больше поглощаются. Именно этим определяется цвет объекта. Если объект поглощает короткие длины волн, отражая и рассеивая длинные, то он выглядит красноватым. Если он отражает короткие длины волн и поглощает длинные, то синеватым. Разумеется, это справедливо, если освещение равномерно во всех длинах волн. Если в падающем свете нет больших длин волн, а объект отражает только их, то он будет выглядеть не красным, а чёрным, потому что не отражает свет. Сам свет, рассеяние которого от объекта мы видим — это произведение коэффициента отражения и SPD падающего света:

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

Глаз

Следующий компонент всей системы — это глаз человека: свет, отражаемый от объектов, попадает в глаз, и мы можем его увидеть. Если сильно упростить, глаз фокусирует поступающий свет на сетчатке, содержащей светочувствительные клетки. Существует два семейства этих клеток: палочки и колбочки. Палочки сильнее всего реагируют на свет в зелёной части спектра, они отвечают за зрение в условиях слабого освещения и не вкладываются в цветное зрение, так что мы их опустим. За нашу способность видеть цвета отвечают колбочки. Люди, не имеющие цветовой слепоты, имеют три типа колбочек, обычно называемые L, M и S — сокращённо от long, medium и short. Они сильнее всего реагируют на свет с длинными (красными) длинами волн (L), средними (зелёными) длинами (M) и короткими (синими) (S).

Аналогично SPD и коэффициенту отражения объекта мы можем определить спектральную чувствительность. Она описывает силу реакции глаза (или любого датчика, камеры и тому подобного) на свет определённой длины волны. Она показывает, насколько сильно возбуждается данный тип колбочки, если видит свет определённой частоты — чем выше чувствительность, тем сильнее генерируемый колбочкой сигнал при получении одной и той же величины энергии. Вот графики чувствительности трёх различных типов колбочек.

Возбуждённая светом колбочка генерирует сигнал, но сама длина волны, вызвавшая это возбуждение, к делу не относится. Сигнал будет одинаков, если, допустим, колбочка M получает X энергии при длине 550 нм, 2X энергии при длине 500 нм или X энергии при 500 нм и X при 600 нм. Строго говоря, вся поступающая энергия на конкретной длине волны умножается на чувствительность датчика для этой длины волны и складывается (на самом деле интегрируется, но не будем усложнять) для всех длин волн, создавая сигнал клетки. Это приводит к интересному явлению под названием «метамерия»: разные распределения поступающего света могут выглядеть для глаза одинаково просто потому, что они генерируют в колбочках одинаковые возбуждения.

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

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

Всё это активно исследовалось учёными в начале двадцатого века. Измерять SPD различных источников света довольно просто; разделяем свет при помощи призмы или какой-нибудь дифракционной решётки и наблюдаем за радугой цветов. Измерять коэффициент отражения тоже достаточно легко: мы измеряем SPD какого-то источника, затем светим им на объект, замеряем SPD отражённого света и делим одно на другое. К сожалению, измерение чувствительности глаза — очень сложная задача. Как это сделать? Крайне трудно точно сказать, насколько конкретный свет ярче какого-то другого, в два или всего в полтора раза, особенно потому, что зрительная система человека невероятно сложна: кроме палочек и колбочек, в мозге происходит большой объём обработки, в том числе адаптация к свету, цвету и множеству других вещей (для этих воздействий тоже существуют модели, если хотите подробностей, прочитайте про Color Appearance Model, но это уже выходит за рамки нашей статьи). Однако умные люди нашли способ. Они спроектировали так называемые «эксперименты по сопоставлению цветов». (Подлинные уровни чувствительности глаза были замерены в 1950-х Рагнаром Гранитом, получившим за свои работы Нобелевскую премию.)

В экспериментах по сопоставлению цветов человеку показывали цвет на одной стороне экрана. Это был чистый цвет, генерируемый светом очень узкого диапазона длин волн. Испытуемому нужно было составить этот цвет, смешав три «базовых» цвета на другой части экрана — тоже чистые цвета конкретных длин волн (выбраны были красный, зелёный и синий, потому что было уже известно, что на них клетки глаза реагируют сильнее всего). Так как не каждый чистый цвет можно составить смешением этих трёх базовых цветов, исследователи добавили опцию прибавления цвета к целевому цвету, что, по сути, действовало как отрицательный вес смешивания. Показывая испытуемым цвета всех длин волн видимого света, исследователи замерили, какая яркость этих трёх базовых цветов нужна, чтобы получить ощущение того же цвета.

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

Полученные в эксперименте кривые назвали кривыми r/g/b. Эксперименты проводили в 1920-х, а в то время отрицательные числа было очень сложно использовать в числовых расчётах. Но поскольку не все цвета можно получить аддитивным смешением, некоторые цвета требовали добавления света к целевому цвету, из-за чего некоторые значения этих кривых оказались отрицательными. Поэтому та же самая CIE, которая стандартизовала излучения, решила, что стоит математически преобразовать эти кривые, чтобы они всегда были положительными. Это будет обозначать смешение неких воображаемых источников света, которых на практике существовать не может. Это означало, что некоторые сочетания чисел описывают цвета, которых не может быть, но такое решение посчитали хорошим компромиссом, чтобы избавиться от отрицательных значений. Кроме того, Комиссия хотела, чтобы одно из чисел обозначало общую «яркость» цвета (соответствующую реакции палочек). Поэтому она сотворила математическую магию и на основании кривых r/g/b сформулировала кривые X/Y/Z.

И эти кривые X/Y/Z стали основой современной колориметрии. Они и сегодня используются для описания во всех научных и технических сферах. Они образуют основу цветового пространства XYZ, в котором каждый цвет имеет три значения X/Y/Z, где значение Y — это значение яркости цвета. Кривые X/Y/Z ведут себя точно так же, как спектральная чувствительность, однако описывают не чувствительность клеток в наших глазах, а некие абстрактные математические значения чувствительности, не описывающие ничего конкретного (впрочем, кривая Y действительно описывает общую чувствительность глаза к яркости). Но поскольку это просто какие-то числа, на самом деле это ничего не меняет; всё это всё равно некая абстрактная математика.

Мы перешли от непрерывного спектра видимого света к трём числам, с которыми можно выполнять операции. Можно взять свет с цветом XYZ1 и добавить его к свету с цветом XYZ2, получив цвет (X1 + X2), (Y1 + Y2), (Z1 + Z2). Можно взять свет с цветом XYZ1 и сделать его в два раза сильнее, получив цвет 2*X1, 2*Y1, 2*Z1. Это называется цветовым пространством. Строго говоря, не совсем корректно перемножать компоненты — допустим, хранить коэффициент отражения как XYZ и умножать его на XYZ света, но на самом деле это работает достаточно неплохо (посмотрите на большинство современных спецэффектов или видеоигр; мы делаем это постоянно. Единственный коммерческий рендерер, работающий с настоящими спектральными величинами и делающий это корректно — это Manuka компании Weta, использованный во франшизах «Аватар», «Планета обезьян» и других фильмах).

Забавный факт: вы можете подумать, что кривые были получены в результате масштабных исследований с тысячами добровольцев. Но на самом деле это далеко от реальности. Изначальные эксперименты проводились двумя людьми: Уильямом Дэвидом Райтом с десятью наблюдателями и Джоном Гилдом с семью наблюдателями. Да, вся современная колориметрия основана на том, что увидели 17 человек в 1920-х годах; скорее всего, это были друзья и родственники двух джентльменов.

Позже в эти кривые вносились некоторые изменения; наиболее примечательным стало наблюдение под углом 10 градусов, введённое в 1964 году (против изначального стандартного наблюдения под углом 2 градусов 1931 года): позже исследователи осознали, что из-за адаптации зрительной системы логичнее было бы, чтобы тестовые области занимали бОльшую часть области обзора; поэтому они провели новые эксперименты и создали новые, слегка отличающиеся кривые. Тем не менее, двухстепенные кривые 1931 года всё равно сегодня используются чаще всего.

Все цветовые пространства, используемые в современных областях применения, выведены из XYZ. Некоторые из них стали просто линейным преобразованием XYZ, то есть отдельные компоненты просто умножили на какие-то константы и прибавили их в разных сочетаниях (like sRGB), другие же включают в себя нелинейные операции (вычисление степеней или деление выражений с участием XYZ), чтобы сделать значения более «перцептивно равномерными». В таких пространствах различия в числах описывают схожие изменения в настоящих воспринимаемых цветах (например, так сделано в цветовом пространстве LAB).

Из XYZ выведено два важных цветовых пространства: Yxy и sRGB. Первое использует Y для описания яркости, а xy (это X/(X+Y+Z) и Y/(X+Y+Z)) описывают цветность, то есть просто оттенок и насыщенность цвета. Зачастую все видимые цвета визуализируют в плоскости xy в виде визуального локуса — пространства всех цветов, которые могут видеть люди. Это удобный способ визуализации гамм: подмножеств видимого цвета, которые можно создать определённым образом на экране или при печати.

sRGB — это подмножество XYZ, широко используемое в современных дисплейных технологиях. Оно определяет три основных цвета (R, G, B), используемых для описания остальных цветов, а также задаёт «точку белого», считающуюся белым цветом. Основные цвета выбраны таким образом, чтобы их можно было физически реализовать технически доступным образом. Однако диапазон цветов, который можно представить в sRGB, довольно ограничен, потому что оно использует эти базовые цвета и не позволяет применять отрицательные веса; мониторы излучают свет, а не поглощают его. Иронично, что визуальный локус вмещает в себе все возможные цвета, но при отображении на стандартном экране не может отобразить широкий диапазон этих цветов. Хотя sRGB превалирует в промышленности, его постепенно заменяют стандартами с более широкими гаммами, например Rec2020 в современных HDR-дисплеях. Важно отметить, что значения RGB применимы только в контексте конкретного цветового пространства и их нельзя напрямую преобразовывать между разными пространствами. Например, многие камеры могут делать снимки в Adobe RGB, имеющем чуть более широкую гамму, чем sRGB. Для точного отображения этих цветов на стандартном мониторе их необходимо при помощи дополнительных вычислений преобразовать в sRGB. Для этого в пакетах наподобие Photoshop используются цветовые профили, позволяющие указывать цветовое пространство, в котором вы работаете, и цветовое пространство изображений на входе; все необходимые преобразования выполняет ПО.

Цветовое пространство CMYK, обычно используемое при печати, не может точно описать общий цвет света. Оно было спроектировано для описания коэффициента отражения, а не излучения света. Если точнее, цвета CMYK требуют определения конкретного излучения и того, как отдельные компоненты поглощают и отражают свет. На самом деле это не совсем цветовое пространство, а больше цветовая модель — способ обработки цвета, а не точная математическая методика для определения цветов и операций с ними.

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

Чтобы определить цвет краски и отобразить его на экране, нужно выполнить следующий процесс:

  • Взять спектральные значения излучения D65 (это общедоступные табличные данные).

  • Умножить их на спектральную отражательную способность краски.

  • Умножить результат на кривые X, Y и Z (тоже общедоступные).

  • Сложить (интегрировать) спектральные значения по всем длинам волн, чтобы получить значения X, Y, Z света, отражённого от слоя краски.

  • Преобразовать значения XYZ в sRGB при помощи простых вычислений и отобразить их на экране.

Можно заметить, что из-за этой интеграции между длинами волн мы не можем вернуться назад: многие различные спектральные распределения могут дать одинаковые значения XYZ (упоминавшееся выше явление метамерии). То есть имея значения sRGB, мы не сможем напрямую получить снова полный спектр. Однако нам бы хотелось обойти это ограничение, так что во второй части мы попробуем найти способ решить эту проблему.