Loading color scheme

Рендеринг спектров

Введение

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

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

Вместо этого можно добиться большего, используя полностью синтетический подход: создать изображение полностью в цифровой форме с нуля. Но даже у этого метода есть трудности. Особенно сложно качественно выполнить работу на веб-странице, где вы не можете контролировать настройку собственного монитора зрителя. В разных мониторах используются разные технологии (сравните ЭЛТ и плоские LED дисплеи, люминофоры и плазменные дисплеи и т. д.), поэтому разные устройства имеют разные «красные», «зеленые» и «синие» основные цвета; а также есть регулировки яркости и контрастности.

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

Первый пример

На рис.1 показано, где основные цвета монитора sRGB попадают на диаграмму цветности CIE. Цвета вне аддитивного треугольника смешивания цветов Максвелла, углы которого представляют эти основные цвета, не могут быть воспроизведены на мониторе. Как видите, сюда входят все чистые спектральные цвета (расположенные вокруг подковообразной верхней границы цветной области). Даже цвета, значительно менее насыщенные, чем в реальных зеленых вспышках, не могут быть правильно воспроизведены на мониторе (т.е. в заштрихованная область вне треугольника Максвелла); только цвета внутри треугольника входят в гамму, которую можно воспроизвести на мониторе.

cie

Рис. 1 Диаграмма цветности CIE

Существует стандартная процедура преобразования цвета известной цветности в сигналы RGB, используемые стандартным монитором sRGB, предназначенная для правильного воспроизведения цвета. (Исходный веб-сайт sRGB исчез, но основная информация заархивирована на Wayback Machine, с которой вы, возможно, захотите ознакомиться в наши дни.) По сути, это состоит из (а) преобразования локуса спектра из основных цветов люминофора CIE в RGB, а затем (б) индивидуальную коррекцию сигналов RGB на нелинейность дисплея.

Первая проблема возникает при попытке выполнить конвертацию. Спектральные цвета далеко выходят за пределы цветовой гаммы, которую можно воспроизвести с помощью стандартных люминофоров. Это означает, что линейное преобразование основных цветов CIE в RGB дает не только значения, превышающие единицу (т. е. сигналы люминофора, превышающие 100 % полной шкалы), но и отрицательные значения .

Стандартное предписание состоит в том, чтобы усекать значения, превышающие единицу, до точного значения 1000, а отрицательные значения приравнивать к нулю. Рис. 2 показывает, что происходит, когда вы это делаете; номинальные длины волн в нанометрах отмечены на шкале в правой части спектра.

spz

Рис. 2 Номинально преобразованный спектр

Вы можете видеть, что есть несколько проблем. Во-первых, существуют области, особенно в зеленых и красных тонах, где значительный диапазон длин волн представлен одним и тем же насыщенным сигналом. Все от 462 до 466 нм — сплошная B, без G или R; все от 515 до 552 нм — сплошная G; и все от 609 до 644 нм представляет собой сплошной R. Таким образом, эти части смоделированного спектра имеют однородный цвет, в то время как реальный спектр показывает непрерывное изменение цвета повсюду.

Во-вторых, коротковолновая область ниже 450 нм, которая должна казаться «фиолетовой», на самом деле оказывается более фиолетовой, чем должна. Кроме того, эта область выглядит ярче, чем чисто-синяя часть над ней, хотя она должна выглядеть темнее; это результат добавления красного к синему для получения фиолетовой части (красный люминофор имеет гораздо более высокую визуальную яркость, чем синий). Очевидно, что в этой части изображения слишком много красного.

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

Очевидно, эти дефекты во многом являются результатом чрезмерного усечения единицы и нуля после преобразования из пространства XYZ CIE в пространство RGB. Конечно, сплошные пятна красного, зеленого и синего цвета являются результатом эффекта «обрезания». Итак, попробуем уменьшить его.

Второе приближение

Мы можем уменьшить усечение, уменьшив размер сигнала, требуемого от дисплея. В качестве первого шага я попробовал уменьшить яркость (значение CIE «Y») в 2 раза.

Изображение на рис. 3 показывает эффект этого сокращения. Насыщенные регионы сейчас почти исчезли; в красном цвете сохранилось лишь немногое, которое теперь простирается от 609 до 623 нм. Теперь происходит непрерывное изменение цвета в большей части спектра.

sp1

Рис.3  Спектр половинной интенсивности

К сожалению, у нас все еще есть некоторые проблемы. Средняя зелень по-прежнему представлена ​​чистым зеленым люминофором, хотя и с разной интенсивностью. Красный по-прежнему представляет собой чистый красный люминофор. Фиолетовая область все еще слишком красная и слишком яркая. А из-за пониженной яркости желтая область практически исчезла.

Есть и более тонкие проблемы, не столь очевидные для глаз, но числовые значения в файле PostScript, из которого было создано это изображение JPEG, раскрывают их. Например, самая яркая часть этого спектра находится в зеленом цвете при 539 нм; но это должно быть 555, где функция видимости CIE достигает максимума. Очевидно, у нас все еще есть некоторые проблемы с усечением.

Что нам действительно нужно сделать, так это вернуть спектральную цветность, которая находится за пределами гаммы, которую можно воспроизвести с помощью люминофоров sRGB, обратно к краю реализуемой гаммы. Если вы изобразите это на диаграмме цветности CIE (x,y) , проблема в том, что точка за пределами физически реализуемой гаммы всегда включает отрицательное   значение R, G или B (в линейном пространстве интенсивности, до гамма-коррекции ).

Например, в слишком красной коротковолновой области спектральные оттенки лежат ниже основного цвета B и даже ниже линии, соединяющей основные цвета B и R. Это означает, что линейное преобразование должно запросить отрицательное   количество первичного G. Но поскольку первичная обмотка G находится далеко справа (большее значение x) от первичной обмотки B, вычитание некоторого количества G из B перемещает сумму членов B и G влево от B; поэтому линейное преобразование также должно потребовать большое количество R, чтобы снова переместить полученную сумму обратно вправо.

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

Еще одна попытка

В качестве грубого приближения мы можем предположить, что линии постоянного оттенка являются линиями с постоянной доминирующей длиной волны, и проецировать каждую точку локуса спектра обратно на границу гаммы sRGB. (Это не совсем так из-за эффектов Абни и Безольда-Брюке, которые мы пока проигнорируем.) К счастью, Джон Уокер предоставил для этого программу на языке C по адресу. Вот как это работает:

Во-первых, обратите внимание, что точка белого монитора соответствует (R, G, B) = (1, 1, 1). Затем, если значение какого-либо запрошенного компонента — например, G — отрицательно, мы можем вернуть точку из локуса спектра на край BR треугольника гаммы, умножив ее смещение от белой точки на 1/(1 — Г). (Поскольку G здесь предполагается отрицательным, знаменатель дроби больше единицы, поэтому дробь меньше единицы.)

На самом деле мы хотим сохранить относительную яркость; поэтому вместо движения к белому нам нужно сжать вектор выхода за пределы диапазона к серой точке с той же яркостью Y, что и точка в спектре, который мы моделируем. Это означает, что поправочный коэффициент равен Y/(Y − G). Назовите этот поправочный коэффициент F; тогда скорректированные интенсивности G равны

Ggamut limit = Y + F * (Gspectrum − Y)

и аналогично для R и B.
sp2

Рис. 4 Спектр с ограниченной гаммой

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

У нас все еще есть небольшие проблемы. Красный люминофор имеет насыщение от 590 до 616 нм. И, конечно же, мы по-прежнему используем только половину интенсивности, поэтому четкого желтого цвета нет.

Насыщенность R в красной области указывает на то, что мы все еще пытаемся сделать спектр ярче, чем его наилучшее приближение. Проблема в том, что люминофор R сам по себе недостаточно ярок, чтобы обеспечить полную яркость, необходимую для стандартной кривой видимости в районе 600 нм. (В желто-зеленой области требуемая яркость достигается за счет добавления очень яркого G-люминофора.)

Единственный способ решить проблему насыщенности — еще больше затемнить весь спектр. Но оказывается, что нужно не так уж и много: вместо того, чтобы делить значения V(λ) на 2,0, просто разделите их на 2,34.

Спектр на рис.5  показывает результат. Это не намного темнее, чем в предыдущем приближении, но «плоское пятно» уже не красное в районе 600 нм.

sp3

Рис. 5 Спектр с ограниченной гаммой, без ограничения

Кстати, и этот, и предыдущий спектр обладают тем свойством, что все длины волн короче 464,3 нм (доминирующая длина волны B-люминофора) и длиннее 611,3 нм (доминирующая длина волны R-люминофора) изображаются как смеси R и Б. Преобладающая длина волны G-люминофора составляет 549,1 нм; Итак, как и следовало ожидать, желто-зеленый — это смесь G и R, а сине-зеленый — смесь G и B.

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

Однако то, что инженер-электронщик считает «плоским» или «белым» спектром, будет иметь постоянную мощность на единицу частоты . Спектр на рис. 6 показывает, как это будет выглядеть.

sp5

Рис. 6  Плоский частотный спектр

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

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

[Те, кто помнит свое исчисление, помнят, что изменение независимой переменной распределения вводит коэффициент отношения дифференциалов двух переменных; поскольку частота обратна длине волны, разность частот пропорциональна 1/(длина волны) ^2.

Дополнительную информацию об этой взаимосвязи см.  

B. H. Soffer, D. K. Lynch
Some paradoxes, errors, and resolutions concerning the spectral optimization of human vision
American Journal of Physics  67, 946–953 (1999)

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

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

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

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

Максимально яркий спектр

Говоря о максимальной яркости, можно создать очень эффектный (хотя и несколько искусственный) спектр, заставив все цвета в середине быть представлены чем-то максимально ярким. То есть вместо того, чтобы придерживаться кривой V(λ), давайте сделаем так, чтобы каждый цвет между доминирующими длинами волн люминофоров B и R имел большую интенсивность люминофора, масштабированную до единицы. Это отображает более или менее правильный оттенок на каждой длине волны, но игнорирует большую часть снижения зрительной чувствительности за пределами желто-зеленой области. (Он также игнорирует трудности с яркостью люминофора, которые вызвали проблему насыщенности красного цвета, показанного выше.)

Спектр на рис.7 показывает результат. Это довольно кричаще и, конечно, неестественно. Я нормализовал части в конце, чтобы они сужались в соответствии с кривой V(λ), но масштабировал так, чтобы плавно соединить искусственно яркую часть в середине.

brightspectrum

Рис.7 Максимально яркий спектр

В принципе, можно было бы распространить тот же трюк с максимальной яркостью на УФ и ИК; но поскольку края видимого спектра не показывают заметного изменения оттенка, я думаю, это было бы довольно неинтересно и даже более искусственно. Поэтому, вероятно, лучше сузить концы в соответствии с V(λ), регулируя каждый конец так, чтобы объединить максимальные интенсивности при 464.3 и 611.3 нм (доминирующие длины волн чистых синего и красного люминофоров), как это сделано здесь.

Лучший компромисс

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

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

Если яркость увеличить слишком сильно, эффект ограничения эффективных значений V для сохранения правильного оттенка без превышения максимальной яркости какого-либо отдельного люминофора приведет к неестественному виду. Если увеличение слишком незначительное, желтая область спектра выглядит неправильно. Я экспериментировал с различными вариантами увеличения яркости и обнаружил, что коэффициенты от 1,8 до 1,9 дают наилучшие результаты. Спектр на рис.8 показывает компромисс, который я принял, с увеличением интенсивности в 1,85 раза (максимум — местами меньше, чтобы избежать искажения насыщенности или оттенка).

best spectrum

Рис.8 Лучший компромиссный спектр

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

Но не на бумаге

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

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

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

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

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

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

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

© 2002–2008, 2011, 2012, 2021 Эндрю Т. Янг

Перевод с англ. оригинал статьи Эндрю Т. Янга  https://aty.sdsu.edu/explain/optics/rendering.html