YUV

редактировать

Пример цветовой плоскости UV, значение Y '= 0,5, представленное в цветовой гамме RGB Изображение вместе с его Y', Компоненты U и V соответственно

YUV - это система кодирования цвета, обычно используемая как часть конвейера цветного изображения. Он кодирует цветное изображение или видео с учетом человеческого восприятия, позволяя уменьшить полосу пропускания для компонентов цветности, тем самым, как правило, допуская ошибки передачи или артефакты сжатия для более эффективного маскирования человеческим восприятием, чем при использовании «прямого» RGB-представления. Другие цветовые кодировки имеют аналогичные свойства, основная причина для реализации или исследования свойств Y'UV будет заключаться в взаимодействии с аналоговым или цифровым датчиком или фотооборудованием, которое соответствует определенным стандартам Y'UV.

Модель Y'UV определяет цветовое пространство в терминах одного компонента яркости (Y ') и двух компонентов цветности, называемых U (синяя проекция) и V (красная проекция) соответственно. Цветовая модель Y'UV используется в стандарте составного цветного видео PAL (кроме PAL-N ). Предыдущие черно-белые системы использовали только информацию о яркости (Y '). Информация о цвете (U и V) добавлялась отдельно через поднесущую , так что черно-белый приемник все еще мог принимать и отображать передачу цветного изображения в собственном черно-белом приемнике. -белый формат.

Y 'обозначает компонент яркости (яркость), а U и V - компоненты цветности (цвета); яркость обозначается через Y, а яркость через Y '- символы со штрихом (') обозначают гамма-коррекцию, а «яркость » Физическая яркость в линейном измерении, в то время как «яркость ».

Объем терминов Y'UV, YUV, YCbCr, YPbPr и т. Д. Иногда неоднозначен и перекрывается. Исторически термины YUV и Y'UV использовались для аналогового кодирования информации о цвете в телевизионных системах, в то время как YCbCr использовался для цифрового кодирования информации о цвете, подходящей для сжатия и передачи видео и неподвижных изображений, например MPEG и JPEG. Сегодня термин YUV широко используется в компьютерной индустрии для описания файловых форматов, которые кодируются с использованием YCbCr.

Цветовая модель YPbPr, используемая в аналоговом компонентном видео, и ее цифровая версия YCbCr, используемая в цифровом видео. в большей или меньшей степени происходит от него и иногда называется Y'UV. (C B/PBи C R/PR- отклонения от серого по сине-желтой и красно-голубой осям, тогда как U и V - различия яркости синего и красного соответственно.) Y′IQ цветовое пространство, используемое в системе аналогового телевизионного вещания NTSC, связано с ним, хотя и более сложным образом. Цветовое пространство YDbDr, используемое в аналоговых системах телевизионного вещания SECAM и PAL-N, также связано.

Что касается этимологии, Y, Y ', U и V не являются ограничениями. Использование буквы Y для обозначения яркости можно проследить до выбора основных цветов XYZ. Это естественным образом позволяет использовать одну и ту же букву в яркости (Y '), которая приближает перцептуально однородный коррелят яркости. Точно так же U и V были выбраны, чтобы отличать оси U и V от осей в других пространствах, таких как пространство цветности x и y. См. Приведенные ниже уравнения или сравните историческое развитие математики.

Содержание
  • 1 История
  • 2 Преобразование в / из RGB
    • 2.1 SDTV с BT.601
    • 2.2 HDTV с BT.709
    • 2.3 Примечания
  • 3 Числовые приближения
    • 3.1 Studio Swing для BT.601
    • 3.2 Полный размах для BT.601
  • 4 Системы яркости / цветности в целом
  • 5 Связь с Y'CbCr
  • 6 Типы выборки
  • 7 Преобразование между Y ' UV и RGB
    • 7.1 Преобразование Y'UV444 в RGB888
    • 7.2 Преобразование Y'UV422 в RGB888
    • 7.3 Преобразование Y'UV411 в RGB888
    • 7.4 Преобразование Y′UV420p (и Y′V12 или YV12) в RGB888
    • 7.5 Преобразование Y′UV420sp (NV21) в RGB (Android)
  • 8 Ссылки
  • 9 Внешние ссылки
История

Y'UV был изобретен, когда инженеры хотели цветного телевидения в черно-белой инфраструктуре. Им нужен был метод передачи сигнала, совместимый с черно-белым (BW), но с помощью добавления цвета. Компонент яркости уже существовал как черно-белый сигнал; они добавили к этому УФ-сигнал в качестве раствора.

УФ-представление цветности было выбрано по сравнению с прямыми сигналами R и B, потому что U и V предоставляли собой цветоразностные сигналы. Другими словами, сигналы U и V говорят телевизору сместить цвет определенного пикселя без изменения его яркости. Или сигналы U и V говорят монитору, что нужно сделать один цвет ярче за счет другого и на сколько он должен быть сдвинутым. Чем выше (или ниже, если они отрицательны) значения U и V, тем более насыщенным (красочным) становится пиксель. Чем ближе значения U и V к нулю, тем меньше изменяется цвет, что означает, что красный, зеленый и синий свет будут более одинаково яркими, создавая более серый пиксель. В этом заключается преимущество использования цветоразностных сигналов, т.е. вместо того, чтобы сообщить, сколько красного в цвете, он показывает, насколько он больше красного, чем зеленый или синий. В свою очередь, это означало, когда сигналы U и V были бы нулевыми или отсутствовали, он просто отображал бы изображение в оттенках серого. Если бы использовались R и B, они имели ненулевые значения даже в черно-белой сцене, требующей всех трех сигналов, несущих данные. Это было важно на заре цветного телевидения, потому что в старых черно-белых телевизионных сигналах не было сигналов U и V, а это означало, что цветной телевизор просто отображал бы его как черно-белый телевизор из коробки. Кроме того, черно-белые приемники могут принимать сигнал Y 'и игнорировать сигналы U- и V-цветов, что делает Y'UV совместимым со всем существующим черно-белым оборудованием, входом и выходом. Если бы в стандарте цветного телевидения не использовались бы цветоразностные сигналы, это могло бы означать, что телевизор будет воспроизводить смешные цвета из черно-белой трансляции, или ему потребовались бы дополнительные схемы для преобразования черно-белого сигнала в цвет. Было необходимо назначить более узкую полосу пропускания для канала цветности, потому что не было доступной дополнительной полосы пропускания. Если бы некоторая информация о яркости поступала через канал цветности (как это было бы, если бы сигналы RB использовались вместо дифференциальных УФ-сигналов), черно-белое разрешение было бы скомпрометировано.

Преобразование в / из RGB

SDTV с BT.601

Y'UV-сигналы обычно формируются из RGB (красный, зеленый и синий ) источник. Взвешенные значения R, G и B суммируются, чтобы получить Y ', меру общей яркости или яркости. U и V вычисляются как масштабированные разности между Y 'и значениями B и R.

BT.601 определяют следующие константы:

WR = 0,299, WG = 1 - WR - WB = 0,587, WB = 0,114, U макс = 0,436, V макс = 0,615. {\ displaystyle {\ begin {align} W_ {R} = 0,299, \\ W_ {G} = 1-W_ {R} -W_ {B} = 0,587, \\ W_ {B} = 0,114, \ \ U _ {\ text {max}} = 0,436, \\ V _ {\ text {max}} = 0,615. \ End {align}}}{\ displaystyle {\ begin {align} W_ {R} = 0,299, \\ W_ {G} = 1-W_ {R} -W_ {B} = 0,587, \\ W_ {B} = 0,114, \\ U _ {\ text {max}} = 0,436, \\ V _ {\ text {max}} = 0,615. \ End {align}}}

Y'UV вычисляется из RGB (линейный RGB, а не гамма скорректированный RGB или sRGB, например) следующим образом:

Y ′ = WRR + WGG + WBB = 0,299 R + 0,587 G + 0,114 B, U = U max B - Y ′ 1 - WB ≈ 0,492 (B - Y ′), V = V max R - Y ′ 1 - WR ≈ 0,877 (R - Y ′). {\ displaystyle {\ begin {align} Y '= W_ {R} R + W_ {G} G + W_ {B} B = 0,299R + 0,587G + 0,114B, \\ U = U _ {\ text {max}} {\ frac {BY '} {1-W_ {B}}} \ приблизительно 0,492 (B-Y'), \\ V = V _ {\ text {max}} {\ frac {RY ' } {1-W_ {R}}} \ приблизительно 0,877 (RY '). \ End {align}}}{\displaystyle {\begin{aligned}Y'=W_{R}R+W_{G}G+W_{B}B=0.299R+0.587G+0.114B,\\U=U_{\text{max}}{\frac {B-Y'}{1-W_{B}}}\approx 0.492(B-Y'),\\V=V_{\text{max}}{\frac {R-Y'}{1-W_{R}}}\approx 0.877(R-Y').\end{aligned}}}

Результирующие диапазоны Y ', U и V соответственно равны [0, 1], [-U макс, U макс ] и [-V макс, V макс ].

Инвертирование указанного преобразования преобразует Y′UV в RGB:

R = Y ′ + V 1 - WRV max = Y ′ + V 0,877 = Y ′ + 1,14 V, G = Y ′ - UWB (1 - WB) U max WG - VWR (1 - WR) V max WG = Y ′ - 0,232 U 0,587 - 0,341 Â 0,587 = Y ′ - 0,395 U - 0,581 В, B = Y ′ + U 1 - WBU max = Y '+ U 0,492 = Y' + 2,033 U. {\ displaystyle {\ begin {align} R = Y '+ V {\ frac {1-W_ {R}} {V _ {\ text {max}}} } = Y '+ {\ frac {V} {0.877}} = Y' + 1.14V, \\ G = Y'-U {\ frac {W_ {B} (1-W_ {B})} {U _ {\ text {max}} W_ {G}}} - V {\ frac {W_ {R} (1-W_ {R})} {V _ {\ text {max}} W_ {G}}} \ \ = Y '- {\ frac {0,232U} {0,587}} - {\ frac {0,341V} {0,587}} = Y'-0,395U-0,581V, \\ B = Y' + U {\ гидроразрыв {1-W_ {B}} {U _ {\ text {max}}}} = Y '+ {\ frac {U} {0,492}} = Y' + 2,033U. \ End {align}}}{\displaystyle {\begin{aligned}R=Y'+V{\frac {1-W_{R}}{V_{\text{max}}}}=Y'+{\frac {V}{0.877}}=Y'+1.14V,\\G=Y'-U{\frac {W_{B}(1-W_{B})}{U_{\text{max}}W_{G}}}-V{\frac {W_{R}(1-W_{R})}{V_{\text{max}}W_{G}}}\\=Y'-{\frac {0.232U}{0.587}}-{\frac {0.341V}{0.587}}=Y'-0.395U-0.581V,\\B=Y'+U{\frac {1-W_{B}}{U_{\text{max}}}}=Y'+{\frac {U}{0.492}}=Y'+2.033U.\end{aligned}}}

Эквивалентно, подставляя значения для констант и выражая их как матрицы, дает следующие формулы для BT.601:

[Y ′ UV] = [0,299 0,587 0,114 - 0, 14713 - 0,28886 0,436 0,615 - 0,51499 - 0,10001] [RGB], [RGB] = [1 0 1,13983 1 - 0,39465 - 0,58060 1 2,03211 0] [Y ′ UV]. {\ displaystyle {\ begin {align} {\ begin {bmatrix} Y '\\ U \\ V \ end {bmatrix}} = {\ begin {bmatrix} 0,299 и 0,587 и 0,114 \\ - 0,14713 и - 0,28886 0,436 \\ 0,615 -0,51499 -0,10001 \ end {bmatrix}} {\ begin {bmatrix} R \\ G \\ B \ end {bmatrix}}, \\ {\ begin { bmatrix} R \\ G \\ B \ end {bmatrix}} = {\ begin {bmatrix} 1 0 1.13983 \\ 1 -0.39465 -0.58060 \\ 1 2.03211 0 \ end {bmatrix}} {\ begin {bmatrix} Y '\\ U \\ V \ end {bmatrix}}. \ End {align}}}{\displaystyle {\begin{aligned}{\begin{bmatrix}Y'\\U\\V\end{bmatrix}}={\begin{bmatrix}0.2990.5870.114\\-0.14713-0.288860.436\\0.615-0.51499-0.10001\end{bmatrix}}{\begin{bmatrix}R\\G\\B\end{bmatrix}},\\{\begin{bmatrix}R\\G\\B\end{bmatrix}}={\begin{bmatrix}101.13983\\1-0.39465-0.58060\\12.032110\end{bmatrix}}{\begin{bmatrix}Y'\\U\\V\end{bmatrix}}.\end{aligned}}}

Обратите внимание, что для малых значений Y 'можно получить отрицательные значения R, G или B, поэтому на практике мы зажимаем результаты RGB в интервал [0,1].

HDTV с BT.709

HDTV Rec. 709 (довольно близко к SDTV Rec. 601) по сравнению с UHDTV Rec. 2020

Для HDTV в ATSC решено изменить базовые значения для W R и W B по сравнению с ранее выбранными значениями в системе SDTV. Для HDTV эти значения указаны в Рек. 709. Это решение также повлияло на матрицу преобразования Y'UV↔RGB, так что значения ее элементов также немного отличаются. В результате с SDTV и HDTV для любой тройки RGB обычно возможны два различных представления Y'UV: SDTV-Y'UV и HDTV-Y'UV. Это означает, что при прямом преобразовании между SDTV и HDTV информация о яркости (Y ') примерно одинакова, но представление информации канала цветности (U и V) требует преобразования. По-прежнему охватывая цветовое пространство CIE 1931, Rec. 709 почти идентично Рек. 601 и покрывает 35,9%. В отличие от этого UHDTV с Rec. 2020 охватывает большую территорию и в дальнейшем увидит свою собственную матрицу для YUV / Y'UV.

BT.709 определяют следующие значения веса:

WR = 0,2126 WB = 0,0722 {\ displaystyle {\ begin {align} W_ {R} = 0,2126 \\ W_ {B } = 0,0722 \\ \ end {align}}}{\begin{aligned}W_{R}=0.2126\\W_{B}=0.0722\\\end{aligned}}

Матрицы и формулы преобразования для BT.709 следующих:

[Y ′ UV] = [0,2126 0,7152 0,0722 - 0, 09991 - 0,33609 0,436 0,615 - 0,55861 - 0,05639] [RGB] [RGB] = [1 0 1,28033 1 - 0,21482 - 0,38059 1 2,12798 0] [Y ′ UV] { \ Displaystyle {\ begin {align} {\ begin {bmatrix} Y '\\ U \\ V \ end {bmatrix}} = {\ begin {bmatrix} 0,2126 0,7152 0,0722 \\ - 0,09991 -0,33609 0,436 \\ 0,615 -0,55861 -0,05639 \ end {bmatrix}} {\ begin {bmatrix} R \\ G \ \ B \ end {bmatrix}} \\ {\ begin {bmatrix} R \\ G \\ B \ end {bmatrix}} = {\ begin {bmatrix} 1 0 1.28033 \\ 1 -0.21482 -0.38059 \\ 1 2.12798 0 \ end {bmatrix}} {\ begin {bmatrix} Y '\\ U \\ V \ end {bmatrix}} \ end {align}}}{\begin{aligned}{\begin{bmatrix}Y'\\U\\V\end{bmatrix}}={\begin{bmatrix}0.21260.71520.0722\\-0.09991-0.336090.436\\0.615-0.55861-0.05639\end{bmatrix}}{\begin{bmatrix}R\\G\\B\end{bmatrix}}\\{\begin{bmatrix}R\\G\\B\end{bmatrix}}={\begin{bmatrix}101.28033\\1-0.21482-0.38059\\12.127980\end{bmatrix}}{\begin{bmatrix}Y'\\U\\V\end{bmatrix}}\end{aligned}}

Примечания

  • Веса, используемые для вычислений Y' (верхняя строка матрицы) идентичны тем, которые используются в цветово м простран Y'IQ.
  • Равные значения красного, зеленого и синего (т. Е. Уровней серого) дают 0 для U и В. Черный, RGB = (0, 0, 0), дает YUV = (0, 0, 0). Белый цвет, RGB = (1, 1, 1), дает YUV = (1, 0, 0).
  • Эти телевизоры традиционно используются в аналоговых устройствах и оборудовании; цифровое оборудование, такое как HDTV и цифровые видеокамеры, используют Y'CbCr.
  • Предполагается, что входные значения RGB находятся в линейном пространстве RGB. RGB с гамма-коррекцией или sRGB необходимо сначала правильно преобразовать в линейное пространство.
Числовые приближения

До разработки быстрых процессоров SIMD с плавающей точкой, в большинстве цифровых реализаций RGB → Y УФ использовалась целочисленная математика, в частности аппроксимации с фиксированной точкой. Аппроксимация означает, что используются числа (входные данные, выходные данные и постоянные значения) ограничена, и, таким образом, потеря точности, как правило, последней из двоичных цифр, принимается тем, кто использует эту опцию, как правило, в качестве компромисса для улучшенная скорость вычислений.

В следующих примерах оператор «a ≫ b {\ displaystyle a \ gg b}a \ gg b » обозначает сдвиг вправо двоичной позиции a на b. Для пояснения переменные используются два суффиксных символа: «u» используется для окончательного представления без знака, а «t» - для уменьшенного промежуточного значения. Приведенные ниже примеры только для BT.601. Тот же принцип можно использовать для выполнения эквивалентных операций с использованием значений, которые соответствуют соответствию для данных по BT.709 или любому другому сопоставимому стандарту.

Значения Y 'обычно сдвигаются и масштабируются до диапазона [16, 235] (называемого студийным свингом или «телевизионными уровнями»), а не с использованием полного диапазона [0, 255] (называемого полным ходом или "ПК уровнями") "). Эта практика была стандартизирована в SMPTE-125M, чтобы компенсировать выбросы сигнала («звон») из-за фильтрации. Значение 235 соответствует максимальному выбросу от черного к белому в размере 255-235 = 20 или 20 / (235-16) = 9,1%, что немного больше теоретического выброса (феномен Гиббса ) около 8,9 % от максимального шага. Пространство для пальцев меньше, допускает только 16/219 = 7,3% перерегулирования, что меньше теоретического размера перерегулирования 8,9%. Вот почему 16 добавляются к Y 'и почему коэффициенты Y' в сумме основного преобразования равны 220 вместо 255. Значения U и V, которые могут быть положительными или отрицательными, суммируются со 128, чтобы они всегда были положительными, давая студийный диапазон 16–240 для U и V. (Эти диапазоны важны при редактировании и производстве видео, используя неправильное изображение с «обрезанными» черными и белыми цветами, либо к изображению с низкой контрастностью.)

Studio Swing для BT. 601

Для получения традиционного «студийного» 8-битного представления Y'UV для SDTV / BT.601 можно использовать следующие операции:

1. Базовое преобразование из 8-битного RGB в 16-битные значения (Y ': без знака, U / V: знаковые, матричные значения были округлены, чтобы в дальнейшем желаемый диапазон Y' [16..235] и диапазон U / V из [ 16..240]):

[Y ′ UV] = [66 129 25 - 38 - 74 112 112 - 94 - 18] [RGB]. {\ displaystyle {\ begin {bmatrix} Y '\\ U \\ V \ end {bmatrix}} = {\ begin {bmatrix} 66 129 25 \\ - 38 -74 112 \\ 112 -94 -18 \ end {bmatrix}} {\ begin {bmatrix} R \\ G \\ B \ end {bmatrix}}.}{\displaystyle {\begin{bmatrix}Y'\\U\\V\end{bmatrix}}={\begin{bmatrix}6612925\\-38-74112\\112-94-18\end{bmatrix}}{\begin{bmatrix}R\\G\\B\end{bmatrix}}.}

2. Уменьшить масштаб («>> 8») до 8 бит с округлением («+128») (Y ′: без знака, U / V: со знаком):

Y t ′ = (Y ′ + 128) ≫ 8, UT знак равно (U + 128) ≫ 8, V t знак равно (V + 128) ≫ 8. {\ displaystyle {\ begin {align} Yt '= (Y' + 128) \ gg 8, \\ Ut = (U + 128) \ gg 8, \\ Vt = (V + 128) \ gg 8. \ end {align}}}{\displaystyle {\begin{aligned}Yt'=(Y'+128)\gg 8,\\Ut=(U+128)\gg 8,\\Vt=(V+128)\gg 8.\end{aligned}}}

3. Добавьте смещение к значениям, чтобы исключить любые отрицательные значения (все результаты 8-битные без знака):

Y u ′ = Y t ′ + 16, U u = U t + 128, V u = V t + 128. { \ displaystyle {\ begin {align} Yu '= Yt' + 16, \\ Uu = Ut + 128, \\ Vu = Vt + 128. \ end {align}}}{\displaystyle {\begin{aligned}Yu'=Yt'+16,\\Uu=Ut+128,\\Vu=Vt+128.\end{aligned}}}

Полный ход для BT. 601

Для получения "полноразмерного" 8-битного представления Y'UV для SDTV / BT.601 можно использовать следующие операции:

1. Базовое преобразование из 8-битного RGB в 16-битные значения (Y ': без знака, U / V: со знаком, значения матрицы округлены так, чтобы в дальнейшем желаемый диапазон Y'UV для каждого [0..255] был достигнут, пока переполнения быть не может):

[Y ′ UV] = [77 150 29 - 43 - 84 127 127 - 106 - 21] [RGB]. {\ displaystyle {\ begin {bmatrix} Y '\\ U \\ V \ end {bmatrix}} = {\ begin {bmatrix} 77 150 29 \\ - 43 -84 127 \\ 127 -106 -21 \ end {bmatrix}} {\ begin {bmatrix} R \\ G \\ B \ end {bmatrix}}.}{\displaystyle {\begin{bmatrix}Y'\\U\\V\end{bmatrix}}={\begin{bmatrix}7715029\\-43-84127\\127-106-21\end{bmatrix}}{\begin{bmatrix}R\\G\\B\end{bmatrix}}.}

2. Уменьшить масштаб (">>8") до 8-битных значений с округлением ("+128") (Y ′: без знака, U / V: со знаком):

Y t ′ = (Y ′ + 128) ≫ 8, UT знак равно (U + 128) ≫ 8, В T знак равно (V + 128) ≫ 8. {\ Displaystyle {\ begin {align} Yt '= (Y' + 128) \ gg 8, \ \ Ut = (U + 128) \ gg 8, \\ Vt = (V + 128) \ gg 8. \ end {align}}}{\displaystyle {\begin{aligned}Yt'=(Y'+128)\gg 8,\\Ut=(U+128)\gg 8,\\Vt=(V+128)\gg 8.\end{aligned}}}

3. Добавьте смещение к значениям, чтобы исключить любые отрицательные значения (все результаты являются 8-битными без знака):

Y u ′ = Y t ′, U u = U t + 128, V u = V t + 128. {\ displaystyle {\ begin {align} Yu '= Yt', \\ Uu = Ut + 128, \\ Vu = Vt + 128. \ end {выравнивается}}}{\displaystyle {\begin{aligned}Yu'=Yt',\\Uu=Ut+128,\\Vu=Vt+128.\end{aligned}}}
Системы яркости / цветности в целом

Основное преимущество систем яркости / цветности, таких как Y'UV и его родственники Y'IQ и YDbDr, заключается в том, что они остаются совместимыми с черно-белым аналогом. телевидение (во многом благодаря работе Жоржа Валенси ). Канал Y сохраняет все данные, записанные черно-белыми камерами, поэтому производит он сигнал, пригодный для приема на старых монохромных дисплеях. В этом случае U и V просто отбрасываются. При отображении цвета используются все три канала, и исходная информация RGB может быть декодирована.

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

Следовательно, результирующие сигналы U и V должны быть «сжаты». В системы NTSC (Y'IQ) и PAL сигналы цветности имели более узкую полосу пропускания, чем у сигналов яркости. Ранние версии NTSC быстро передают цвета в идентичных областях изображения. разрешении. Сохраняется только половина горизонтального разрешения по сравнению с информацией о яркости (так называемая субдискретизация цветности 4: 2: 2), и часто вертикальное разрешение также уменьшается вдвое (давая 4: 2: 0). Стандарт 4: x: x был принят из-за самого раннего цветного стандарта NTSC, в котором использовалась субдискретизация цветности 4: 1: 1 (где разрешение цвета по горизонтали делится на четверть, а по вертикали - полное разрешение), так что изображение несло только четверть цветового разрешения по сравнению с разрешением по яркости. Сегодня только высококачественное оборудование, обрабатывающее несжатые сигналы, использует субдискретизацию цветности 4: 4: 4 с одинаковым разрешением как для информации о яркости, так и для информации о цвете.

Оси I и Q были выбраны в соответствии с полосой пропускания, необходимой человеческому зрению, одна ось требовала наибольшей полосы пропускания, а другая (случайно под углом 90 градусов) минимальной. Однако настоящая I- и Q-демодуляция была относительно более сложной, требуя двух аналоговых линий задержки, и приемники NTSC редко использовали ее.

Однако это преобразование цветового пространства с потерями, особенно очевидно в переходных помехах от яркости к проводнику, несущему цветность, и наоборот, в аналоговом оборудовании (включая разъемы RCA для передачи цифрового сигнала, поскольку все, что они несут, - это аналоговое композитное видео, которое может быть YUV, YIQ или даже CVBS ). Кроме того, цветовые сигналы кодируются в NTSC и PAL таким образом, чтобы сигналы цветности и яркости с высокой пропускной способностью смешивались друг с другом в попытке сохранить обратную совместимость с черно-белым телевизионным оборудованием, что приводит к ползанию точек и артефакты. Когда в 1950-х годах был создан стандарт NTSC, это не было серьезной проблемой, поскольку качество изображения ограничивалось оборудованием монитора, а не принимаемым сигналом с ограниченной полосой пропускания. Однако современное телевидение способно отображать больше информации, чем содержится в этих сигналах с потерями. Чтобы идти в ногу с возможностями новых технологий отображения, с конца 1970-х годов предпринимались попытки сохранить больше сигнала Y'UV при передаче изображений, такие как SCART (1977) и S-Video. (1987 г.) соединители.

Вместо Y'UV, Y'CbCr использовался в качестве стандартного формата для (цифровых) распространенных алгоритмов сжатия видео, таких как MPEG-2. Цифровое телевидение и DVD сохраняют свои сжатые видеопотоки в формате MPEG-2, который использует полное цветовое пространство Y'CbCr, хотя и сохраняет установленный процесс субдискретизации цветности. В профессиональном цифровом видеоформате CCIR 601 также используется Y'CbCr с общей частотой субдискретизации цветности 4: 2: 2, в первую очередь для совместимости с предыдущими стандартами аналогового видео. Этот поток можно легко смешать с любым необходимым форматом вывода.

Y'UV не является абсолютным цветовым пространством. Это способ кодирования информации RGB, и фактический отображаемый цвет зависит от фактических красителей RGB, используемых для отображения сигнала. Следовательно, значение, выраженное как Y'UV, является предсказуемым только в том случае, если используются стандартные красители RGB (то есть фиксированный набор основных цветностей или конкретный набор красного, зеленого и синего).

Кроме того, диапазон цветов и яркости (известный как цветовая гамма ) RGB (будь то BT.601 или Rec.709) намного меньше, чем диапазон цветов и яркости, разрешенные ЮВ. Это может быть очень важно при преобразовании из Y'UV (или Y'CbCr) в RGB, поскольку приведенные выше формулы могут давать «недопустимые» значения RGB, то есть значения ниже 0% или намного выше 100% диапазона (например, вне стандартного диапазона яркости 16–235 (и диапазона цветности 16–240) для телевизоров и контента высокой четкости или за пределами диапазона 0–255 для стандартного разрешения на ПК). Если эти значения не обрабатываются, они обычно будут «обрезаны» (т. Е. Ограничены) до допустимого диапазона затрагиваемого канала. Это изменяет оттенок цвета, что очень нежелательно, поэтому часто считается, что лучше обесцветить оскорбительные цвета, чтобы они попадали в цветовую гамму RGB. Аналогичным образом, когда RGB с заданной битовой глубиной преобразуется в YUV с той же битовой глубиной, несколько цветов RGB могут стать одним и тем же цветом Y'UV, что приведет к потере информации.

Связь с Y'CbCr

Y'UV часто используется как термин для YCbCr. Однако, хотя они связаны, это разные форматы с разными масштабными коэффициентами. U и V - биполярные сигналы, которые могут быть положительными или отрицательными и равны нулю для серых оттенков, тогда как YCbCr обычно масштабирует все каналы либо до диапазона 16–235, либо до диапазона 0–255, что делает Cb и Cr без знака количество, которое составляет 128 для серых.

Тем не менее, отношения между ними в стандартном случае просты. В частности, каналы Y 'обоих линейно связаны друг с другом, как Cb, так и U связаны линейно с (B-Y), а Cr и V связаны линейно с (R-Y).

Типы выборки

Чтобы получить цифровой сигнал, изображения Y'UV могут быть дискретизированы несколькими различными способами; см. субдискретизация цветности.

Преобразование между Y'UV и RGB

Файлы RGB обычно кодируются в 8, 12, 16 или 24 битах на пиксель. В этих примерах мы примем 24 бита на пиксель, что записывается как RGB888. Стандартный байтовый формат:

r0, g0, b0, r1, g1, b1,...

Файлы Y'UV могут быть закодированы с использованием 12, 16 или 24 бит на пиксель. Распространенными форматами являются Y'UV444 (или YUV444), YUV411, Y'UV422 (или YUV422) и Y'UV420p (или YUV420). Апостроф после Y часто опускается, как и «p» после YUV420p. Что касается фактических форматов файлов, YUV420 является наиболее распространенным, поскольку данные легче сжимаются, а расширение файла обычно «.YUV».

Соотношение между скоростью передачи данных и дискретизацией (A: B: C) определяется соотношением каналов Y к U и V.

Для преобразования из RGB в YUV или обратно необходимо Проще всего использовать RGB888 и YUV444. Для YUV411, YUV422 и YUV420 байты сначала необходимо преобразовать в YUV444.

YUV444 3 байта на пиксель (12 байтов на 4 пикселя) YUV422 4 байта на 2 пикселя (8 байтов на 4 пикселя) YUV411 6 байтов на 4 пикселя YUV420p 6 байтов на 4 пикселя, переупорядоченные

Преобразование Y′UV444 в RGB888

Функция [R, G, B] = Y′UV444toRGB888 (Y ′, U, V) преобразует формат Y′UV в простой формат RGB.

Формулы преобразования RGB, используемые для формата Y'UV444, также применимы к стандартному формату телевизионной передачи NTSC YUV420 (или YUV422, если на то пошло). Для YUV420, поскольку каждая выборка U или V используется для представления 4 выборок Y, образующих квадрат, правильный метод выборки может позволить использовать точные формулы преобразования, показанные ниже. Для получения дополнительных сведений см. Демонстрацию формата 4: 2: 0 в нижней части этой статьи.

Эти формулы основаны на стандарте NTSC:

Y ′ = 0,299 R + 0,587 G + 0,114 BU = - 0,147 R - 0,289 G + 0,436 BV = 0,615 R - 0,515 G - 0,100 B {\ displaystyle {\ begin {выравнивается} Y '= 0,299R + 0,587G + 0,114B \\ U = - 0,147R-0,289G + 0,436B \\ V = 0,615R-0,515G-0,100B \ end {выравнивается}} }{\displaystyle {\begin{aligned}Y'=0.299R+0.587G+0.114B\\U=-0.147R-0.289G+0.436B\\V=0.615R-0.515G-0.100B\end{aligned}}}

В более старых архитектурах, отличных от SIMD, арифметика с плавающей запятой выполняется намного медленнее, чем использование арифметики с фиксированной запятой, поэтому альтернативная формулировка:

Y ′ = ((66 R + 129 G + 25 B + 128) ≫ 8) + 16 U = ((- 38 R - 74 G + 112 B + 128) ≫ 8) + 128 V = ((112 R - 94 G - 18 B + 128) ≫ 8) + 128 {\ displaystyle {\ begin {align} Y '= ((66R + 129G + 25B + 128) \ gg 8) +16 \\ U = ((- 38R-74G + 112B + 128) \ gg 8) +128 \\ V = ((112R-94G-18B + 128) \ gg 8) +128 \ end {align}}}{\displaystyle {\begin{aligned}Y'=((66R+129G+25B+128)\gg 8)+16\\U=((-38R-74G+112B+128)\gg 8)+128\\V=((112R-94G-18B+128)\gg 8)+128\end{aligned}}}

Для преобразования из Y'UV в RGB с использованием коэффициентов c, d и e и отмечая, что [] 0 255 {\ displaystyle _ {0} ^ {255}}{\ displaystyle _ {0} ^ {255}} обозначает ограничение значения до 8-битного диапазона от 0 до 255, следующие формулы обеспечивают преобразование из Y ′ УФ в RGB (версия NTSC):

c = Y ′ - 16 d = U - 128 e = V - 128 {\ displaystyle {\ begin {align} c = Y'-16 \\ d = U-128 \ \ e = V-128 \ end {align}}}{\displaystyle {\begin{aligned}c=Y'-16\\d=U-128\\e=V-128\end{aligned}}}
R = [(298 c + 409 e + 128) ≫ 8] 0 255 G = [(298 c - 100 d - 208 e + 128) ≫ 8 ] 0 255 B = [(298 c + 516 d + 128) ≫ 8] 0 255 {\ displaystyle {\ begin {align} R = [(298c + 409e + 128) \ gg 8] _ {0} ^ {255 } \\ G = [(298c-100d-208e + 128) \ gg 8] _ {0} ^ {255} \\ B = [(298c + 516d + 128) \ gg 8] _ {0} ^ {255 } \ end {align}}}{\ displaystyle {\ begin {align} R = [(298c + 409e + 128) \ gg 8] _ {0} ^ {255} \\ G = [(298c-100d-208e + 128) \ gg 8] _ {0} ^ {255} \\ B = [(298c + 516d + 128) \ gg 8] _ {0} ^ {255} \ end {align}}}

Примечание: приведенные выше формулы фактически подразумеваются для YCbCr. Хотя здесь используется термин YUV, YUV и YCbCr в строгом смысле не одно и то же.

Версия формулы ITU-R отличается: max (CB) = max (CR) = 0,499 ↦ 7 F 16 {\ displaystyle \ max (C_ {B}) = \ max (C_ {R}) = 0,499 \ mapsto \ mathrm {7F} _ {16}}{\ displaystyle \ max (C_ {B}) = \ max (C_ {R}) = 0,499 \ mapsto \ mathrm {7F} _ { 16}} , тогда как max (U) = 0,436 ↦ 70 16 {\ displaystyle \ max (U) = 0,436 \ mapsto 70_ {16}}{ \ displ aystyle \ max (U) = 0,436 \ mapsto 70_ {16}} и max (V) = 0,615 ↦ 70 16 {\ displaystyle \ max (V) = 0,615 \ mapsto 70_ {16}}{\ displaystyle \ max (V) = 0,615 \ mapsto 70_ {16}} выше :

Y = 0,299 R + 0,587 G + 0,114 B + 0 CB = - 0,169 R - 0,331 G + 0,499 B + 128 CR = 0,499 R - 0,418 G - 0,0813 B + 128 R = [Y + 1,402 × (CR - 128)] 0 255 G = [Y - 0,344 × (CB - 128) - 0,714 × (CR - 128)] 0 255 B = [Y + 1,772 × (CB - 128)] 0 255 {\ displaystyle {\ begin {выровнено} Y = 0,299R + 0,587G + 0,114B + 0 \\ C_ {B} = - 0,169R-0,331G + 0,499B + 128 \\ C_ {R} = 0,499R-0,418G-0,0813B +128 \\\\ R = [Y + 1,402 \ раз (C_ {R} -128)] _ {0} ^ {255} \\ G = [Y-0,344 \ раз (C_ {B} -128) - 0,714 \ раз (C_ {R} -128)] _ {0} ^ {255} \\ B = [Y + 1,772 \ раз (C_ {B} -128)] _ {0} ^ {255} \ end { выровнено}}}{\ displaystyle {\ begin {align} Y = 0,299R + 0,587G + 0,114B + 0 \\ C_ {B} = - 0,169R-0,331G + 0,499B + 128 \\ C_ {R} = 0,499R-0,418G-0,0813B + 128 \\\\ R = [Y + 1,402 \ раз (C_ {R} -128)] _ {0} ^ {255} \\ G = [Y-0,344 \ раз (C_ {B} -128) -0,714 \ раз (C_ {R } -128)] _ {0} ^ {255} \\ B = [Y + 1.772 \ times (C_ {B} -128)] _ {0} ^ {255} \ end {align}}}

Целочисленная операция стандарта ITU-R для YCbCr (8 бит на канал) в RGB888:

C R = C R - 128; C B = C B - 128; R = Y + CR + (CR ≫ 2) + (CR ≫ 3) + (CR ≫ 5) G = Y - ((CB ≫ 2) + (CB ≫ 4) + (CB 5)) - ((CR ≫ 1) + (CR ≫ 3) + (CR ≫ 4) + (CR ≫ 5)) B = Y + CB + (CB ≫ 1) + (CB ≫ 2) + (CB ≫ 6) {\ Displaystyle {\ begin {align} C_ {R} = C_ {R} -128; \\ C_ {B} = C_ {B} -128; \\ R = Y + C_ {R} + (C_ {R} \ gg 2) + (C_ {R} \ gg 3) + (C_ {R} \ gg 5) \\ G = Y - ((C_ {B} \ gg 2) + (C_ {B} \ gg 4) + ( C_ {B} \ gg 5)) - ((C_ {R} \ gg 1) + (C_ {R} \ gg 3) + (C_ {R} \ gg 4) + (C_ {R} \ gg 5)) \\ B = Y + C_ {B} + (C_ {B} \ gg 1) + (C_ {B} \ gg 2) + (C_ {B} \ gg 6) \ end {align}}}{\ displaystyle {\ begin {align} C_ {R} = C_ {R} -128; \\ C_ {B} = C_ {B} -128; \\ R = Y + C_ {R} + (C_ {R} \ gg 2) + (C_ {R} \ gg 3) + (C_ {R} \ gg 5) \ \ G = Y - ((C_ {B} \ gg 2) + (C_ {B} \ gg 4) + (C_ {B} \ gg 5)) - ((C_ {R} \ gg 1) + (C_ {R} \ gg 3) + (C_ {R} \ gg 4) + (C_ {R} \ gg 5)) \\ B = Y + C_ {B} + (C_ {B} \ gg 1) + ( C_ {B} \ gg 2) + (C_ {B} \ gg 6) \ end {align}}}

Преобразование Y′UV422 в RGB888

Вход: чтение 4 байтов Y′UV (u, y1, v, y2)
Вывод: запись 6 байтов RGB (R, G, B, R, G, B)
u = yuv [0]; y1 = yuv [1]; v = yuv [2]; y2 = yuv [3];
YUV 422 = [uy 1 vy 2] {\ displaystyle {YUV} _ {422} = {\ begin {bmatrix} u y_ {1} \\ v y_ {2} \ end {bmatrix}}}{\ displaystyle {YUV} _ {422} = {\ begin {bmatrix} u y_ {1} \\ v y_ {2} \ end {bmatrix}}}
YUV 444 = [y 1 uvy 2 uv] {\ displaystyle {YUV} _ {444} = {\ begin {bmatrix} y_ {1} u v \\ y_ {2} u v \ end {bmatrix}}}{\ displaystyle {YUV} _ {444} = {\ begin { bmatrix} y_ {1} u v \\ y_ {2} u v \ end {bmatrix}}}
RGB = M - 1 YUV 444 {\ displaystyle {RGB} = M ^ {- 1} {YUV} _ {444}}{\ displaystyle {RGB} = M ^ {- 1} {YUV} _ {444}}

Используя эту информацию, его можно проанализировать как обычный формат Y'UV444, чтобы получить информацию о 2 пикселях RGB:

rgb1 = Y'UV444toRGB888 (y1, u, v); rgb2 = Y'UV444toRGB888 (y2, u, v);
Yuv422 yuy2.svg

Y'UV422 также можно выразить значениями в альтернативном порядке, например для формата FourCC код YUY2.

Ввод: прочитать 4 байта Y'UV (y1, u, y2, v), (y1, y2, u, v) или (u, v, y1, y2)
YUY 422 = [y 1 uy 2 v] {\ displaystyle {YUY} _ {422} = {\ begin {bmatrix} y_ {1} u \\ y_ {2} v \ end {bmatrix}}}{\ displaystyle {YUY} _ {422} = {\ begin {bmatrix} y_ {1} u \\ y_ {2} v \ end {bmatrix}}}
YYU 422 = [y 1 y 2 uv] {\ displaystyle {YYU} _ {422} = {\ begin {bmatrix} y_ {1} y_ {2} \\ u v \ end {bmatrix}}}{\ displaystyle {YYU} _ {422} = {\ begin {bmatrix} y_ {1} y_ {2} \\ и v \ конец {bmatrix}}}
UVY 422 = [uvy 1 y 2] {\ displaystyle {UVY} _ {422} = {\ begin {bmatrix} u v \\ y_ {1} y_ {2} \ end {bmatrix}}}{\ displaystyle {UVY} _ {422} = {\ begin {bmatrix} u v \\ y_ {1} y_ {2} \ end {bmatrix}}}

преобразование Y′UV411 в RGB888

Вход: чтение 6 байтов Y'UV
Вывод: записывает 12 байтов RGB
// Извлекает компоненты YUV u = yuv [0]; y1 = yuv [1]; y2 = yuv [2]; v = yuv [3]; y3 = yuv [4]; y4 = yuv [5];
rgb1 = Y'UV444toRGB888 (y1, u, v); rgb2 = Y'UV444toRGB888 (y2, u, v); rgb3 = Y'UV444toRGB888 (y3, u, v); rgb4 = Y'UV444toRGB888 (y4, u, v);
YUV 411 = [uy 1 y 2 vy 3 y 4] {\ displaystyle {YUV} _ {411} = {\ begin {bmatrix} u y_ {1} y_ {2} \\ v y_ {3} y_ {4 } \ end {bmatrix}}}{\ displaystyle {YUV} _ {411} = {\ begin {bmatrix} u y_ {1} y_ {2} \\ v y_ {3} y_ {4} \ end {bmatrix}}}
YUV 444 = [y 1 uvy 2 uvy 3 uvy 4 uv] {\ displaystyle {YUV} _ {444} = {\ begin {bmatrix} y_ {1} u v \\ y_ {2} u v \\ y_ {3} u v \\ y_ {4} u v \ end {bmatrix}}}{\ displaystyle {YUV} _ {444} = {\ begin {bmatrix} y_ {1} u v \\ y_ {2} u v \\ y_ {3} u v \\ y_ {4} u v \ end {bmatrix}}}

Итак, в результате мы получаем 4 значения пикселя RGB (4 * 3 байта) из 6 байтов. Это означает уменьшение размера передаваемых данных вдвое с потерей качества.

Преобразование Y′UV420p (и Y′V12 или YV12) в RGB888

Y′UV420p - это планарный формат, означающий, что значения Y ′, U и V сгруппированы вместе вместо вкрапления. Причина этого в том, что за счет объединения значений U и V изображение становится более сжимаемым. Когда дан массив изображения в формате Y'UV420p, сначала идут все значения Y ', затем все значения U, а затем, наконец, все значения V.

The Y′V12 format is essentially the same as Y′UV420p, but it has the U and V data switched: the Y′ values are followed by the V values, with the U values last. As long as care is taken to extract U and V values from the proper locations, both Y′UV420p and Y′V12 can be processed using the same algorithm.

As with most Y′UV formats, there are as many Y′ values as there are pixels. Where X equals the height multiplied by the width, the first X indices in the array are Y′ values that correspond to each individual pixel. However, there are only one fourth as many U and V values. The U and V values correspond to each 2 by 2 block of the image, meaning each U and V entry applies to four pixels. After the Y′ values, the next X/4 indices are the U values for each 2 by 2 block, and the next X/4 indices after that are the V values that also apply to each 2 by 2 block.

Yuv420.svg

As shown in the above image, the Y′, U and V components in Y′UV420 are encoded separately in sequential blocks. A Y′ value is stored for every pixel, followed by a U value for each 2×2 square block of pixels, and finally a V value for each 2×2 block. Corresponding Y′, U and V values are shown using the same color in the diagram above. Read line-by-line as a byte stream from a device, the Y′ block would be found at position 0, the U block at position x×y (6×4 = 24 in this example) and the V block at position x×y + (x×y)/4 (here, 6×4 + (6×4)/4 = 30).

Y′UV420sp (NV21) to RGB conversion (Android)

This format (NV21) is the standard picture format on Android camera preview. YUV 4:2:0 planar image, with 8 bit Y samples, followed by interleaved V/U plane with 8bit 2x2 subsampled chroma samples.

C++ code used on Android to convert pixels of YUVImage:

void YUVImage::yuv2rgb(uint8_t yValue, uint8_t uValue, uint8_t vValue, uint8_t *r, uint8_t *g, uint8_t *b) const { int rTmp = yValue + (1.370705 * (vValue-128)); int gTmp = yValue - (0,698001 * (vValue-128)) - (0,337633 * (uValue-128)); int bTmp = yValue + (1,732446 * (uValue-128)); * r = зажим (rTmp, 0, 255); * g = зажим (gTmp, 0, 255); * b = зажим (bTmp, 0, 255); }
Ссылки
Внешние ссылки
Последняя правка сделана 2021-06-22 09:03:26
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте