![](https://habrastorage.org/getpro/habr/post_images/f2b/beb/13f/f2bbeb13f355a4d67f7fd4992711f4b8.png)
Почему мы воспринимаем
background-color: #9B51E0
как этот конкретный фиолетовый цвет?![](https://habrastorage.org/getpro/habr/post_images/606/c27/c97/606c27c97fe71fb1753dd89f92fe8f24.png)
Долгое время я думал, что знаю ответ на этот вопрос. Но хорошенько поразмыслив, осознал значительные пробелы в своих знаниях.
Сейчас я надеюсь заполнить некоторые из этих пробелов, изучив электромагнитное излучение, оптическую биологию, колориметрию и оборудование для отображения цвета. Если хотите, можно перескочить к определённому разделу, вот оглавление:
- Электромагнитное излучение
- Видимый свет
- Воспринимаемая на глаз яркость
- Количественное определение цвета
- Оптическая биология
- Цветовые пространства
- Эксперименты Райта и Гилда по сложению цветов
- Визуализация цветовых пространств и хроматичности
- Гаммы и спектральный локус
- Цветовое пространство CIE XYZ
- Субпиксели экрана
- sRGB
- Шестнадцатеричные коды sRGB
- Гамма-коррекция
- От шестнадцатеричных кодов до глаза
- Краткое примечание о настройке яркости
- Вещи, которые я упустил
- Ссылки на литературу
В противном случае начнём с физики.
Электромагнитное излучение
Радиоволны, микроволны, инфракрасное излучение, видимый свет, ультрафиолет, рентгеновские лучи и гамма-излучение — всё это формы электромагнитного излучения. Хотя они называются по-разному, но эти названия просто обозначают различные диапазоны длин волн в электромагнитном спектре.
![](https://habrastorage.org/getpro/habr/post_images/b93/de8/19e/b93de819ecafcf0d2b56c34566044c27.png)
Электромагнитный спектр
Наименьшей единицей электромагнитного излучения является фотон. Энергия фотона пропорциональна частоте соответствующей ему волны, а фотоны высоких энергий соответствуют высокочастотным волнам.
Чтобы понять цвет, нужно сначала понять излучение. Давайте внимательнее посмотрим на излучение лампы накаливания.
![](https://habrastorage.org/getpro/habr/post_images/f3d/f0b/a14/f3df0ba14f6310c4cbddf0fd293df588.png)
Фото: Alex Iby
Мы можем задать вопрос, сколько энергии излучает лампа. Поток излучения (
Если мы хотим узнать, сколько энергии приходится на каждый волновой диапазон, то можно посмотреть на спектральную плотность излучения. Спектральная плотность излучения (
Если изобразить спектральную плотность излучения нашей лампочки накаливания как функцию длины волны, то она будет выглядеть примерно так:
![](https://habrastorage.org/getpro/habr/post_images/d42/17d/860/d4217d860bbf42649d876044099e783c.png)
Площадь области, ограниченной этой кривой, соответствует потоку излучения. В виде уравнения:
![](https://habrastorage.org/getpro/habr/post_images/33e/ac3/062/33eac306215e90270457ce180bf751a0.png)
Возможно, вы слышали из рекламы защитников природы, что лампочки накаливания крайне неэффективны и думаете: «Хм, 80% не кажется таким уж плохим КПД».
И это правда. Лампочка накаливания — весьма эффективный способ преобразования электричества в излучение. К сожалению, это ужасный способ преобразования электричества в видимое человеком излучение.
Видимый свет
Видимый свет находится в диапазоне длин волн от
![](https://habrastorage.org/getpro/habr/post_images/21e/65d/bfb/21e65dbfbea7b12af54d09bcbba02e08.png)
Итак, в видимом диапазоне излучается 8,7 Вт, что даёт нам КПД в 8,7%. Выглядит ужасно. На самом деле ситуация ещё хуже.
Чтобы понять почему, давайте рассмотрим, почему видимый свет является видимым.
Воспринимаемая на глаз яркость
![](https://habrastorage.org/getpro/habr/post_images/f76/10a/712/f7610a712c44f743a529d095df9734a5.png)
Фото: Christopher Burns
Так же как лампа накаливания не одинаково излучает на всех длинах волн, наши глаза тоже не одинаково чувствительны к излучению во всех диапазонах. Если измерить чувствительность человеческого глаза к каждой длине волны, то мы получим функцию относительной спектральной световой эффективности монохроматического излучения. Стандартная функция спектральной световой эффективности
![](https://habrastorage.org/getpro/habr/post_images/db2/946/6dc/db29466dc6ba451bbc2331d96b5b22ce.png)
Границы этой функции определяют диапазон видимого света. Мы не увидим ничего за пределами этого диапазона, потому что наши глаза не воспринимают этот свет!
Данная кривая также показывает что наши глаза намного более чувствительны к излучению на 550 нм, чем к излучению на 650 нм или 450 нм.
Глаза других животных чувствительны к другим диапазонам волн и, следовательно, для них действуют другие функции относительной спектральной световой эффективности. Птицы могут видеть в ультрафиолете излучение в диапазоне от
![](https://habrastorage.org/getpro/habr/post_images/720/512/c9f/720512c9f8a99c21a346a3e184cf88b0.png)
Фото: Timothy Rhyne
Умножив график спектральной плотности излучения на функцию относительной спектральной световой эффективности монохроматического излучения
![](https://habrastorage.org/getpro/habr/post_images/389/63b/2f0/38963b2f06e2236ab2ed68e59d679083.png)
Это спектральная плотность светового потока (
Световой поток (
Точно так же, как мы рассчитывали поток излучения, посчитав площадь области, ограниченной кривой потока излучения, мы можем найти и световой поток, взяв область, ограниченную кривой спектральной плотности светового потока, с преобразованием из ватт воспринимаемого излучения в люмены:
![](https://habrastorage.org/getpro/habr/post_images/5d7/e1b/cf0/5d7e1bcf00b6dc8e505089944d3e398b.png)
Так что световой поток нашей стоваттной лампы накаливания составляет жалкие 2,4 Вт или 1600 люмен! У лампы накаливания световая эффективность всего 2,4%, что далеко от эффективности 80% преобразования электроэнергии в излучение.
Возможно, если бы наш световой источник концентрировал своё излучение в видимом диапазоне, то можно было бы получить более эффективное освещение. Сравним спектры ламп накаливания, люминесцентных и светодиодных ламп:
![](https://habrastorage.org/getpro/habr/post_images/9c3/8ea/157/9c38ea1577bfa54464a746fd64457416.png)
И действительно, люминесцентные и светодиодные лампы тратят гораздо меньше энергии в невидимых человеку диапазонах. Если у ламп накаливания эффективность 1-3%, то у люминесцентных ламп она около 10%, а у светодиодных — до 20%!
Но хватит о яркости, вернёмся к теме статьи: цвет!
Количественное определение цвета
![](https://habrastorage.org/getpro/habr/post_images/554/1c1/fa4/5541c1fa45091d4b0eea98b89eb0c095.png)
Фото: Lauren Mancke
Как идентифицировать данный цвет? Если передо мной лимон, как сказать по телефону, какого он цвета? Я могу сказать, что «лимон жёлтый», но какой именно жёлтый? Как точно идентифицировать каждый из этих оттенков жёлтого?
![](https://habrastorage.org/getpro/habr/post_images/cd3/449/f90/cd3449f9082fe4871aa36e3d3758e4c5.png)
Вооружившись знанием о том, что цвет — это интерпретация человеком электромагнитного излучения, может возникнуть соблазн определить цвет математически с помощью спектральной плотности излучения. Любой видимый человеком цвет будет неким взвешенным сочетанием монохроматических цветов (одиночных длин волн). Монохроматические цвета также известны как спектральные цвета.
![](https://habrastorage.org/getpro/habr/post_images/fc6/608/f22/fc6608f22ae6858e9f9cf18c75ed1e8d.png)
Монохроматические цвета по длинам волн
Для любого данного объекта можно измерить спектр излучения (или отражения) — и использовать его для точного определения цвета. Если можно воспроизвести спектр, то мы точно воспроизведём цвет!
У отражённого от точки на лимоне солнечного света может быть примерно такой спектр отражения:
![](https://habrastorage.org/getpro/habr/post_images/820/341/76d/82034176d9ba871ebdea8b525970deaf.png)
Примечание: мощность и распределение интенсивности излучения, достигающего глаза, зависит от мощности и спектра излучения источника света, расстояния от источника света до освещаемого объекта, размера и формы объекта, спектра поглощения объекта и расстояния от вас до объекта. Здесь много о чём нужно подумать, так что сосредоточимся на том, что происходит, когда этот свет достигает глаза человека. Пока проигнорируем единицы измерения и сосредоточимся на концепциях.
Когда энергия с таким спектральным распределением попадает в глаз человека, он воспринимает её как «жёлтую». Предположим, я сфотографировал лимон и загрузил фотографию на компьютер. Потом тщательно настроил цвета на экране, чтобы конкретная точка лимона на экране не отличалась от цвета фактического лимона в моей реальной руке.
Если вы измерите распределение спектральной интенсивности с экрана, то как по-вашему оно будет выглядеть? Разумно ожидать, что оно похоже на спектр отражения лимона выше. Но на самом деле оно выглядит примерно так:
![](https://habrastorage.org/getpro/habr/post_images/ae0/87f/6b9/ae087f6b9707d51d8f348a6a55ff4ee4.png)
Два разных распределения спектральной интенсивности, выглядящие одинаково для наблюдателя-человека, называются метамерами.
![](https://habrastorage.org/getpro/habr/post_images/955/637/ed9/955637ed9aa2df5dc5a663102f0c45e0.png)
Чтобы понять, как такое возможно, рассмотрим биологию глаза.
Оптическая биология
![](https://habrastorage.org/getpro/habr/post_images/e49/503/a78/e49503a789c6e91802c805ec782930d5.png)
Фото: Аманды Далбьерн
За наше восприятие света отвечают специализированные клетки в сетчатке глаза, палочки и колбочки. Палочки важны преимущественно в условиях низкой освещенности и не играют большой роли в восприятии цвета, поэтому мы сосредоточимся на колбочках.
У людей как правило три вида колбочек. Наличие трёх разных видов колбочек делает человека «трихроматом». Однако есть по крайней мере один подтверждённый случай человека-тетрахромата! У другие животных даже больше видов колбочек. У ротоногих — шестнадцать видов.
Каждый тип колбочки обозначен по длинам световых волн, на которые он реагирует. Стандартное обозначение — S, M и L (короткие, средние, длинные волны).
![](https://habrastorage.org/getpro/habr/post_images/037/5be/1c6/0375be1c6415e53fdf2cafb2bdfb054c.png)
Три кривые показывают, насколько чувствительны колбочки определённого типа к каждой длине волны. Наивысшая точка каждой кривой называется «пиковой длиной волны», указывая длину волны, к которой колбочка наиболее чувствительна.
Посмотрим, как наши колбочки обработают свет, отражающийся от лимона в руке.
![](https://habrastorage.org/getpro/habr/post_images/b2e/fc0/e25/b2efc0e25f7b920a9a2f8fb2049a8fe4.png)
Ограниченные кривыми области показывают, какая часть отражённого от лимона излучения возбуждает каждый тип колбочек. В данном случае нормализованные возбуждения колбочек S, M и L составляют 0,02, 0,12 и 0,16, соответственно. Теперь повторим процесс для лимона на экране.
![](https://habrastorage.org/getpro/habr/post_images/853/498/9f9/8534989f9b49e3180d2c9988892a0c09.png)
Несмотря на совершенно разные спектры излучения, возбуждения колбочек одинаковы (S=0,02, M=0,12, L=0,16). Вот почему точка на реальном лимоне и точка на цифровом лимоне для нас выглядят одинаково!
![](https://habrastorage.org/getpro/habr/post_images/b6a/d75/e19/b6ad75e1960bff4481d62e70a0693503.png)
У метамер всегда будет равна нормализованная площадь под кривыми стимуляции трёх типов колбочек
Наши три набора колбочек сводят любую кривую спектральной плотности потока
В реальности триплет
Цветовые пространства
Цветовые пространства позволяют численно определить цвет. В предыдущей главе мы видели, что определённый жёлтый цвет можно представить как (0,02, 0,12, 0,16) в цветовом пространстве SML, которое более известно как цветовое пространство LMS.
Поскольку это цветовое пространство описывает стимуляцию конусов, по определению любой видимый цвет человека можно представить положительными координатами LMS (за исключением крайне редких людей-тетрахроматов, которым нужны четыре координаты вместо трёх).
К сожалению, у этого цветового пространства есть некоторые бесполезные свойства.
Во-первых, не все значения триплетов (также называемые цветовыми компонентами или координатами цвета) физически возможны. Например, координаты LMS (0, 1, 0). Чтобы выйти на эту координату, нужно как-то стимулировать колбочки М, при этом вообще не стимулируя колбочки L и S. Но это невозможно, потому что кривая чувствительности колбочек M значительно перекрывает L или S на всех длинах волн!
![](https://habrastorage.org/getpro/habr/post_images/037/5be/1c6/0375be1c6415e53fdf2cafb2bdfb054c.png)
Любая длина волны, которая стимулирует колбочки M, также будет стимулировать колбочки типа L или S (или оба типа!)
В итоге возникает проблема, что реально сложно увеличить стимуляцию только одного типа колбочек. Из-за такого побочного эффекта, в частности, данная цветовая модель не очень совместима с производством дисплеев.
Другая историческая, практическая проблема заключается в том, что точной чувствительности колбочек не знали до 1990-х годов, а необходимость разработки математически точной модели цвета возникла намного раньше. Первый значительный прогресс в этой области произошёл в конце 1920-х.
Эксперименты Райта и Гилда по сложению цветов
В конце 1920-х годов Уильям Дэвид Райт и Джон Гилд провели эксперименты. Они точно определили отдельные цвета по вкладу трёх конкретных длин волн.
Хотя они, вероятно, не знали о трёх типах колбочек на сетчатке, но ещё за сто лет до них возникла идея, что все видимые цвета можно представить как комбинацию трёх цветов.
![](https://habrastorage.org/getpro/habr/post_images/615/bf9/9a2/615bf99a287d083b44d0072757f94b08.png)
Пример трёхцветной теории цвета Чарльза Хейтера, 1826 год
У Райта и Гилда появилась идея построить аппарат, который позволит испытуемым определять тестовый цвет как комбинацию от трёх источников света с фиксированной длиной волны. Установка выглядела примерно так:
![](https://habrastorage.org/getpro/habr/post_images/cbe/f99/ca0/cbef99ca0c5356fc265291cdd6945151.png)
Экспериментатор настраивал лампу внизу на определённую длину волны, (например, 600 нм), а затем просил испытуемых отрегулировать питание трёх контрольных ламп, чтобы цвет совпадал.
![](https://habrastorage.org/getpro/habr/post_images/a8b/40b/cce/a8b40bcced12d08045e34972a8eb84c8.png)
Мощность каждой из трёх ламп (красный, зелёная и синяя) дают нам триплет чистых спектральных цветов, который соответствует 600 нм. После повторения этого эксперимента через каждые 5 нм примерно на десяти испытуемых, был создан график, показывающий количество красного (700 нм), зеленого (546 нм) и синего (435 нм) света, необходимого для восстановления внешнего вида цвета на заданной длине волны. Функции известны как функции сложения цветов (color matching function, CMF).
Эти конкретные функции сложения цветов известны как
![](https://habrastorage.org/getpro/habr/post_images/89a/8e7/221/89a8e7221ceaeb04a1d2d39a47e4e20b.png)
Они дают чистый спектральный цвет, который ассоциируется с длиной волны 600 нм по
Подождите, а что означают негативные значения функции?
![](https://habrastorage.org/getpro/habr/post_images/552/683/d98/552683d98eea6d5bc36c37c8c822c05c.png)
У чистых спектральных цветов, которые ассоциируются с цветом на длине волны 500 нм, координаты
Оказывается, никакие параметры красной (700 нм) лампы вверху не позволяют достичь соответствия цвету 500 нм внизу, независимо от мощности синей и зелёной лампы вверху. Но можно достичь совпадения с двух сторон, если перенести красную лампу вниз.
![](https://habrastorage.org/getpro/habr/post_images/dc5/d3d/31f/dc5d3d31f93972c6f74587a288cdf870.png)
В реальной экспериментальной установке, наверное, сверху и снизу было установлено по полному набору ламп с фиксированными длинами волн, чтобы регулировать каждую из них в «отрицательной» зоне.
Используя наши функции сложения цветов, можно найти соответствие для любого монохроматического света с помощью сочетания (возможно, отрицательного) количества красного (700 нм), зелёного (546 нм) и синего (435 нм) света.
Функции сложения цветов можно проанализировать так же, как мы анализировали чувствительность колбочек L, M и S. Возьмём тот же цвет лимона:
![](https://habrastorage.org/getpro/habr/post_images/2d7/f7f/9c6/2d7f7f9c61445ac9c6261d40a6abc469.png)
Взяв области, ограниченные кривыми произведения спектральной кривой и функций сложения цветов, мы получили RGB-триплет (1,0, 0,8, 0,2), однозначно идентифицирующий данный цвет.
В то время как цветовое пространство
![](https://habrastorage.org/getpro/habr/post_images/938/6b9/677/9386b96775e2367cc5290c420b4b90aa.png)
Но этот график показывает только какие спектральные цвета нельзя воспроизвести. А что насчёт неспектральных цветов? Можно ли произвести розовый цвет сочетанием R, G, B? Или циан (сине-зелёный цвет)?
Чтобы ответить на эти вопросы, нам понадобится лучший способ визуализации цветового пространства.
Визуализация цветовых пространств и хроматичности
До сих пор в большинстве диаграмм мы располагали длины волн по горизонтальной оси, размещая несколько графиков друг за другом в одной плоскости.
![](https://habrastorage.org/getpro/habr/post_images/7ad/c8d/d42/7adc8dd424f30a1183b2e28c33688ac5.png)
Вместо этого можно представить цвет как функцию
![](https://habrastorage.org/getpro/habr/post_images/963/9b3/096/9639b30961cb15a7b1227ccae57e6816.png)
Классно! Здесь отображается более широкий набор цветов, а не только спектральные цветов радуги.
Чтобы свести к двум измерениям, проще всего сделать отдельные диаграммы для каждой пары значений, например:
![](https://habrastorage.org/getpro/habr/post_images/d75/f65/f87/d75f65f87861aee297af1017c927d018.png)
Пары компонентов с нулевой третьей составляющей
На каждой из диаграмм мы отбросили одно измерение, обнулив одну из трёх цветовых составляющих. Но вместо фиксации красной, зелёной или синей составляющих удобнее было бы увидеть все цвета, зафиксировав светлоту.
Вновь взглянув на куб мы видим, что (0, 0, 0) соответствует чёрному цвету, а (1, 1, 1) — белому.
![](https://habrastorage.org/getpro/habr/post_images/963/9b3/096/9639b30961cb15a7b1227ccae57e6816.png)
Что произойдёт, если мы срежем куб по диагонали через плоскость, содержащую
![](https://habrastorage.org/getpro/habr/post_images/690/a81/5d3/690a815d3451759638a957b3500bbeb6.png)
Этот треугольный срез куба обладает таким свойством, что
![](https://habrastorage.org/getpro/habr/post_images/e31/283/79d/e3128379def7018eaabae92ff3cd4646.png)
Такое двумерное представление цвета называется хроматичностью (chromaticity). Этот конкретный вид называется rg-хроматичностью. Хроматичность даёт информацию о соотношении основных цветов независимо от светлоты.
Это значит, что одинаковую хроматичность можно сохранять на разных уровнях светлоты.
![](https://habrastorage.org/getpro/habr/post_images/1e4/cab/8bc/1e4cab8bc2954d6dd8a13bba69358ba9.png)
Можно даже сделать диаграмму хроматичности, где интенсивность изменяется вместе с r и g, чтобы максимизировать интенсивность при сохранении соотношения между R, G и B.
![](https://habrastorage.org/getpro/habr/post_images/128/3e1/9fa/1283e19fada48740036ff9ed080c2951.png)
Хроматичность — полезное свойство цвета, потому что она не меняется при изменении интенсивности источника света, пока у источника тот же спектральный состав. При изменении яркости экрана хроматичность остаётся постоянной!
Существует много способов разделить хроматичность на два измерения. Один из распространённых методов используется в цветовых пространствах HSL и HSV. В обоих цветовых пространствах хроматичность разделяется на «тон» (hue) и «насыщенность» (saturation):
![](https://habrastorage.org/getpro/habr/post_images/1e9/8c6/eb8/1e98c6eb84c7b685d6a48d5c0fff12f5.png)
На первый взгляд может показаться, что треугольник rg-хроматичности и эти квадраты тона/насыщенности содержат все цвета радуги. Что ж, пришло время снова вернуться к тем надоедливым отрицательным значениям в функциях сложения цветов.
Гаммы и спектральный локус
Если взять наши функции сложения цветов
![](https://habrastorage.org/getpro/habr/post_images/f7e/519/86c/f7e51986cfc5f44c7da515a060a63562.png)
Чёрная кривая с цветными точками показывает хроматичность всех чистых спектральных цветов. Кривая называется спектральным локусом. Звёздочки соответствуют длинам волн в лампах, которые использовались в экспериментах по сложению цветов.
Наложим предыдущие треугольники хроматичности на эту диаграмму.
![](https://habrastorage.org/getpro/habr/post_images/868/bb2/496/868bb2496b9707fb4dde6686bd054422.png)
Область внутри спектрального локуса содержит все цвета, видимые человеком. Зона шашечек показывает цвета, которые человек воспринимает, но их невозможно воспроизвести сложением волн 435 нм, 546 нм и 700 нм. Из этой диаграммы видно, что мы не можем воспроизвести ни один из спектральных цветов между 435 нм и 546 нм, включая чистый циан.
Треугольник справа без шашечек — это все цвета, которые можно воспроизвести положительными значениями R, G, B. Мы называем эту область гаммой цветового пространства.
Прежде чем наконец-то вернуться к шестнадцатеричным кодам, нужно рассмотреть ещё одно цветовое пространство.
Цветовое пространство CIE XYZ
В 1931 году была созвана Международная комиссия по освещению. Она установила два цветовых пространства. Первое — цветовое пространство RGB, которое мы уже обсуждали, созданное на основе экспериментов Райта и Гилда по сложению цветов. Вторым стало цветовое пространство XYZ.
Одна из задач цветового пространства XYZ — получить положительные значения для всех цветов, видимых человеком, чтобы все значения хроматичности находились в диапазоне [0, 1] на обеих осях. Для этого тщательно подобрали подходящее линейное преобразование пространства RGB.
Аналогом rg-хроматичности в пространстве XYZ является xy-хроматичность, а диаграммы хроматичности размещаются в более стандартной системе координат.
![](https://habrastorage.org/getpro/habr/post_images/09a/820/bf6/09a820bf609b12d9e567cd6393cdebbb.png)
Гаммы обычно представляют треугольниками на диаграмме xy-хроматичности. Например, вот ещё раз гамма CIE RGB, на этот раз в пространстве xy.
![](https://habrastorage.org/getpro/habr/post_images/284/137/12a/28413712a1c5ba854e1b9978d4560355.png)
Поняв гаммы & хроматичность, мы наконец-то можем начать обсуждение, как цифровые дисплеи способны показывать нужные цвета.
Субпиксели экрана
Независимо от производителя дисплея под сильной лупой вы увидите сетку пикселей, где каждый пиксель состоит из трёх субпикселей: один красный, один зелёный и один синий. Она может выглядеть примерно так:
![](https://habrastorage.org/getpro/habr/post_images/325/ada/d7f/325adad7fccfd494a8238e400d340c65.png)
В отличие от ламп в эксперименте по сложению цветов, субпиксели не излучают монохроматический свет. У каждого типа субпикселей своё собственное спектральное распределение, разное у разных мониторов.
![](https://habrastorage.org/getpro/habr/post_images/c88/bc6/6e1/c88bc66e102e998e936dc6351837cc63.png)
Субпиксельные спектральные данные MacBook Air из f.luxometer
С помощью утилиты ColorSync я определил гамму в xy пространстве для дисплея своего Macbook Pro.
![](https://habrastorage.org/getpro/habr/post_images/bc7/d21/bd4/bc7d21bd4c0755a0cc25b4e0d835c6c9.png)
Обратите внимание, что углы гаммы больше не лежат вдоль спектрального локуса. Оно и понятно, ведь субпиксели не излучают чистый монохроматический свет. Эта гамма представляет полный спектр цветности основных цветов, которые данный монитор может точно воспроизвести.
В то время как гаммы мониторов будут различаться, современные мониторы должны попытаться охватить определённую другую гамму: sRGB.
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, но чуть меньше.
![](https://habrastorage.org/getpro/habr/post_images/c1e/ed6/5f0/c1eed65f0efc6bdc9f3a049eaaef12da.png)
Некоторые части официальной гаммы sRGB не входят в гамму ЖК-дисплея MacBook Pro, то есть дисплей не может точно их воспроизвести. Для этого MacBook, похоже, использует модифицированную гамму sRGB.
![](https://habrastorage.org/getpro/habr/post_images/50e/db6/96a/50edb696a609caa487053763d365b4dc.png)
sRGB — цветовое пространство по умолчанию, которое используется почти везде. Это и стандартное цветовое пространство для браузеров (указанное в стандарте CSS). Все диаграммы в этой статье находятся в цветовом пространстве sRGB. Это значит, что все цвета за пределами гаммы sRGB неправильно воспроизводятся на диаграммах!
Что приводит нас, наконец, к кодам цветов в интернете.
Шестнадцатеричные коды sRGB
#9B51E0
задаёт цвет в пространстве sRGB. Чтобы преобразовать его в соответствующие координаты (R, G, B), мы делим каждую из трёх составляющих на 0xFF
, то есть на 255. В данном случае:0x9B / 0xFF = 0.61
0x51 / 0xFF = 0.32
0xE0 / 0xFF = 0.88
Поэтому цвету #9BE1E0 будут соответствовать координаты
Прежде чем отправить эти значения на дисплей для установки интенсивности субпикселей, нужно выполнить ещё один шаг: гамма-коррекцию.
Гамма-коррекция
Если у каждой координаты в пространстве RGB есть 256 возможных значений, то хотелось бы убедиться, что каждая пара соседних координат максимально отличается друг от друга. Например, что
#030000
отличался от #040000
как #F40000
от #F50000
.Человеческое зрение гораздо более чувствительно к небольшим изменениям слабого света, чем сильного света, поэтому желательно разместить больше из этих 256 значений в области слабого света.
Представим, что мы хотим закодировать оттенки серого, но у нас для этого есть только три бита, что даёт восемь возможных значений.
Если построить значения серого как линейную функцию энергии, то она будет выглядеть примерно так:
![](https://habrastorage.org/getpro/habr/post_images/6e4/b54/b57/6e4b54b57402669a07af3dfedeb1861c.png)
Назовём это трёхбитное значение
![](https://habrastorage.org/getpro/habr/post_images/c7d/d5d/d1e/c7dd5dd1efbd7064754fd44871c10a16.png)
Как видите, разница в восприятии между
Теперь посмотрим, что произойдёт, если вместо этого использовать степенную функцию. Попробуем
![](https://habrastorage.org/getpro/habr/post_images/c44/250/5cc/c442505cc3f0da834fe7c1d8c438a448.png)
Мы стали гораздо ближе к единообразию восприятия, чтобы каждая соседняя пара значений отличалась в такой же степени, как и любая другая соседняя пара.
Такое преобразование значений энергии в дискретные значения называется гамма-кодирование. Обратная операция (преобразование дискретных значений в энергетические) называется гамма-декодированием.
В общем виде гамма-коррекция выполняется по формуле
Правила кодирования и декодирования для sRGB основаны на аналогичной идее, но формула немного сложнее.
Если построить значения sRGB относительно линейных значений, то получится такой график:
![](https://habrastorage.org/getpro/habr/post_images/c70/02e/d63/c7002ed6387c774eaa72c734b144e7c3.png)
Отлично! Это последний фрагмент паззла для понимания, как мы переходим от шестнадцатеричных кодов к восприятию глазом! Составим пошаговое руководство.
От шестнадцатеричных кодов до глаза
Во-первых, берем
#9B51E0
, разбиваем на компоненты R, G, B и нормализуем эти компоненты в диапазоне ![](https://habrastorage.org/getpro/habr/post_images/dc9/443/b21/dc9443b21bda7ef13cc89b732af6b735.png)
Это даёт нам координату
![](https://habrastorage.org/getpro/habr/post_images/b70/965/664/b70965664f5c691ae1afeec10d9aaa92.png)
Это даёт нам координату
![](https://habrastorage.org/getpro/habr/post_images/27f/f1f/03f/27ff1f03fb14df627fa51e47b97f9e7e.png)
Спектральные распределения субпикселей объединяются в одно спектральное распределение для всего пикселя.
![](https://habrastorage.org/getpro/habr/post_images/919/a09/a53/919a09a53edb0896a534dac41c0d1e1d.png)
Электромагнитное излучение от пикселя проходит через роговицу на сетчатку, возбуждая три вида колбочек.
![](https://habrastorage.org/getpro/habr/post_images/042/1a7/c2a/0421a7c2a5b667d14ec72a446c83a06a.png)
Объединив вместе все этапы, мы получаем изображение из начала статьи!
![](https://habrastorage.org/getpro/habr/post_images/f2b/beb/13f/f2bbeb13f355a4d67f7fd4992711f4b8.png)
Краткое примечание о настройке яркости
![](https://habrastorage.org/getpro/habr/post_images/4de/12c/f67/4de12cf67a3db8928879e4597c177715.png)
Перед тем, как значения sRGB преобразуются в яркость субпикселей экрана, они ослабляются в соответствии с настройкой яркости устройства. Поэтому цвет
0xff0000
на экране с установкой яркости 50% может соответствовать цвету 0x7F0000
на том же экране с яркостью 100%.На идеальном экране чёрные пиксели
Фильтр несовершенен, так что при увеличении яркости чёрные пиксели будут излучать свет, когда подсветка просачивается через фильтры. В OLED-экранах (как в iPhone X и Pixel 2) подсветка не применяется, поэтому там постоянный чёрный независимо от яркости экрана.
Вещи, которые я упустил
В этой статье мы специально опустили многие аспекты цветопередачи и зрения. Например, не говорили об обработке в мозге информации с колбочек в теории противоположных цветов или эффектах цветопостоянства. Мы не говорили об аддитивном смешении и субтрактивном синтезе цветов. Не говорили о цветовой слепоте (дальтонизм). Не говорили о разнице между световым потоком, силой света, яркостью, освещённостью и световым излучением. Не говорили о цветовых профилях устройств ICC и о том, что делают с восприятием цвета программы вроде f.lux.
Я оставил это за скобками, потому что статья и так получилась слишком пространной. Как сказал мой друг, даже если вы понимаете, что многое в жизни сложнее, чем кажется, цвет всё равно окажется сложнее, чем вы могли предположить.
Ссылки на литературу
При написании этой статьи я потратил необычно много времени просто на чтение литературы, потому что продолжал находить всё новую и новую информацию, необходимую для максимально полного раскрытия темы.
Вот краткий список самых полезных ресурсов:
- Руководство для начинающих по колориметрии
- Цветовое пространство CIE 1931
- HSL и HSV
- Гамма-коррекция
- Рендеринг в реальном времени, третье издание, стр. 210-217
Также пришлось обработать много таблиц с данными для создания графиков:
- База данных Лаборатории исследований цвета и зрения Университетского колледжа Лондона (функции сопоставления цветов XYZ, основы работы колбочек)
- fluxometer.com (спектр субпикселей RGB на ЖК-дисплеях)
- CIE 15: Технический отчет: Колориметрия, 3-е издание (функции сопоставления цветов RGB)
Особая благодарность Крису Куперу и Райану Каплану за ценные отзывы к черновику этой статьи.