Цвет в компьютерной графике

Jun 19, 2013 23:24


Не знаю, куда положить, поэтому пусть пока полежит тут.

Короче говоря, несмотря на мой теперь уже двадцатилетний стаж в компьютерной графике, я ни разу не сталкивался с ее самым запутанным и эзотерическим разделом под названием "Color Science" - "наука о цвете" по-нашему. Во-первых, потому, что поверхностных знаний о гамма кривых, "линейном цветовом пространстве" и преобразованиях rgb->hls и обратно вполне хватало почти на все случай жизни. А, во-вторых, из-за моего дальтонизма я искренне считал, что мне все эти дебри совершенно ни к чему. А в-третьих, как-то так вышло, что все доступная (и недоступная тоже) литература на эту тему с первых же строк начинает наводить на читателя смертную тоску.
В общем, не было бы счастья, да несчастье помогло и мне пришлось по работе самостоятельно разобраться во всей этой байде для того, чтобы обеспечить выдачу готового материала в пространстве современных киношных проекторов - DCI P3. На поверку оказалось, что все даже хуже, чем мне поначалу казалось. И вся эта тоскливая литература мало помогает справиться с реальными задачами анимационного производства. Попробую изложить некоторые совершенно неочевидные факты, которые мне в результате открылись, по возможности, доступным языком.

1. Все невероятные сложности в вопросах правильного отображения цвета вызваны одной, довольно просто вещью: неодинаковой чувствительностью рецепторов, имеющихся на сетчатке человеческого глаза к разным частотам видимого спектра. Оказывается, мы видим не весь спектр, а только некоторые его фрагменты! Максимум чувствительности приходится на три локальные зоны частот, воспринимаемые разными типами рецепторов, которые условно можно назвать длинноволновые (красные) - L, средневолновые (желто-зеленые) - M и коротковолновые (сине-фиолетовые) - S. Наш мозг, сравнивая сигналы, поступающие от рецепторов разного типа, и формирует у нас ощущение цвета. Кстати, этой особенностью человеческого зрения объясняется феномен, называемый метамерией (metamerism), когда разные по спектральному составу цвета глаз может видеть как один и тот же цвет.

2. Все проблемы - от несовершенства технологий. Если бы существовала технология производства мониторов, способная заставить их экраны излучать основные цвета в тех же самых частотных промежутках, на которые реагируют наши цветовые рецепторы, все проблемы с цветопередачей сразу ушли бы в прошлое. К сожалению, ее не существует, и пока не понятно, будет ли она существовать в будущем. Имеющиеся мониторы и проекторы набирают изображение из красных/зеленых/синих цветов с принципиальной другими частотными характеристиками. Для того, чтобы заставить их показывать цвет, хотя бы приблизительно похожий на наблюдаемый нами в природе, приходится изрядно попотеть с трансформацией значений из видимого нами пространства LMS в отображаемое монитором RGB. При этом надо быть заранее готовым к тому, что далеко не все цвета LMS можно представить в виде мониторного RGB: говорят, что гамма цветов у последнего является более узкой.

3. Универсального "линейного" пространства RGB в природе не существует! "Здрасьте! А в каком же пространстве работает наш пайплайн? Мы же линеаризуем текстуры перед тем, как подавать их на рендеринг!". Все правильно, вы убираете из них гамма-кривую - еще один артефакт, рожденный несовершенством технологий производства ЭЛТ-мониторов. Но от этого ваши текстуры не станут ближе к какому-то другому набору основных отображаемых цветов (primaries). Если текстуры были нарисованы на обычном мониторе, то скорее всего, это цветовое пространство называется sRGB. А гамма-кривая по науке называется transfer function. Более новая цветовая система rec.709, которая является стандартом для ТВ высокой четкости, по сути тоже использует primaries из пространства sRGB, но отличается от чистого sRGB формой кривой этой самой transfer function. Помимо sRGB существует огромное количество других RGB систем, но все они так или иначе связаны с ограничениями той или иной технологии отображения.

4. Что же нам делать? Если "просто" RGB не существует, куда бедному еврею податься за что же нам зацепиться при переводе цветов из одного пространства в другое? Для этих целей существует цветовое пространство CIE1931 XYZ, или просто XYZ. Оно наиболее близко связано с параметрами LMS, но они не являются тождественными. По большому счету, пространство XYZ является некоей математической абстракцией, не существующей в природе, но удобной для тех целей, для которых ее и придумали.

Для преобразования из какого-либо RGB пространства в XYZ и потом в другое RGB пространство, нужно знать следующие характеристики этих пространств: x и у координаты "белой точки" (white point), а также x и y координаты "осей" R, G и B (primaries) этого RGB пространства. Координаты z обычно опускают, потому что подразумевается, что сумма всех трех координат должна быть единицей. В литературе описано, как вычислить матрицы 3х3 элемента для таких преобразований, а, кроме того, существуют таблицы уже рассчитанных матриц для разных пространств. Умножаем цветовой вектор на такую матрицу - получаем его трансформацию в нужное пространство. Надо только иметь в виду, что матрицы у колористов транспонированы, то есть столбцы поменяны местами с рядами по сравнению с привычными нам матрицами трехмерных трансформаций.

С этими матрицами, правда, есть одна тонкость: если у исходного и желаемого цветовых пространств отличаются параметры white point, придётся столкнуться с так называемым алгоритмом хроматической адаптации (chromatic adaptation). Он должен скомпенсировать сдвиг в цвете из-за различия в "точке белого". Для этого reference white значения для обоих пространств трансформируются из XYZ в пространство LMS при помощи одного из множества известных методов (Bradford matrix считается лучшим). Потом вычисляется отношение между желаемым и исходными reference whites. Потом это отношение применяется к исходному цвету, предварительно переведеному в LMS. Потом его надо вернуть в XYZ, а уже потом в искомое пространство.

Формулы и таблицы имеются тут: http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html

UPD: Работоспособный код на Питоне, демонстрирующий принципы трансформации цветов между разными пространствами я выложил тут.

rgb, xyz, cg, python, color science, color transformation, цвет в компьютерной графике, code example

Previous post Next post
Up