Цифровое представление цвета

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

Введение[править]

Белая стена, освещённая тремя прожекторами
Три пятна краски на белой бумаге, освещённые белым светом

Цвет — это очень субъективное понятие. В природе существуют световые волны разной частоты. Исследования показали, что определённый диапазон частот (видимый свет) воспринимается человеческим глазом. Но воспринимается не каждая волна по отдельности, а их совокупность. Причём есть три основных частоты, «смешивая» которые можно получить почти все воспринимаемые человеком цвета. Если эти частоты излучаются отдельно (например, лазером), то воспринимаются они как красный, зелёный и синий цвета. Отсюда родилась модель RGB. Она очень удобна для технической реализации в устройствах, которые свет излучают (мониторы и проекторы). Так как там из одной точки можно «посветить» тремя цветами разной интенсивности и таким образом, используя только 3 основных цвета, получать почти весь видимый спектр.

Надо понимать разницу между возможностью контролировать свет излучаемый и поглощаемый.

Если на белую стену посветить красным, зелёным и синим прожекторами, то на пересечении областей мы получим участки, которые «излучают» сразу два цвета: красный + зелёный = yellow, зелёный + синий = cyan, синий + красный = magenta. В данном случае мы контролируем излучаемый свет, тем самым добавляя основные цвета друг к другу в нужных пропорциях (аддитивная модель).

Но представим ситуацию, когда мы не можем излучать свет самостоятельно. Это случай журналов и картин. В природе естественным является белый свет — смесь волн разной частоты, но примерно одинаковой энергии (тепловое излучение). Когда этот свет попадает на поверхность, покрытую определённым веществом, волны одних частот от неё отражаются, волны других частот поглощаются веществом. Тогда можно взять три основных вещества (краски), которые по отдельности отражают только цвета cyan, magenta и yellow, и, смешивая их в определённой пропорции, получить почти все существующие цвета. Таким образом мы контролируем поглощаемый свет, вычитая из белого ненужные нам цвета (субтрактивная модель).

Например, смешивая cyan (голубой; поглощает красный, отражает зелёный и синий) и magenta (розовый; поглощает зелёный, отражает красный и синий) мы получаем поверхность, которая поглащает красный и зелёный и, соответственно, отражает только синий. Отсюда появилась цветовая схема CMYK, которая используется при печати. «K» означает четвёртую, чёрную, краску. Её используют по техническим соображениям.

Цветовые модели[править]

XYZ[править]

плоскость xy (отмечена на изображении XYZ синим срезом). На краю, обведённом чёрным, находятся монохроматические цвета. Соответствующая им длина волны подписана синим.
XYZ

XYZ — теоретическая модель, созданная CIE (Commission internationale de l'éclairage) на основе исследований человеческого цветовосприятия. Эта модель вмещает все видимые человеку цвета. Она разработана таким образом, что два компонента представляют цвет, а третий — яркость (Y).

xyY[править]

Для иллюстраций используют модель xyY, получающуюся из XYZ простыми преобразованиями. При этом трёхмерными изображениями обычно не заморачиваются и компонент яркости отбрасывается. Получающаяся диаграмма xy имеет одно замечательное свойство: если выбрать на ней три основных (primary) цвета, то внутри образуемого ими треугольника окажутся все цвета, которые можно представить при помощи этих праймари. Вообще, это распространяется на любой n-угольник. На этом свойстве и основана модель RGB.

RGB и YCbCr[править]

RGB удобна для захвата цветов камерой и воспроизведения их на мониторе или проекторе. Однако для передачи и кодирования сигнала она мало пригодна по нескольким причинам:

  1. Считается, что человеческий глаз больше замечает изменения яркости, чем цветности. Модель RGB не позволяет это использовать.
  2. Когда появилось цветное телевидение, необходимо было сохранить совместимость с чёрно-белыми телевизорами.

Поэтому для передачи цветного сигнала была разработана модель YUV, которая использовала один компонент (Y) для передачи яркости (чёрно-белое телевидение) и два дополнительных компонента (UV) для передачи цвета. В цифровом кодировании схожая модель зовётся YCbCr.

Цветовые пространства[править]

CIE RGB
sRGB
ITU-R BT.709, EBU Tech. 3213, SMPTE C (SMPTE RP 145), sRGB

Цветовое пространство (gamut) модели RGB определяется выбором праймари и точки белого. Часто выбор диктуется некими практическими соображениями, например, наличием в производстве соответствующего люминофора.

CIE RGB[править]

Это пространство основано на трёх монохроматических цветах. E — точка белого.

sRGB[править]

Стандарт, созданный HP и Microsoft в 1996 году. Данный стандарт применяется повсеместно: компьютерные мониторы, интернет, принтеры…

RGB → YCbCr[править]

Преобразование из RGB в YCbCr выполняется по формуле:

Причём, .

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

Гамма-коррекция[править]

Воспринимаемая человеком яркость изображения (lightness) нелинейно зависит от «реальной» яркости (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 (например, тёмная полоска на границе зелёный — маджента).

Chroma subsampling[править]

Chroma subsampling

Как уже упоминалось, считается, что человек сильнее воспринимает изменения яркости, чем изменения цветности. Так как YCbCr кодирует яркость (Y) и цветность (CbCr) отдельно, то эта особенность человеческого восприятия позволяет сохранять компоненты цветности с меньшим разрешением, чем компонент яркости. Называется это chroma subsampling.

Расмотрим 2 строки по 4 пикселя в каждой. В обычном случае мы имеем по 4 значения Y для каждой строки, и по 4 значения Cb и Cr для каждой из двух строк. Это описывается соотношением 4:4:4.

В общем виде записывается как J:a:b, где J — ширина рассматриваемой строки (всегда равна количеству Y-сэмплов в каждой из строк), a — количество Cb и Cr сэмплов в первой строке, b — количество Cb и Cr сэмплов во второй строке.

Например, «4:2:0»: 4(сэмпла яркости на каждую строку):2(сэмпла цветности на первую строку):0(сэмплов цветности на вторую строку — используется тот же цвет, что и в первой строке). Таким образом, на блок из четырёх пикселей приходится только один сэмпл цветности. Это наиболее используемый и поддерживаемый тип сабсэмплинга.

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

Уровни[править]

Для передачи цифрового сигнала чаще всего используется 8 бит на сэмпл. То есть Y, Cb и Cr могут принимать значения 0..255. Однако, из-за аналоговой природы большинства телевизионных стандартов, для видео используется не весь диапазон значений.

Согласно стандартам (BT.601, BT.709) чёрному цвету должно соответствовать Y = 16, белому Y = 235. Для Cb и Cr базовыми являются значения 16 и 240. Таким образом, яркость имеет 220 уровней (quantization levels), цветность — 225. При этом сигнал может содержать и значения 1..15 — footroom, и 236..254 (241..254) — headroom. Значения 0 и 255 — служебные.

Соответственно, нормализованные значения R, G, B, полученные из такого сигнала, могут выходить за пределы отрезка [0; 1], образуя так называемые области BTB (Blacker Than Black — чернее чёрного) и WTW (Whiter Than White — белее белого). В некоторых случаях это происходит из-за того, что при мастеринге видео уровень белого был намеренно выбран ниже максимального значения исходного сигнала (или/и уровень чёрного выше минимального).

Если для передачи сигнала используется больше 8-ми бит, то дополнительные биты являются младшими. Например, для 10-ти битного сигнала базовыми значениями Y (уровнями чёрного и белого) будут и , разрешёнными — 4..1019. Нулевой уровень цветности будет приходиться на .

Full range[править]

Некоторые, изначально цифровые, стандарты (JPEG, M-JPEG, Fraps) используют полный диапазон значений. То есть чёрному соответствует 0, белому — 255 (точнее, ). Нулевому уровню цветности — 128 (). В H.264 для такого сигнала предусмотрен флаг Full range.

Воспроизведение[править]

Для корректного воспроизведения видео должны быть выполнены следующие шаги:

  1. Выбор базовых уровней входящего сигнала.
  2. Chroma upsampling.
  3. Конвертация YCbCr → RGB с использованием правильных коэффициентов.
  4. Дополнительная коррекция изображения для конкретного устройства вывода.

Выбор уровней[править]

В некоторых случаях входящий сигнал может содержать полезную информацию в областях BTB/WTW. Студийные мониторы должны корректно отображать такие цвета. Однако к домашнему оборудованию и условиям просмотра предъявляются гораздо более мягкие требования, и более комфортным может оказаться отображение только уровней 16..235. Иначе говоря, нужно определиться, будете ли вы масштабировать сигнал 16..235 в 0..255 или будете сохранять области BTB/WTW (в которых ничего полезного может и не быть), жертвуя контрастом.

При выполнении преобразования YCbCr → RGB в 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 нигде не обрезаются.

То, что уровни могут быть изменены сразу в нескольких местах (рендерер, декодер, промежуточные фильтры, настройки видеокарты, шейдеры), может привести к нежелательным последствиям, например, к двойному преобразованию 16..235 → 0..255.

Ресайз[править]

Методы ресайза в madVR

Ресайз (resize — изменение размеров) при просмотре видео выполняется по нескольким причинам:

  • chroma upsampling;
  • соотношение сторон пикселя (Sample Aspect Ratio) отличное от 1:1;
  • несоответствие разрешения видео разрешению монитора.

То есть, даже если вы смотрите 720p на соответствующем мониторе, вам всё равно необходим качественный метод ресайза для компенсации chroma subsampling. Ресайз, как правило, выполняется рендерером. Наиболее продвинутым в этом плане является madVR. VMR9, EVR Custom и Haali renderer также позволяют в некоторой степени изменять метод ресайза.

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, кропнутое по высоте, будет воспроизводиться с неправильными коэффициентами. ffdshow использует более разумные критерии:

  • если установлен флаг в потоке H.264, то используются соответствующие коэффициенты;
  • для Fraps используется BT.709;
  • для JPEG и M-JPEG — BT.601;
  • если высота ≥ 600 или ширина > 1024 — BT.709;
  • если высота < 600 и ширина ≤ 1024 — BT.601.

Также компенсировать неверный выбор коэффициентов можно используя шейдеры в MPC-HC.

Преобразование в RGB подразумевает предварительный chroma upsampling. Качественно его могут выполнять, например, ffdshow и madVR. Первый делает это программно, второй — нещадно используя ресурсы видеокарты.

Говорят, что информация о праймари, коэффициентах и гамме может содержаться не только в метаданных, но и в самом потоке: «Some digital video signals can carry a video index (see SMPTE RP 186—1995) which explicitly labels the primaries, transferFunction, and matrix of the signal.»

Дополнительный рендеринг[править]

Эффект Бартлесона — Бренемана. Квадраты в каждом ряду имеют одинаковый цвет. Тем не менее, на более тёмном фоне они кажутся светлее. Причём, чем темнее цвет квадрата, тем больше на нём сказывается эффект окружения. Это и вызывает разницу в контрастности между столбцами.

В некоторых случаях может понадобиться дополнительная коррекция изображения. Например, изменение цветового пространства и гаммы в соответствии с параметрами монитора. Это можно сделать с помощью yCMS (madVR, AviSynth) или ICC-профиля.

Необходимо понимать, что на восприятие человеком изображения влияет множество вторичных факторов, среди которых:

  • Эффект Стивенса (Stevens effect) — воспринимаемая контрастность увеличивается с увеличением яркости.
  • Эффект Бартлесона — Бренемана (Bartleson-Breneman effect) — более тёмная окружающая обстановка уменьшает воспринимаемую контрастность.
  • Эффект Ханта (Hunt effect) — насыщенность увеличивается с увеличением яркости. Например, цветы при дневном свете (около 30000 cd/m2) выглядят красочнее, чем при сумеречном (около 300 cd/m2). Если изображение снято днём, но отображается на мониторе яркостью 300 cd/m2 без модификации данных RGB, то будет казаться, что оно было снято в сумерках.

Традиционно для компенсации этих эффектов при воспроизведении используется несколько большее значение гаммы, чем было использовано при съёмке камерой. Так, студийные мониторы, предназначенные для просмотра в тёмном окружении, используют γ ≈ 2.4, в то время как при съёмке используется кривая с показателем 1/γ ≈ 1/2. Для мониторов, используемых в светлых помещениях, подойдёт γ ≈ 2.2 (sRGB).

Кодирование[править]

Ресайз[править]

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

Встроенные функции Avisynth этого не учитывают, а кроме того, имеют ряд багов chroma shift, часть из которых не исправлена и в версии 2.6a3.

Ресайз над линейными компонентами можно производить при помощи Dither Tools (пример) или ResampleHQ. Однако в последнем присутствуют некоторые баги.

Коррекция коэффициентов[править]

Если при создании рипа производится ресайз из HD в SD, то следует скорректировать значения YCbCr так, чтобы при воспроизведении цвета не искажались из-за ошибочного выбора коэффициентов (для SD традиционно используются BT.601, для HD — BT.709). В Avisynth это можно сделать выполняя ресайз при помощи Dither Tools или ResampleHQ, а также плагинами ColorMatrix и t3dlut. Сама по себе коррекция коэффициентов не требует преобразования в RGB.

При кодировании следует указывать используемые коэффициенты в метаданных (параметр --colormatrix для x264). Эта информация может использоваться либо когда конвертация в RGB производится декодером, либо отдельными связками декодер + рендерер (LAV Video + madVR). В большинстве же случаев флаг colormatrix игнорируется и коэффициенты выбираются на основе разрешения видео. Тем не менее, выставленный флаг позволяет понять, корректировались ли коэффициенты.

Стандарты[править]

Standard Primaries (x; y)
R, G, B, White
Matrix coefficients
KR; KB
Transfer characteristics
IEC 61966-2-4 (xvYCC) (0.640; 0.330),
(0.300; 0.600),
(0.150; 0.060),
D65 (0.3127; 0.3290)
xvYCC601:
0.299; 0.114

xvYCC709:
0.2126; 0.0722
SMPTE RP 177 Annex B 0.2126; 0.0722 ?
BT.1361 extended gamut

BT.1361 conventional gamut

BT.709-5 Part 2
SMPTE 274M
SMPTE 295M
SMPTE 296M
EBU Tech 3299
FCC 73.682 (0.67; 0.33),
(0.21; 0.71),
(0.14; 0.08),
C (0.310; 0.316)
0.30; 0.11 γ = 2.2
NTSC 1953 0.299; 0.114
BT.470-6 System M/NTSC
BT.470-6 System M/PAL γ = 2.8
BT.470-6 System B, G, I, … (0.64; 0.33),
(0.29; 0.60),
(0.15; 0.06),
D65 (0.3127; 0.3290)
BT.1700 625 PAL/SECAM γ = 2.2
BT.601-6 625

BT.1358 625
BT.601-6 525 (0.630; 0.340),
(0.310; 0.595),
(0.155; 0.070),
D65 (0.3127; 0.3290)
BT.1358 525
SMPTE 170M
BT.1700 NTSC
SMPTE 293M
SMPTE 240M 0.212; 0.087

SMPTE 260M
SMPTE RP 145 «SMPTE C» ?
BT.1700 525 PAL (0.630; 0.340),
(0.310; 0.595),
(0.155; 0.070),
C (0.3101; 0.3162)
0.299; 0.114 γ = 2.2
EBU Tech 3213 (0.64; 0.33),
(0.29; 0.60),
(0.15; 0.06),
D65 (0.313; 0.329)
-
H.264 Annex E: Generic film Wratten 25 (0.681; 0.319),
Wratten 58 (0.243; 0.692),
Wratten 47 (0.145; 0.049),
C (0.310; 0.316)
-
H.264 Annex E: Linear transfer characteristics -

H.264 Annex E: Logarithmic transfer characteristic (100:1 range)

H.264 Annex E: Logarithmic transfer characteristic (100*Sqrt(10):1 range)

Примечания[править]

  • BT.709-1 указывал коэффициенты KR = 0.2125, KB = 0.0721, но в BT.709-2 они были изменены (Y′CbCr Video in QuickTime, Wilbert’s post).
  • BT.709 содержит также Part 1 «HDTV systems related to conventional television», которая определяет другие matrix coefficients для 1250/50/2:1 (KR = 0.299; KB = 0.114). При этом стандарт рекомендует использовать Part 2 при создании нового контента.
  • BT.470 — устаревший стандарт аналогового телевидения, в последней редакции которого (BT.470-7) просто рекомендуется использовать BT.1700. Однако его по-прежнему упоминают в том или ином виде. Иногда ещё и с ошибками, как в этом MSDN (перепутали «System B, G» и «System M»). Кстати, в той же статье ссылаются на некий «EBU Tech 3212», видимо, подразумевая EBU Tech 3213.
  • BT.1700 ссылается на SMPTE 170M (2004) для описания NTSC.
  • SMPTE 170M упоминает, что, в то время как коэффициенты NTSC 1953 публиковались в виде KR = 0.30, KB = 0.11, при разработке спецификации использовались именно KR = 0.299; KB = 0.114.

Источники[править]

Первичные:

  • Сами стандарты. Не проверены SMPTE 240M, SMPTE 260M, SMPTE 293M, SMPTE 295M, SMPTE RP 145, SMPTE RP 177, NTSC 1953, IEC 61966-2-4.

Вторичные:

Литература[править]

  • «Digital Video and HDTV: Algorithms and Interfaces», Charles Poynton
  • «The Reproduction of Colour» (6th Edition), R.W.G. Hunt (перевод Алексей Шадрин)
  • «Video Demystified. A Handbook for the Digital Engineer» (5th Edition), Jack K.

Ссылки[править]