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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
м орфография, викификатор
на каком это языке?
Строка 11: Строка 11:
[[Файл:Color-subtractive-mixing-cropped.png|thumb|150px|Три пятна краски на белой бумаге, освещённые белым светом]]
[[Файл:Color-subtractive-mixing-cropped.png|thumb|150px|Три пятна краски на белой бумаге, освещённые белым светом]]
'''Цвет''' — это очень субъективное понятие. В природе существуют световые волны разной частоты. Исследования показали, что определённый диапазон частот (видимый свет) воспринимается человеческим глазом. Но воспринимается не каждая волна по отдельности, а их совокупность.
'''Цвет''' — это очень субъективное понятие. В природе существуют световые волны разной частоты. Исследования показали, что определённый диапазон частот (видимый свет) воспринимается человеческим глазом. Но воспринимается не каждая волна по отдельности, а их совокупность.
Причём есть три основных частоты, «смешивая» которые можно получить ''почти'' все воспринимаемые человеком цвета. Если эти частоты излучаются отдельно (например, лазером), то воспринимаются они как красный, зелёный и синий цвета. Отсюда родилась '''[[wikipedia:RGB color model|RGB]]''' модель. Она очень удобна для технической реализации в устройствах, которые свет излучают (мониторы и проекторы). Так как там из одной точки можно «посветить» тремя цветами разной интенсивности и таким образом, используя только 3 основных цвета, получать почти весь видимый спектр.
Причём есть три основных частоты, «смешивая» которые можно получить ''почти'' все воспринимаемые человеком цвета. Если эти частоты излучаются отдельно (например, лазером), то воспринимаются они как красный, зелёный и синий цвета. Отсюда родилась модель '''[[wikipedia:RGB color model|RGB]]'''. Она очень удобна для технической реализации в устройствах, которые свет излучают (мониторы и проекторы). Так как там из одной точки можно «посветить» тремя цветами разной интенсивности и таким образом, используя только 3 основных цвета, получать почти весь видимый спектр.


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


=== XYZ ===
=== XYZ ===
<div class="tright" style="clear:none">[[Файл:CIE1931xy_blank.svg|thumb|250px|''xy'' плоскость (отмечена на изображении ''XYZ'' синим срезом). На краю, обведённом чёрным, находятся монохроматические цвета. Соответствующая им длина волны подписана синим.]]</div>
<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>
<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).
'''[[wikipedia:CIE 1931 color space|XYZ]]''' — теоретическая модель, созданная [[wikipedia:International Commission on Illumination|CIE]] (Commission internationale de l'éclairage) на основе исследований человеческого цветовосприятия. Эта модель вмещает все видимые человеку цвета. Она разработана таким образом, что два компонента представляют цвет, а третий — яркость (Y).


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


=== RGB и YCbCr ===
=== RGB и YCbCr ===
'''RGB''' удобна для захвата цветов камерой и воспроизведения их на мониторе или проекторе. Однако для передачи и кодирования сигнала она мало пригодна по нескольким причинам:
'''RGB''' удобна для захвата цветов камерой и воспроизведения их на мониторе или проекторе. Однако для передачи и кодирования сигнала она мало пригодна по нескольким причинам:
# Считается, что человеческий глаз больше замечает изменения яркости, чем цветности. RGB модель не позволяет это использовать.
# Считается, что человеческий глаз больше замечает изменения яркости, чем цветности. Модель RGB не позволяет это использовать.
# Когда появилось цветное телевидение, необходимо было сохранить совместимость с чёрно-белыми телевизорами.
# Когда появилось цветное телевидение, необходимо было сохранить совместимость с чёрно-белыми телевизорами.
Поэтому для передачи цветного сигнала была разработана модель [[wikipedia:YUV|YUV]], которая использовала один компонент (Y) для передачи яркости (чёрно-белое телевидение) и два дополнительных компонента (UV) для передачи цвета. В цифровом кодировании схожая модель зовётся '''[[wikipedia:YCbCr|YCbCr]]'''.
Поэтому для передачи цветного сигнала была разработана модель [[wikipedia:YUV|YUV]], которая использовала один компонент (Y) для передачи яркости (чёрно-белое телевидение) и два дополнительных компонента (UV) для передачи цвета. В цифровом кодировании схожая модель зовётся '''[[wikipedia:YCbCr|YCbCr]]'''.
Строка 66: Строка 66:
Коэффициенты <math>K_R</math> и <math>K_B</math> (''matrix coefficients'') зависят от используемого цветового пространства и отдельно определяются соответствующими стандартами. При этом стандарты, использующие одинаковые праймари и точку белого, могут декларировать разные коэффициенты преобразования, и наоборот.
Коэффициенты <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'') определяется различными стандартами по-разному.
Воспринимаемая человеком яркость изображения ([[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 (например, тёмная полоска на границе зелёный — маджента).
В теории гамма-коррекция должна производиться после конвертации 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/colour_and_gamma/GammaFAQ.html Gamma FAQ], Charles Poynton
* [http://www.poynton.com/notes/color/GammaFQA.html Gamma FQA], Charles Poynton
* [http://www.poynton.com/notes/color/GammaFQA.html Gamma FQA], Charles Poynton
Строка 117: Строка 117:
В некоторых случаях входящий сигнал может содержать полезную информацию в областях BTB/WTW. Студийные мониторы должны корректно отображать такие цвета. Однако к домашнему оборудованию и условиям просмотра предъявляются гораздо более мягкие требования, и более комфортным может оказаться отображение только уровней 16..235. Иначе говоря, нужно определиться, будете ли вы масштабировать сигнал 16..235 в 0..255 или будете сохранять области BTB/WTW (в которых ничего полезного может и не быть), жертвуя контрастом.
В некоторых случаях входящий сигнал может содержать полезную информацию в областях BTB/WTW. Студийные мониторы должны корректно отображать такие цвета. Однако к домашнему оборудованию и условиям просмотра предъявляются гораздо более мягкие требования, и более комфортным может оказаться отображение только уровней 16..235. Иначе говоря, нужно определиться, будете ли вы масштабировать сигнал 16..235 в 0..255 или будете сохранять области BTB/WTW (в которых ничего полезного может и не быть), жертвуя контрастом.


При выполнении YCbCr → RGB преобразования в [[wikipedia:ffdshow|ffdshow]], имеется возможность как автоматического выбора между Full range и TV диапазоном (учитывая и флаг H.264), так и ручной установки уровней Y (количество уровней CbCr изменяется пропорционально).
При выполнении преобразования YCbCr → RGB в [[wikipedia:ffdshow|ffdshow]] есть возможность как автоматического выбора между Full range и TV-диапазоном (учитывая и флаг H.264), так и ручной установки уровней Y (количество уровней CbCr изменяется пропорционально).


Также в ffdshow имеется фильтр Levels, позволяющий динамически изменять диапазон при появлении BTB/WTW. Но, так как этот фильтр работает с 8-ми битными значениями, его использование может привести к появлению banding’а.
Также в ffdshow имеется фильтр Levels, позволяющий динамически изменять диапазон при появлении BTB/WTW. Но, так как этот фильтр работает с 8-битными значениями, его использование может привести к появлению banding’а.


Полностью сохранить сигнал в областях BTB/WTW можно также, установив входные уровни YCbCr равными 16..235(240) и уровни вывода RGB равными 16..235. При этом стоит убедиться, что уровни 1..15 и 236..254 нигде не обрезаются.
Полностью сохранить сигнал в областях BTB/WTW можно также, установив входные уровни YCbCr равными 16..235(240) и уровни вывода RGB равными 16..235. При этом стоит убедиться, что уровни 1..15 и 236..254 нигде не обрезаются.
Строка 136: Строка 136:


=== YCbCr → RGB ===
=== YCbCr → RGB ===
Коэффициенты преобразования YCbCr → RGB могут отличаться для контента различной природы. Так, для SD видео обычно используются коэффициенты описанные в стандарте BT.601, а для HD — BT.709. При использовании неверных коэффициентов происходит слабо заметное искажение цветов. Например, лица людей становятся розовее или желтее.
Коэффициенты преобразования 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, MPEG-2, VC-1, Theora, JPEG SPIFF) поддерживают указание matrix_coefficients в виде метаинформации. Однако наиболее распространён метод выбора коэффициентов на основании разрешения видео. Например, рендереры VMR7 и VMR9 используют BT.601, если высота кадра < 720, а BT.709, если высота ≥ 720. Таким образом, видео 720p, кропнутое по высоте, будет воспроизводиться с неправильными коэффициентами. ffdshow использует более разумные критерии:
* если установлен флаг в потоке H.264, то используются соответствующие коэффициенты;
* если установлен флаг в потоке H.264, то используются соответствующие коэффициенты;
* для Fraps используется BT.709;
* для Fraps используется BT.709;
Строка 156: Строка 156:
=== Дополнительный рендеринг ===
=== Дополнительный рендеринг ===
[[Файл:Bartleson-Breneman effect.png|thumb|200px|Эффект Бартлесона — Бренемана. Квадраты в каждом ряду имеют одинаковый цвет. Тем не менее, на более тёмном фоне они кажутся светлее. Причём, чем темнее цвет квадрата, тем больше на нём сказывается эффект окружения. Это и вызывает разницу в контрастности между столбцами.]]
[[Файл:Bartleson-Breneman effect.png|thumb|200px|Эффект Бартлесона — Бренемана. Квадраты в каждом ряду имеют одинаковый цвет. Тем не менее, на более тёмном фоне они кажутся светлее. Причём, чем темнее цвет квадрата, тем больше на нём сказывается эффект окружения. Это и вызывает разницу в контрастности между столбцами.]]
В некоторых случаях может понадобиться дополнительная коррекция изображения. Например, изменение цветового пространства и гаммы в соответствии с параметрами монитора. Это можно сделать с помощью [http://forum.doom9.org/showthread.php?t=154719 yCMS] (madVR, [[wikipedia:AviSynth|AviSynth]]) или [[wikipedia:ICC profile|ICC профиля]].
В некоторых случаях может понадобиться дополнительная коррекция изображения. Например, изменение цветового пространства и гаммы в соответствии с параметрами монитора. Это можно сделать с помощью [http://forum.doom9.org/showthread.php?t=154719 yCMS] (madVR, [[wikipedia:AviSynth|AviSynth]]) или [[wikipedia:ICC profile|ICC-профиля]].


Необходимо понимать, что на восприятие человеком изображения влияет множество вторичных факторов, среди которых:
Необходимо понимать, что на восприятие человеком изображения влияет множество вторичных факторов, среди которых:
* Эффект Стивенса (''Stevens effect'') — воспринимаемая контрастность увеличивается с увеличением яркости.
* Эффект Стивенса (''Stevens effect'') — воспринимаемая контрастность увеличивается с увеличением яркости.
* Эффект Бартлесона — Бренемана (''Bartleson-Breneman 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 данных, то будет казаться, что оно было снято в сумерках.
* Эффект Ханта (''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, то будет казаться, что оно было снято в сумерках.
Традиционно для компенсации этих эффектов при воспроизведении используется несколько большее значение гаммы, чем было использовано при съёмке камерой. Так, студийные мониторы, предназначенные для просмотра в тёмном окружении, используют γ ≈ 2.4, в то время как при съёмке используется кривая с показателем 1/γ ≈ 1/2. Для мониторов, используемых в светлых помещениях, подойдёт γ ≈ 2.2 (sRGB).
Традиционно для компенсации этих эффектов при воспроизведении используется несколько большее значение гаммы, чем было использовано при съёмке камерой. Так, студийные мониторы, предназначенные для просмотра в тёмном окружении, используют γ ≈ 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
* [http://poynton.com/notes/PU-PR-IS/ Perceptual uniformity, picture rendering, image state, and BT.709], Charles Poynton
Строка 172: Строка 172:
Для правильного ресайза должны использоваться линейные, а не гамма-корректированные значения компонентов. При ресайзе в большее разрешение это не существенно, однако при уменьшении разрешения неверный ресайз может приводить к заметным проблемам.
Для правильного ресайза должны использоваться линейные, а не гамма-корректированные значения компонентов. При ресайзе в большее разрешение это не существенно, однако при уменьшении разрешения неверный ресайз может приводить к заметным проблемам.


Встроенные функции Avisynth этого не учитывают, а кроме того, имеют ряд chroma shift багов, часть из которых не исправлена и в версии 2.6a3.
Встроенные функции 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 баги].
Ресайз над линейными компонентами можно производить при помощи [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 баги].
Строка 182: Строка 182:
Если при создании рипа производится ресайз из HD в SD, то следует скорректировать значения YCbCr так, чтобы при воспроизведении цвета не искажались из-за ошибочного выбора коэффициентов (для SD традиционно используются BT.601, для HD — BT.709). В Avisynth это можно сделать выполняя ресайз при помощи Dither Tools или ResampleHQ, а также плагинами ColorMatrix и t3dlut. Сама по себе коррекция коэффициентов не требует преобразования в RGB.
Если при создании рипа производится ресайз из HD в SD, то следует скорректировать значения YCbCr так, чтобы при воспроизведении цвета не искажались из-за ошибочного выбора коэффициентов (для SD традиционно используются BT.601, для HD — BT.709). В Avisynth это можно сделать выполняя ресайз при помощи Dither Tools или ResampleHQ, а также плагинами ColorMatrix и t3dlut. Сама по себе коррекция коэффициентов не требует преобразования в RGB.


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



Версия от 01:06, 19 мая 2018

Введение

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

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

Ссылки