Цифровое представление цвета: различия между версиями

на каком это языке?
м (орфография, викификатор)
(на каком это языке?)
[[Файл:Color-subtractive-mixing-cropped.png|thumb|150px|Три пятна краски на белой бумаге, освещённые белым светом]]
'''Цвет''' — это очень субъективное понятие. В природе существуют световые волны разной частоты. Исследования показали, что определённый диапазон частот (видимый свет) воспринимается человеческим глазом. Но воспринимается не каждая волна по отдельности, а их совокупность.
Причём есть три основных частоты, «смешивая» которые можно получить ''почти'' все воспринимаемые человеком цвета. Если эти частоты излучаются отдельно (например, лазером), то воспринимаются они как красный, зелёный и синий цвета. Отсюда родилась модель '''[[wikipedia:RGB color model|RGB]]''' модель. Она очень удобна для технической реализации в устройствах, которые свет излучают (мониторы и проекторы). Так как там из одной точки можно «посветить» тремя цветами разной интенсивности и таким образом, используя только 3 основных цвета, получать почти весь видимый спектр.
 
Надо понимать разницу между возможностью контролировать свет ''излучаемый'' и ''поглощаемый''.
 
=== XYZ ===
<div class="tright" style="clear:none">[[Файл:CIE1931xy_blank.svg|thumb|250px|плоскость ''xy'' плоскость (отмечена на изображении ''XYZ'' синим срезом). На краю, обведённом чёрным, находятся монохроматические цвета. Соответствующая им длина волны подписана синим.]]</div>
<div class="tright" style="clear:none">[[Файл:XYZ_colorspace.png|thumb|250px|XYZ]]</div>
'''[[wikipedia:CIE 1931 color space|XYZ]]''' — теоретическая модель, созданная [[wikipedia:International Commission on Illumination|CIE]] (Commission internationale de l'éclairage) на основе исследований человеческого цветовосприятия. Эта модель вмещает все видимые человеку цвета. Она разработана таким образом, что два компонента представляют цвет, а третий — яркость (Y).
 
=== XYY ===
Для иллюстраций используют модель '''xyY''', получающуюся из XYZ простыми преобразованиями. При этом трёхмерными изображениями обычно не заморачиваются и компонент яркости отбрасывается. Получающаяся диаграмма '''xy''' диаграмма имеет одно замечательное свойство: если выбрать на ней три основных (''primary'') цвета, то внутри образуемого ими треугольника окажутся все цвета, которые можно представить при помощи этих праймари. Вообще, это распространяется на любой n-угольник. На этом свойстве и основана RGB модель RGB.
 
=== RGB и YCbCr ===
'''RGB''' удобна для захвата цветов камерой и воспроизведения их на мониторе или проекторе. Однако для передачи и кодирования сигнала она мало пригодна по нескольким причинам:
# Считается, что человеческий глаз больше замечает изменения яркости, чем цветности. RGBМодель модельRGB не позволяет это использовать.
# Когда появилось цветное телевидение, необходимо было сохранить совместимость с чёрно-белыми телевизорами.
Поэтому для передачи цветного сигнала была разработана модель [[wikipedia:YUV|YUV]], которая использовала один компонент (Y) для передачи яркости (чёрно-белое телевидение) и два дополнительных компонента (UV) для передачи цвета. В цифровом кодировании схожая модель зовётся '''[[wikipedia:YCbCr|YCbCr]]'''.
Коэффициенты <math>K_R</math> и <math>K_B</math> (''matrix coefficients'') зависят от используемого цветового пространства и отдельно определяются соответствующими стандартами. При этом стандарты, использующие одинаковые праймари и точку белого, могут декларировать разные коэффициенты преобразования, и наоборот.
 
== Гамма -коррекция ==
Воспринимаемая человеком яркость изображения ([[wikipedia:Lightness (color)|lightness]]) нелинейно зависит от «реальной» яркости ([[wikipedia:Luminance (relative)|luminance]]): тёмные оттенки человек различает лучше чем светлые. Чтобы избежать неравномерных потерь при передаче и кодировании сигнала, линейные значения RGB или YCbCr должны быть преобразованы в нелинейные R’G’B' или Y’CbCr. Такое преобразование называется '''гамма -коррекцией'''. Сама функция преобразования (''transfer characteristics'') определяется различными стандартами по-разному.
 
В теории гамма -коррекция должна производиться после конвертации RGB → YCbCr при записи данных, а обратное преобразование — перед конвертацией YCbCr → RGB при воспроизведении. То есть RGB → YCbCr → Y’CbCr → … → Y’CbCr → YCbCr → RGB. На практике же применяется цепочка RGB → R’G’B' → Y’CbCr → … → Y’CbCr → R’G’B' → RGB. Эта инженерная уловка использовалась для того, чтобы избежать двойного преобразования в ЭЛТ -мониторах. Яркость пикселя на таком мониторе нелинейно зависит от подаваемого напряжения, причём эта зависимость очень похожа на функцию обратной гамма -коррекции. Компонент Y' (''luma''), полученный из R’G’B', не соответствует теоретической яркости Y (''luminance''), получаемой из RGB. Это приводит к определённым артефактам, проявляющимся при использовании chroma subsampling (например, тёмная полоска на границе зелёный — маджента).
* [http://www.poynton.com/notes/colour_and_gamma/GammaFAQ.html Gamma FAQ], Charles Poynton
* [http://www.poynton.com/notes/color/GammaFQA.html Gamma FQA], Charles Poynton
В некоторых случаях входящий сигнал может содержать полезную информацию в областях BTB/WTW. Студийные мониторы должны корректно отображать такие цвета. Однако к домашнему оборудованию и условиям просмотра предъявляются гораздо более мягкие требования, и более комфортным может оказаться отображение только уровней 16..235. Иначе говоря, нужно определиться, будете ли вы масштабировать сигнал 16..235 в 0..255 или будете сохранять области BTB/WTW (в которых ничего полезного может и не быть), жертвуя контрастом.
 
При выполнении преобразования YCbCr → RGB преобразования в [[wikipedia:ffdshow|ffdshow]], имеетсяесть возможность как автоматического выбора между Full range и TV -диапазоном (учитывая и флаг H.264), так и ручной установки уровней Y (количество уровней CbCr изменяется пропорционально).
 
Также в ffdshow имеется фильтр Levels, позволяющий динамически изменять диапазон при появлении BTB/WTW. Но, так как этот фильтр работает с 8-ми битными значениями, его использование может привести к появлению banding’а.
 
Полностью сохранить сигнал в областях BTB/WTW можно также, установив входные уровни YCbCr равными 16..235(240) и уровни вывода RGB равными 16..235. При этом стоит убедиться, что уровни 1..15 и 236..254 нигде не обрезаются.
 
=== YCbCr → RGB ===
Коэффициенты преобразования YCbCr → RGB могут отличаться для контента различной природы. Так, для SD -видео обычно используются коэффициенты описанные в стандарте BT.601, а для HD — BT.709. При использовании неверных коэффициентов происходит слабо заметное искажение цветов. Например, лица людей становятся розовее или желтее.
 
Многие форматы (H.264, MPEG-2, VC-1, Theora, JPEG SPIFF) поддерживают указание matrix_coefficients в виде метаинформации. Однако, наиболее распространён метод выбора коэффициентов на основании разрешения видео. Например, рендереры VMR7 и VMR9 используют BT.601, если высота кадра < 720, а BT.709, если высота ≥ 720. Таким образом, 720p видео 720p, кропнутое по высоте, будет воспроизводиться с неправильными коэффициентами. ffdshow использует более разумные критерии:
* если установлен флаг в потоке H.264, то используются соответствующие коэффициенты;
* для Fraps используется BT.709;
=== Дополнительный рендеринг ===
[[Файл:Bartleson-Breneman effect.png|thumb|200px|Эффект Бартлесона — Бренемана. Квадраты в каждом ряду имеют одинаковый цвет. Тем не менее, на более тёмном фоне они кажутся светлее. Причём, чем темнее цвет квадрата, тем больше на нём сказывается эффект окружения. Это и вызывает разницу в контрастности между столбцами.]]
В некоторых случаях может понадобиться дополнительная коррекция изображения. Например, изменение цветового пространства и гаммы в соответствии с параметрами монитора. Это можно сделать с помощью [http://forum.doom9.org/showthread.php?t=154719 yCMS] (madVR, [[wikipedia:AviSynth|AviSynth]]) или [[wikipedia:ICC profile|ICC -профиля]].
 
Необходимо понимать, что на восприятие человеком изображения влияет множество вторичных факторов, среди которых:
* Эффект Стивенса (''Stevens effect'') — воспринимаемая контрастность увеличивается с увеличением яркости.
* Эффект Бартлесона — Бренемана (''Bartleson-Breneman effect'') — более тёмная окружающая обстановка уменьшает воспринимаемую контрастность.
* Эффект Ханта (''Hunt effect'') — насыщенность увеличивается с увеличением яркости. Например, цветы при дневном свете (около 30000 [[wikipedia:Candela per square metre|cd/m<sup>2</sup>]]) выглядят красочнее, чем при сумеречном (около 300 cd/m<sup>2</sup>). Если изображение снято днём, но отображается на мониторе яркостью 300 cd/m<sup>2</sup> без модификации RGB данных RGB, то будет казаться, что оно было снято в сумерках.
Традиционно для компенсации этих эффектов при воспроизведении используется несколько большее значение гаммы, чем было использовано при съёмке камерой. Так, студийные мониторы, предназначенные для просмотра в тёмном окружении, используют γ ≈ 2.4, в то время как при съёмке используется кривая с показателем 1/γ ≈ 1/2. Для мониторов, используемых в светлых помещениях, подойдёт γ ≈ 2.2 (sRGB).
* [http://poynton.com/notes/PU-PR-IS/ Perceptual uniformity, picture rendering, image state, and BT.709], Charles Poynton
Для правильного ресайза должны использоваться линейные, а не гамма-корректированные значения компонентов. При ресайзе в большее разрешение это не существенно, однако при уменьшении разрешения неверный ресайз может приводить к заметным проблемам.
 
Встроенные функции Avisynth этого не учитывают, а кроме того, имеют ряд багов chroma shift багов, часть из которых не исправлена и в версии 2.6a3.
 
Ресайз над линейными компонентами можно производить при помощи [http://forum.doom9.org/showthread.php?t=153589 Dither Tools] ([http://forum.doom9.org/showthread.php?p=1545110#post1545110 пример]) или [http://forum.doom9.org/showthread.php?t=160038 ResampleHQ]. Однако в последнем присутствуют некоторые [http://forum.doom9.org/showthread.php?p=1546299#post1546299 баги].
Если при создании рипа производится ресайз из HD в SD, то следует скорректировать значения YCbCr так, чтобы при воспроизведении цвета не искажались из-за ошибочного выбора коэффициентов (для SD традиционно используются BT.601, для HD — BT.709). В Avisynth это можно сделать выполняя ресайз при помощи Dither Tools или ResampleHQ, а также плагинами ColorMatrix и t3dlut. Сама по себе коррекция коэффициентов не требует преобразования в RGB.
 
При кодировании следует указывать используемые коэффициенты в метаданных (параметр --colormatrix для x264). Эта информация может использоваться либо когда конвертация в RGB производится декодером, либо отдельными связками декодер + рендерер (LAV Video + madVR). В большинстве же случаев, флаг colormatrix игнорируется и коэффициенты выбираются на основе разрешения видео.
Тем не менее, выставленный флаг позволяет понять, корректировались ли коэффициенты.
 
11

правок