Главная » Хабрахабр » [Перевод] Цвет: от шестнадцатеричных кодов до глаза

[Перевод] Цвет: от шестнадцатеричных кодов до глаза

Почему мы воспринимаем background-color: #9B51E0 как этот конкретный фиолетовый цвет?

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

В противном случае начнём с физики.
Радиоволны, микроволны, инфракрасное излучение, видимый свет, ультрафиолет, рентгеновские лучи и гамма-излучение — всё это формы электромагнитного излучения. Хотя они называются по-разному, но эти названия просто обозначают различные диапазоны длин волн в электромагнитном спектре.


Электромагнитный спектр

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

Давайте внимательнее посмотрим на излучение лампы накаливания. Чтобы понять цвет, нужно сначала понять излучение.


Фото: Alex Iby

Поток излучения ($\Phi_e$) объекта — это общая энергия, излучаемая в секунду, которая измеряется в ваттах. Мы можем задать вопрос, сколько энергии излучает лампа. Поток излучения стоваттной лампочки накаливания составляет около 80 Вт, а оставшиеся 20 Вт напрямую преобразуются в неизлучаемое тепло.

Спектральная плотность излучения ($\Phi_$) объекта — это поток излучения на единицу длины волны. Если мы хотим узнать, сколько энергии приходится на каждый волновой диапазон, то можно посмотреть на спектральную плотность излучения. Как правило, она измеряется в ваттах/нанометр.

Если изобразить спектральную плотность излучения нашей лампочки накаливания как функцию длины волны, то она будет выглядеть примерно так:

В виде уравнения: $\Phi_e = \int_0^\infty \Phi_{e,\lambda}(\lambda) d\lambda$. Площадь области, ограниченной этой кривой, соответствует потоку излучения. В данном случае площадь области соответствует примерно 80 Вт.

$\Phi_{e}^{\text{bulb}} = \int_0^\infty \Phi_{e,\lambda}^\text{bulb}(\lambda) d\lambda = 80\text{W}$

Возможно, вы слышали из рекламы защитников природы, что лампочки накаливания крайне неэффективны и думаете: «Хм, 80% не кажется таким уж плохим КПД».

Лампочка накаливания — весьма эффективный способ преобразования электричества в излучение. И это правда. К сожалению, это ужасный способ преобразования электричества в видимое человеком излучение.

Видимый свет находится в диапазоне длин волн от $\lambda = 380\text{nm}$ до $\lambda = 750\text{nm}$. На графике для лампы накаливания это затенённая область, показанная ниже.

7W$" data-tex="display"/> <img src="https://habrastorage.org/getpro/habr/formulas/613/fb1/3b7/613fb13b71febee64c3eedafc2218cac.svg" alt="$\int_{380 \text{nm}}^{750 \text{nm}} \Phi_{e,\lambda}^\text{bulb}(\lambda) d\lambda = 8.

Итак, в видимом диапазоне излучается 8,7 Вт, что даёт нам КПД в 8,7%. Выглядит ужасно. На самом деле ситуация ещё хуже.

Чтобы понять почему, давайте рассмотрим, почему видимый свет является видимым.


Фото: Christopher Burns

Если измерить чувствительность человеческого глаза к каждой длине волны, то мы получим функцию относительной спектральной световой эффективности монохроматического излучения. Так же как лампа накаливания не одинаково излучает на всех длинах волн, наши глаза тоже не одинаково чувствительны к излучению во всех диапазонах. Стандартная функция спектральной световой эффективности $\bar y(\lambda)$ выглядит так:

Мы не увидим ничего за пределами этого диапазона, потому что наши глаза не воспринимают этот свет! Границы этой функции определяют диапазон видимого света.

Данная кривая также показывает что наши глаза намного более чувствительны к излучению на 550 нм, чем к излучению на 650 нм или 450 нм.

Птицы могут видеть в ультрафиолете излучение в диапазоне от $\lambda=300\text{nm}$ до $\lambda=400\text{nm}$, поэтому если бы учёные птицы писали научные статьи об электромагнитном спектре, именно эту часть диапазона они бы назвали «видимым светом»! Глаза других животных чувствительны к другим диапазонам волн и, следовательно, для них действуют другие функции относительной спектральной световой эффективности.


Фото: Timothy Rhyne

Умножив график спектральной плотности излучения на функцию относительной спектральной световой эффективности монохроматического излучения $\bar y(\lambda)$, мы получим функцию, которая описывает вклад каждой длины волны, излучаемой источником света, в воспринимаемую человеком яркость.

Чтобы подчеркнуть связь с человеческим восприятием, а не объективной мощностью, световой поток измеряется в люменах, а не ваттах, с коэффициентом преобразования 683,002 лм/вт. Это спектральная плотность светового потока ($\Phi_{v,\lambda}$).

002 \frac{\text{lm}}{\text{W}} \cdot \bar y(\lambda) \cdot \Phi_{e,\lambda}(\lambda)$" data-tex="display"/> <img src="https://habrastorage.org/getpro/habr/formulas/eac/631/5a6/eac6315a61f8114dcedd92cea43e349c.svg" alt="$\Phi_{v,\lambda}(\lambda) = 683.

Световой поток ($\Phi_v$) от источника света — это общая воспринимаемая человеком сила света.

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

002 \frac{\text{lm}}{\text{W}} \cdot 2. $\Phi_{v}^\text{bulb} = \int_0^\infty \bar y(\lambda) \cdot \Phi_{e,\lambda}^\text{bulb}(\lambda) d\lambda = 683. 4\text{W} \approx 1600 \text{lm}$

Так что световой поток нашей стоваттной лампы накаливания составляет жалкие 2,4 Вт или 1600 люмен! У лампы накаливания световая эффективность всего 2,4%, что далеко от эффективности 80% преобразования электроэнергии в излучение.

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

Если у ламп накаливания эффективность 1-3%, то у люминесцентных ламп она около 10%, а у светодиодных — до 20%! И действительно, люминесцентные и светодиодные лампы тратят гораздо меньше энергии в невидимых человеку диапазонах.

Но хватит о яркости, вернёмся к теме статьи: цвет!


Фото: Lauren Mancke

Если передо мной лимон, как сказать по телефону, какого он цвета? Как идентифицировать данный цвет? Как точно идентифицировать каждый из этих оттенков жёлтого? Я могу сказать, что «лимон жёлтый», но какой именно жёлтый?

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


Монохроматические цвета по длинам волн

Если можно воспроизвести спектр, то мы точно воспроизведём цвет! Для любого данного объекта можно измерить спектр излучения (или отражения) — и использовать его для точного определения цвета.

У отражённого от точки на лимоне солнечного света может быть примерно такой спектр отражения:

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

Предположим, я сфотографировал лимон и загрузил фотографию на компьютер. Когда энергия с таким спектральным распределением попадает в глаз человека, он воспринимает её как «жёлтую». Потом тщательно настроил цвета на экране, чтобы конкретная точка лимона на экране не отличалась от цвета фактического лимона в моей реальной руке.

Разумно ожидать, что оно похоже на спектр отражения лимона выше. Если вы измерите распределение спектральной интенсивности с экрана, то как по-вашему оно будет выглядеть? Но на самом деле оно выглядит примерно так:

Два разных распределения спектральной интенсивности, выглядящие одинаково для наблюдателя-человека, называются метамерами.

Чтобы понять, как такое возможно, рассмотрим биологию глаза.


Фото: Аманды Далбьерн

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

Наличие трёх разных видов колбочек делает человека «трихроматом». У людей как правило три вида колбочек. У другие животных даже больше видов колбочек. Однако есть по крайней мере один подтверждённый случай человека-тетрахромата! У ротоногих — шестнадцать видов.

Стандартное обозначение — S, M и L (короткие, средние, длинные волны). Каждый тип колбочки обозначен по длинам световых волн, на которые он реагирует.

Наивысшая точка каждой кривой называется «пиковой длиной волны», указывая длину волны, к которой колбочка наиболее чувствительна. Три кривые показывают, насколько чувствительны колбочки определённого типа к каждой длине волны.

Посмотрим, как наши колбочки обработают свет, отражающийся от лимона в руке.

В данном случае нормализованные возбуждения колбочек S, M и L составляют 0,02, 0,12 и 0,16, соответственно. Ограниченные кривыми области показывают, какая часть отражённого от лимона излучения возбуждает каждый тип колбочек. Теперь повторим процесс для лимона на экране.

Вот почему точка на реальном лимоне и точка на цифровом лимоне для нас выглядят одинаково! Несмотря на совершенно разные спектры излучения, возбуждения колбочек одинаковы (S=0,02, M=0,12, L=0,16).


У метамер всегда будет равна нормализованная площадь под кривыми стимуляции трёх типов колбочек

Это довольно удобно, потому что с отдельными цифрами (0,02, 0,12, 0,16) гораздо проще работать, чем со сложной непрерывной функцией. Наши три набора колбочек сводят любую кривую спектральной плотности потока $\Phi_e(\lambda)$ к триплету чисел $(S, M, L)$, а каждый отдельный триплет $(S, M, L)$ будет отдельным цветом! Для любителей математики: наши глаза производят размерную редукцию из бесконечномерного пространства в три измерения — чертовски круто уметь бессознательно вытворять такое.

В реальности триплет $(S, M, L)$ — это наш первый пример цветового пространства.

Цветовые пространства позволяют численно определить цвет. В предыдущей главе мы видели, что определённый жёлтый цвет можно представить как (0,02, 0,12, 0,16) в цветовом пространстве SML, которое более известно как цветовое пространство LMS.

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

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

Например, координаты LMS (0, 1, 0). Во-первых, не все значения триплетов (также называемые цветовыми компонентами или координатами цвета) физически возможны. Но это невозможно, потому что кривая чувствительности колбочек M значительно перекрывает L или S на всех длинах волн! Чтобы выйти на эту координату, нужно как-то стимулировать колбочки М, при этом вообще не стимулируя колбочки L и S.


Любая длина волны, которая стимулирует колбочки M, также будет стимулировать колбочки типа L или S (или оба типа!)

Из-за такого побочного эффекта, в частности, данная цветовая модель не очень совместима с производством дисплеев. В итоге возникает проблема, что реально сложно увеличить стимуляцию только одного типа колбочек.

Первый значительный прогресс в этой области произошёл в конце 1920-х. Другая историческая, практическая проблема заключается в том, что точной чувствительности колбочек не знали до 1990-х годов, а необходимость разработки математически точной модели цвета возникла намного раньше.

В конце 1920-х годов Уильям Дэвид Райт и Джон Гилд провели эксперименты. Они точно определили отдельные цвета по вкладу трёх конкретных длин волн.

Хотя они, вероятно, не знали о трёх типах колбочек на сетчатке, но ещё за сто лет до них возникла идея, что все видимые цвета можно представить как комбинацию трёх цветов.


Пример трёхцветной теории цвета Чарльза Хейтера, 1826 год

Установка выглядела примерно так: У Райта и Гилда появилась идея построить аппарат, который позволит испытуемым определять тестовый цвет как комбинацию от трёх источников света с фиксированной длиной волны.

Экспериментатор настраивал лампу внизу на определённую длину волны, (например, 600 нм), а затем просил испытуемых отрегулировать питание трёх контрольных ламп, чтобы цвет совпадал.

После повторения этого эксперимента через каждые 5 нм примерно на десяти испытуемых, был создан график, показывающий количество красного (700 нм), зеленого (546 нм) и синего (435 нм) света, необходимого для восстановления внешнего вида цвета на заданной длине волны. Мощность каждой из трёх ламп (красный, зелёная и синяя) дают нам триплет чистых спектральных цветов, который соответствует 600 нм. Функции известны как функции сложения цветов (color matching function, CMF).

Эти конкретные функции сложения цветов известны как $\bar r(\lambda)$, $\bar g(\lambda)$ и $\bar b (\lambda)$.

00). Они дают чистый спектральный цвет, который ассоциируется с длиной волны 600 нм по $(R, G, B)$ координатам (0,34, 0,062, 0. Это значение цвета в цветовом пространстве CIE 1931 RGB.

Подождите, а что означают негативные значения функции?

Так что именно означает это −0,72? У чистых спектральных цветов, которые ассоциируются с цветом на длине волны 500 нм, координаты $(R, G, B)$ равны (−0,72, 0,85, 0,48).

Но можно достичь совпадения с двух сторон, если перенести красную лампу вниз. Оказывается, никакие параметры красной (700 нм) лампы вверху не позволяют достичь соответствия цвету 500 нм внизу, независимо от мощности синей и зелёной лампы вверху.

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

Используя наши функции сложения цветов, можно найти соответствие для любого монохроматического света с помощью сочетания (возможно, отрицательного) количества красного (700 нм), зелёного (546 нм) и синего (435 нм) света.

Возьмём тот же цвет лимона: Функции сложения цветов можно проанализировать так же, как мы анализировали чувствительность колбочек L, M и S.

Взяв области, ограниченные кривыми произведения спектральной кривой и функций сложения цветов, мы получили RGB-триплет (1,0, 0,8, 0,2), однозначно идентифицирующий данный цвет.

В то время как цветовое пространство $(L, M, S)$ позволяет точно определить цвет, цветовое пространство $(R, G, B)$ даёт способ его точно воспроизвести, за исключением цветов с отрицательной координатой.

А что насчёт неспектральных цветов? Но этот график показывает только какие спектральные цвета нельзя воспроизвести. Или циан (сине-зелёный цвет)? Можно ли произвести розовый цвет сочетанием R, G, B?

Чтобы ответить на эти вопросы, нам понадобится лучший способ визуализации цветового пространства.

До сих пор в большинстве диаграмм мы располагали длины волн по горизонтальной оси, размещая несколько графиков друг за другом в одной плоскости.

Посмотрим, как выглядит цвет в трёхмерном пространстве $(R, G, B)$. Вместо этого можно представить цвет как функцию $(R, G, B)$ или $(L, M, S)$.

Здесь отображается более широкий набор цветов, а не только спектральные цветов радуги. Классно!

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


Пары компонентов с нулевой третьей составляющей

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

Вновь взглянув на куб мы видим, что (0, 0, 0) соответствует чёрному цвету, а (1, 1, 1) — белому.

Что произойдёт, если мы срежем куб по диагонали через плоскость, содержащую $(1, 0, 0)$, $(0, 1, 0)$ и $(0, 0, 1)$?

Если посмотреть на треугольный срез сверху, то получим такое: Этот треугольный срез куба обладает таким свойством, что $R + G + B = 1$, и мы можем использовать $R + G + B$ как грубое приближение светлоты.

Этот конкретный вид называется rg-хроматичностью. Такое двумерное представление цвета называется хроматичностью (chromaticity). Хроматичность даёт информацию о соотношении основных цветов независимо от светлоты.

Это значит, что одинаковую хроматичность можно сохранять на разных уровнях светлоты.

Можно даже сделать диаграмму хроматичности, где интенсивность изменяется вместе с r и g, чтобы максимизировать интенсивность при сохранении соотношения между R, G и B.

При изменении яркости экрана хроматичность остаётся постоянной! Хроматичность — полезное свойство цвета, потому что она не меняется при изменении интенсивности источника света, пока у источника тот же спектральный состав.

Один из распространённых методов используется в цветовых пространствах HSL и HSV. Существует много способов разделить хроматичность на два измерения. В обоих цветовых пространствах хроматичность разделяется на «тон» (hue) и «насыщенность» (saturation):

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

Если взять наши функции сложения цветов $\bar r(\lambda)$, $\bar g(\lambda)$ и $\bar b(\lambda)$ и построить rg-хроматичность спектральных цветов, то получится примерно такой график:

Кривая называется спектральным локусом. Чёрная кривая с цветными точками показывает хроматичность всех чистых спектральных цветов. Звёздочки соответствуют длинам волн в лампах, которые использовались в экспериментах по сложению цветов.

Наложим предыдущие треугольники хроматичности на эту диаграмму.

Зона шашечек показывает цвета, которые человек воспринимает, но их невозможно воспроизвести сложением волн 435 нм, 546 нм и 700 нм. Область внутри спектрального локуса содержит все цвета, видимые человеком. Из этой диаграммы видно, что мы не можем воспроизвести ни один из спектральных цветов между 435 нм и 546 нм, включая чистый циан.

Мы называем эту область гаммой цветового пространства. Треугольник справа без шашечек — это все цвета, которые можно воспроизвести положительными значениями R, G, B.

Прежде чем наконец-то вернуться к шестнадцатеричным кодам, нужно рассмотреть ещё одно цветовое пространство.

В 1931 году была созвана Международная комиссия по освещению. Она установила два цветовых пространства. Первое — цветовое пространство RGB, которое мы уже обсуждали, созданное на основе экспериментов Райта и Гилда по сложению цветов. Вторым стало цветовое пространство XYZ.

Для этого тщательно подобрали подходящее линейное преобразование пространства RGB. Одна из задач цветового пространства XYZ — получить положительные значения для всех цветов, видимых человеком, чтобы все значения хроматичности находились в диапазоне [0, 1] на обеих осях.

17697} \begin{bmatrix} 0. $\begin{bmatrix} X \\ Y \\ Z \end{bmatrix} = \frac{1}{b_{21}} \begin{bmatrix} b_{11} & b_{12} & b_{13} \\ b_{21} & b_{22} & b_{23} \\ b_{31} & b_{32} & b_{33} \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix} = \frac{1}{0. 31000 & 0. 49000 & 0. 17697 & 0. 20000 \\ 0. 010630 \\ 0. 81240 & 0. 010000 & 0. 0000 & 0. 99000 \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix}$

Аналогом rg-хроматичности в пространстве XYZ является xy-хроматичность, а диаграммы хроматичности размещаются в более стандартной системе координат.

Например, вот ещё раз гамма CIE RGB, на этот раз в пространстве xy. Гаммы обычно представляют треугольниками на диаграмме xy-хроматичности.

Поняв гаммы & хроматичность, мы наконец-то можем начать обсуждение, как цифровые дисплеи способны показывать нужные цвета.

Независимо от производителя дисплея под сильной лупой вы увидите сетку пикселей, где каждый пиксель состоит из трёх субпикселей: один красный, один зелёный и один синий. Она может выглядеть примерно так:

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


Субпиксельные спектральные данные MacBook Air из f.luxometer

С помощью утилиты ColorSync я определил гамму в xy пространстве для дисплея своего Macbook Pro.

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

В то время как гаммы мониторов будут различаться, современные мониторы должны попытаться охватить определённую другую гамму: sRGB.

sRGB («стандартный красный зелёный синий») — это цветовое пространство, созданное HP и Microsoft в 1996 году для точной передачи информации о цвете между разными устройствами.

Стандарт определяет хроматичность основных цветов.

Хроматичность

Красный

Зелёный

Синий

x

0,6400

0,3000

0,1500

y

0,3300

0,6000

0,0600

Y

0,2126

0,751

0,0722

Если нанести их на цветовое пространство, то получится гамма, похожая на гамму ЖК-экрана MacBook, но чуть меньше.

Для этого MacBook, похоже, использует модифицированную гамму sRGB. Некоторые части официальной гаммы sRGB не входят в гамму ЖК-дисплея MacBook Pro, то есть дисплей не может точно их воспроизвести.

Это и стандартное цветовое пространство для браузеров (указанное в стандарте CSS). sRGB — цветовое пространство по умолчанию, которое используется почти везде. Это значит, что все цвета за пределами гаммы sRGB неправильно воспроизводятся на диаграммах! Все диаграммы в этой статье находятся в цветовом пространстве sRGB.

Что приводит нас, наконец, к кодам цветов в интернете.

#9B51E0 задаёт цвет в пространстве sRGB. Чтобы преобразовать его в соответствующие координаты (R, G, B), мы делим каждую из трёх составляющих на 0xFF, то есть на 255. В данном случае:

61
0x51 / 0xFF = 0. 0x9B / 0xFF = 0. 88 32
0xE0 / 0xFF = 0.

61, 0. Поэтому цвету #9BE1E0 будут соответствовать координаты $(0. 88)$. 32, 0.

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

Если у каждой координаты в пространстве RGB есть 256 возможных значений, то хотелось бы убедиться, что каждая пара соседних координат максимально отличается друг от друга. Например, что #030000 отличался от #040000 как #F40000 от #F50000.

Человеческое зрение гораздо более чувствительно к небольшим изменениям слабого света, чем сильного света, поэтому желательно разместить больше из этих 256 значений в области слабого света.

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

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

Если все значения распределить равномерно ($Y = \frac{\left\lfloor8E\right\rfloor}{8}$), то получится следующая картина: Назовём это трёхбитное значение $Y$.

Как видите, разница в восприятии между $Y=0$ и $Y=1$ значительно больше, чем между $Y=6$ и $Y=7$.

Попробуем $Y = \left(\frac{\left\lfloor8E\right\rfloor}{8}\right)^2$ Теперь посмотрим, что произойдёт, если вместо этого использовать степенную функцию.

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

Обратная операция (преобразование дискретных значений в энергетические) называется гамма-декодированием. Такое преобразование значений энергии в дискретные значения называется гамма-кодирование.

Экспонента обозначается греческой буквой «гамма», отсюда и название. В общем виде гамма-коррекция выполняется по формуле $V_{out} = A V_{in}^\gamma$.

Правила кодирования и декодирования для sRGB основаны на аналогичной идее, но формула немного сложнее.

92}, & C_\mathrm{sRGB}\le0. $C_\mathrm{linear}= \begin{cases}\frac{C_\mathrm{sRGB}}{12. 055}{1. 04045\\ \left(\frac{C_\mathrm{sRGB}+0. 4}, & C_\mathrm{sRGB}>0. 055}\right)^{2. 04045 \end{cases}$

Если построить значения sRGB относительно линейных значений, то получится такой график:

Это последний фрагмент паззла для понимания, как мы переходим от шестнадцатеричных кодов к восприятию глазом! Отлично! Составим пошаговое руководство.

Во-первых, берем #9B51E0, разбиваем на компоненты R, G, B и нормализуем эти компоненты в диапазоне $[0, 1]$.

61, 0. Это даёт нам координату $(0. 88)$ в пространстве sRGB. 32, 0. Затем берём наши компоненты sRGB и преобразуем их в линейные значения.

33, 0. Это даёт нам координату $(0. 10)$ в линейном пространстве RGB. 08, 0. Данные значения используются для установки яркости субпикселей на экране.

Спектральные распределения субпикселей объединяются в одно спектральное распределение для всего пикселя.

Электромагнитное излучение от пикселя проходит через роговицу на сетчатку, возбуждая три вида колбочек.

Объединив вместе все этапы, мы получаем изображение из начала статьи!

Поэтому цвет 0xff0000 на экране с установкой яркости 50% яркости может соответствовать цвету 0x7F0000 на том же экране с яркостью 100%. Перед тем, как значения sRGB преобразуются в яркость субпикселей экрана, они ослабляются в соответствии с настройкой яркости устройства.

Однако в большинстве телефонов и ноутбуков используются ЖК-панели, где каждый субпиксель — это фильтр, действующий на белый свет. На идеальном экране чёрные пиксели $(0, 0, 0)$ не испускают никакого света независимо от настройки яркости. В следующем видео хорошо разложено по полочкам, как работают ЖК-дисплеи:

Фильтр несовершенен, так что при увеличении яркости чёрные пиксели будут излучать свет, когда подсветка просачивается через фильтры. В OLED-экранах (как в iPhone X и Pixel 2) подсветка не применяется, поэтому там постоянный чёрный независимо от яркости экрана.
В этой статье мы специально опустили многие аспекты цветопередачи и зрения. Например, не говорили об обработке в мозге информации с колбочек в теории противоположных цветов или эффектах цветопостоянства. Мы не говорили об аддитивном смешении и субтрактивном синтезе цветов. Не говорили о цветовой слепоте (дальтонизм). Не говорили о разнице между световым потоком, силой света, яркостью, освещённостью и световым излучением. Не говорили о цветовых профилях устройств ICC и о том, что делают с восприятием цвета программы вроде f.lux.

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

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

Вот краткий список самых полезных ресурсов:

Также пришлось обработать много таблиц с данными для создания графиков:
Особая благодарность Крису Куперу и Райану Каплану за ценные отзывы к черновику этой статьи.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Что слушают разработчики: от классики до игровых саундтреков — обсуждаем все самое интересное

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

Дайджест интересных материалов для мобильного разработчика #261 (9 июля — 15 июля)

На этой неделе случилась бомбическая история с приложением Burger King и аналитикой Appsee, App Store исполнилось 10 лет, мы узнали про чат-боты, банковские приложения, архитектуру приложений и нейронных сетей. 11 июля появился на Pikabu, а 12 июля был продублирован на ...