YCbCr


YCbCr, Y′CbCr o Y Pb/Cb Pr/Cr, también escrito como YCB CR o Y′CBCR, es una familia de Espacios de color utilizados como parte del proceso de imágenes en color en sistemas de vídeo y fotografía digital. Y′ es el componente de luma y CB y CR son los componentes de croma de diferencia de azul y diferencia de rojo. Y′ (con prima) se distingue de Y, que es luminancia, lo que significa que la intensidad de la luz se codifica de forma no lineal en función de las primarias RGB con corrección gamma.
Los espacios de color Y′CbCr se definen mediante una transformación matemática de coordenadas a partir de un punto blanco y primarios RGB asociados. Si el espacio de color RGB subyacente es absoluto, el espacio de color Y′CbCr también es un espacio de color absoluto; por el contrario, si el espacio RGB está mal definido, también lo está Y′CbCr. La transformación se define en las ecuaciones 32, 33 de UIT-T H.273. Sin embargo, esa regla no se aplica a las primarias P3-D65 utilizadas por Netflix con la matriz BT.2020-NCL, lo que significa que la matriz no se derivó de las primarias, pero ahora Netflix permite las primarias BT.2020 (desde 2021). Lo mismo ocurre con JPEG: tiene una matriz BT.601 derivada de las primarias del System M, pero las primarias de la mayoría de las imágenes son BT.709.
Justificación
Las pantallas de tubos de rayos catódicos funcionan con señales de voltaje rojas, verdes y azules, pero estas señales RGB no son eficientes como representación para el almacenamiento y la transmisión, ya que tienen mucha redundancia.
YCbCr e Y′CbCr son una aproximación práctica al procesamiento del color y la uniformidad perceptiva, donde los colores primarios que corresponden aproximadamente al rojo, verde y azul se procesan en información perceptualmente significativa. Al hacer esto, el posterior procesamiento, transmisión y almacenamiento de imágenes/videos pueden realizar operaciones e introducir errores de maneras perceptualmente significativas. Y′CbCr se utiliza para separar una señal luma (Y′) que puede almacenarse con alta resolución o transmitirse con un gran ancho de banda, y dos componentes croma (CB y CR) que se puede reducir en ancho de banda, submuestrear, comprimir o tratar de otro modo por separado para mejorar la eficiencia del sistema.
Un ejemplo práctico sería reducir el ancho de banda o la resolución asignada a las funciones de "color" en comparación con "blanco y negro", ya que los humanos son más sensibles a la información en blanco y negro (ver ejemplo de imagen a la derecha). Esto se llama submuestreo de croma.
CbCr
YCbCr es a veces abreviado a YCC. Típicamente los términos Y′CbCr, YCbCr, YPbPr y YUV se utilizan invariablemente, lo que conduce a cierta confusión. La diferencia principal es que YPbPr se utiliza con imágenes analógicas y YCbCr con imágenes digitales, lo que conduce a diferentes valores de escalado para Umax y Vmax (en YCbCr ambos están ) cuando se convierte en / de YUV. Y′CbCr y YCbCr difieren debido a los valores siendo gamma corregido o no.
Las ecuaciones siguientes ofrecen una mejor imagen de los principios comunes y las diferencias generales entre estos formatos.
Conversión RGB
R ''' a YPbPr

Las señales Y′CbCr (antes del escalado y las compensaciones para colocar las señales en formato digital) se denominan YPbPr y se crean a partir de la fuente RGB (rojo, verde y azul) ajustada con gamma correspondiente utilizando tres constantes definidas KR, KG y KB de la siguiente manera:
donde KR, KG, y KB son generalmente derivados de la definición del espacio RGB correspondiente, y requerido para satisfacer .
La manipulación de matrices equivalente a menudo se denomina "matriz de color":
Y su inverso:
Aquí, los símbolos primos (′) significan que se está utilizando la corrección gamma; por lo tanto, R′, G′ y B′ varían nominalmente de 0 a 1, representando 0 la intensidad mínima (por ejemplo, para mostrar el color negro) y 1 la máxima (por ejemplo, para mostrar el color blanco). El valor de luma (Y) resultante tendrá un rango nominal de 0 a 1, y los valores de croma (PB y PR) tendrán un rango nominal de - 0,5 a +0,5. El proceso de conversión inversa se puede derivar fácilmente invirtiendo las ecuaciones anteriores.
Y′PbPr a Y′CbCr
Al representar las señales en forma digital, los resultados se escalan y redondean, y normalmente se agregan compensaciones. Por ejemplo, la escala y el desplazamiento aplicados al componente Y′ según la especificación (por ejemplo, MPEG-2) dan como resultado el valor de 16 para negro y el valor de 235 para blanco cuando se utiliza una representación de 8 bits. El estándar tiene versiones digitalizadas de 8 bits de CB y CR escaladas a un rango diferente de 16 a 240. En consecuencia, el reescalado por la fracción (235-16)/ (240-16) = 219/224 a veces se requiere al realizar matrices de color o procesamiento en el espacio YCbCr, lo que produce distorsiones de cuantificación cuando el procesamiento posterior no se realiza utilizando profundidades de bits más altas.
La escala que da como resultado el uso de un rango de valores digitales más pequeño de lo que podría parecer deseable para la representación del rango nominal de los datos de entrada permite cierto "exceso" y "no alcanzar" durante el procesamiento sin necesidad de recortes no deseados. Este "espacio libre" y "espacio para los pies" También se puede utilizar para ampliar la gama de colores nominal, según lo especificado por xvYCC.
El valor 235 se adapta a un sobrepaso máximo de (255 - 235) / (235 - 16) = 9,1%, que es ligeramente mayor que el sobrepaso máximo teórico (fenómeno de Gibbs) de aproximadamente el 8,9% del máximo (negro a blanco). El espacio para los pies es más pequeño, lo que permite solo un sobrepaso de 16/219 = 7,3%, que es menor que el sobrepaso máximo teórico del 8,9%. Además, debido a que los valores 0 y 255 están reservados en HDMI, el espacio es un poco menor.
Y′CbCr a xvYCC
Dado que las ecuaciones que definen Y′CbCr se forman de una manera que gira todo el cubo de color RGB nominal y lo escala para caber dentro de un cubo de color YCbCr (más grande), hay algunos puntos dentro del cubo de color Y′CbCr que < No puedo representarme en el dominio RGB correspondiente (al menos no dentro del rango RGB nominal). Esto causa cierta dificultad para determinar cómo interpretar y mostrar correctamente algunas señales Y′CbCr. xvYCC utiliza estos valores de Y′CbCr fuera de rango para codificar colores fuera de la gama BT.709.
Conversión UIT-R BT.601
La forma de Y′CbCr que se definió para el uso de televisión de definición estándar en el estándar ITU-R BT.601 (anteriormente CCIR 601) para su uso con vídeo de componentes digitales se deriva del espacio RGB correspondiente (ITU-R BT.470-6 Primarios del Sistema M) de la siguiente manera:
A partir de las constantes y fórmulas anteriores, se puede derivar lo siguiente para ITU-R BT.601.
YPbPr analógico de R'G'B' se deriva de la siguiente manera:
El digital Y′CbCr (8 bits por muestra) se deriva del analógico R'G'B' como sigue:
o simplemente por componentes
Las señales resultantes varían de 16 a 235 para Y′ (Cb y Cr varían de 16 a 240); los valores de 0 a 15 se denominan espacio para los pies, mientras que los valores de 236 a 255 se denominan espacio para la cabeza.
Alternativamente, Y′CbCr digital puede derivarse de R'dG'dB'd digital (8 bits por muestra, cada uno usando el rango completo donde cero representa negro y 255 representa blanco) de acuerdo con lo siguiente ecuaciones:
En la fórmula siguiente, los factores de escalado se multiplican por . Esto permite el valor 256 en el denominador, que puede ser calculado por un solo bitshift.
Si la fuente digital R'd G'd B'd incluye escoba y escoba, el offset 16 debe ser restringido primero de cada señal, y un factor de escala necesita ser incluido en las ecuaciones.
La transformada inversa es:
La transformada inversa sin redondeos (usando valores provenientes directamente de la recomendación ITU-R BT.601) es:
Esta forma de Y′CbCr se utiliza principalmente para sistemas de televisión de definición estándar más antiguos, ya que utiliza un modelo RGB que se ajusta a las características de emisión de fósforo de los CRT más antiguos.
Conversión UIT-R BT.709

En el estándar ITU-R BT.709 se especifica una forma diferente de Y′CbCr, principalmente para uso en HDTV. La forma más nueva también se utiliza en algunas aplicaciones orientadas a pantallas de ordenador, como sRGB (aunque la matriz utilizada para la forma sRGB de YCbCr, sYCC, sigue siendo BT.601). En este caso, los valores de Kb y Kr difieren, pero las fórmulas para utilizarlos son las mismas. Para ITU-R BT.709, las constantes son:
Esta forma de Y′CbCr se basa en un modelo RGB que se ajusta más a las características de emisión de fósforo de los CRT más nuevos y otros equipos de visualización modernos. Las matrices de conversión para BT.709 son estas:
Las definiciones de R', G' y B' Las señales también difieren entre BT.709 y BT.601, y difieren dentro de BT.601 dependiendo del tipo de sistema de TV en uso (625 líneas como en PAL y SECAM o 525 líneas como en NTSC), y difieren aún más en otros especificaciones. En diferentes diseños existen diferencias en las definiciones de las coordenadas de cromaticidad R, G y B, el punto blanco de referencia, el rango de gama admitido, las funciones exactas de precompensación gamma para derivar R', G' y B' de R, G y B, y en la escala y las compensaciones que se aplicarán durante la conversión de R'G'B' a Y′CbCr. Entonces, la conversión adecuada de Y′CbCr de una forma a otra no es solo cuestión de invertir una matriz y aplicar la otra. De hecho, cuando Y′CbCr se diseña idealmente, los valores de KB y KR se derivan de la especificación precisa de las señales primarias de color RGB, de modo que la luma La señal (Y′) corresponde lo más fielmente posible a una medición de luminancia ajustada por gamma (normalmente basada en las mediciones CIE 1931 de la respuesta del sistema visual humano a los estímulos de color).
Conversión UIT-R BT.2020
El estándar ITU-R BT.2020 utiliza la misma función gamma que BT.709. Se define:
- Iluminación no constante Y'CbCr, similar a las entradas anteriores, excepto con diferentes KB y KR.
- Iluminación constante Y'cCbcCrc, una formulación donde Y' es la versión gamma-codec de la verdadera luminancia.
Para ambos, los coeficientes derivados de las primarias son:
Para NCL, la definición es clásica: Y' = 0,2627R' + 0,6780 G' + 0,0593 B'; Cb = (B' - Y)' / 1,8814; Cr = (R' - Y') / 1,4746. La conversión de codificación se puede escribir, como es habitual, como una matriz. La matriz de decodificación para BT.2020-NCL es esta con 14 decimales:
Los valores más pequeños de la matriz no están redondeados; son valores precisos. Para sistemas con precisión limitada (8 o 10 bits, por ejemplo), se podría utilizar una precisión más baja de la matriz anterior, conservando solo 6 dígitos después del punto decimal.
La versión CL, YcCbcCrc, codifica:
- Y'c = (0.2627R + 0.6780 G + 0.0593 B)'. Esta es la función gamma aplicada a la verdadera luminancia calculada a partir de RGB lineal.
- Cbc = (B'-Y'c) / (-2 Nb) si B' significa Y'c; (B'-Y'c) / (2 Pb) de otro modo. Nb y Pb son el mínimo teórico y máximo de (B'-Y'c) correspondiente a la gama. Los valores redondeados "prácticos" son Pb = 0.7910, Nb = -0.9702. La derivación completa se puede encontrar en la recomendación.
- Crc = (R'-Y'c) / (-2 Nr) si R' significa Y'c; (R'-Y'c) / (2 Pr) de otro modo. De nuevo, Pr y Nr son límites teóricos. Los valores redondeados son Pr 0.4969, Nr = -0.8591.
La función CL se puede utilizar cuando la preservación de la luminancia es de primordial importancia (consulte: Submuestreo de croma § Error de luminancia gamma) o cuando "existe una expectativa de mejora de la eficiencia de codificación para la entrega". La especificación hace referencia al Informe UIT-R BT.2246 sobre este asunto. BT.2246 establece que CL ha mejorado la eficiencia de compresión y la preservación de la luminancia, pero NCL resultará más familiar para el personal que anteriormente se ha ocupado de la mezcla de colores y otras prácticas de producción en HDTV YCbCr.
BT.2020 no define PQ y, por lo tanto, HDR; se define con más detalle en SMPTE ST 2084 y BT.2100. BT.2100 introducirá el uso de ICTCP, un espacio de color semiperceptual derivado de RGB lineal con buena linealidad de tono. Es una "luminancia casi constante".
Conversión SMPTE 240M
El estándar SMPTE 240M (utilizado en el sistema de televisión analógico HD MUSE) define YCC con estos coeficientes:
Los coeficientes se derivan de los primarios SMPTE 170M y del punto blanco, tal como se utiliza en el estándar 240M.
Conversión JPEG
El uso JFIF de JPEG admite una versión Rec modificada. 601 Y′CbCr donde Y′, CB y CR tienen el rango completo de 8 bits de [0...255]. A continuación se muestran las ecuaciones de conversión expresadas con seis dígitos decimales de precisión. (Para ecuaciones ideales, consulte ITU-T T.871.) Tenga en cuenta que para las siguientes fórmulas, el rango de cada entrada (R,G,B) es también el rango completo de 8 bits de [0...255].
Y de vuelta:
La conversión anterior es idéntica a sYCC cuando la entrada se proporciona como sRGB, excepto que IEC 61966-2-1:1999/Amd1:2003 solo proporciona cuatro dígitos decimales.
JPEG también define un formato "YCCK" formato de Adobe para entrada CMYK. En este formato, la "K" El valor se pasa tal cual, mientras que CMY se utiliza para derivar YCbCr con la matriz anterior asumiendo R=1-C, G=1-M y B=1-Y. Como resultado, se puede utilizar un conjunto similar de técnicas de submuestreo.
Coeficientes para los primarios BT.470-6 Sistema B, G
Estos coeficientes no se utilizan y nunca se utilizaron.
Sistemas de luminancia derivados de la cromaticidad
H.273 también describe sistemas de luminancia constante y no constante que se derivan estrictamente de primarios y punto blanco, de modo que situaciones como sRGB/BT.709 primarios predeterminados de JPEG que usan matriz BT.601 (que se deriva de BT..470-6 System M) no suceden.
Aproximaciones numéricas
Antes del desarrollo de procesadores rápidos de punto flotante SIMD, la mayoría de las implementaciones digitales de RGB → Y′UV usaban matemáticas enteras, en particular aproximaciones de punto fijo. La aproximación significa que la precisión de los números utilizados (datos de entrada, datos de salida y valores constantes) es limitada y, por lo tanto, quienquiera que haga uso de esa opción acepta una pérdida de precisión de aproximadamente el último dígito binario, generalmente en una compensación para velocidades de cálculo mejoradas.
Los valoresY′ se desplazan y escalan convencionalmente al rango [16, 235] (denominado swing de estudio o "niveles de TV") en lugar de utilizar el rango completo de [0, 255] (denominado como máximo o "niveles de PC"). Esta práctica se estandarizó en SMPTE-125M para dar cabida a los excesos de señal ("timbres") debido al filtrado. Los valores U y V, que pueden ser positivos o negativos, se suman con 128 para que sean siempre positivos, dando un rango de estudio de 16 a 240 para U y V. (Estos rangos son importantes en la edición y producción de video, ya que usar el valor incorrecto rango dará como resultado una imagen con blancos y negros "recortados" o una imagen de bajo contraste).
Matrices aproximadas de 8 bits para BT.601
Estas matrices redondean todos los factores a la unidad 1/256 más cercana. Como resultado, solo se forma un valor intermedio de 16 bits para cada componente y un simple desplazamiento a la derecha con redondeo (x + 128) >> 8
puede encargarse de la división.
Para swing de estudio:
Para pleno rendimiento:
Skia de Google solía utilizar la matriz de rango completo de 8 bits anterior, lo que daba como resultado un ligero efecto verde en las imágenes JPEG codificadas por dispositivos Android, más notable al guardarlas repetidamente. El problema se solucionó en 2016, cuando se utilizó la versión más precisa. Debido a las optimizaciones SIMD en libjpeg-turbo, la versión precisa es en realidad más rápida.
Conversión y formatos de píxeles empaquetados
Los archivos RGB normalmente están codificados en 8, 12, 16 o 24 bits por píxel. En estos ejemplos, asumiremos 24 bits por píxel, que se escribe como RGB888. El formato de byte estándar es simplemente r0, g0, b0, r1, g1, b1,...
.
Los formatos de píxeles empaquetados YCbCr a menudo se denominan "YUV". Estos archivos se pueden codificar en 12, 16 o 24 bits por píxel. Dependiendo del subsamping, los formatos pueden describirse en gran medida como 4:4:4, 4:2:2 y 4:2:0p. A menudo se omite el apóstrofe después de la Y, al igual que la "p" (para planar) después de YUV420p. En términos de formatos de archivo reales, 4:2:0 es el más común, ya que los datos son más reducidos y la extensión del archivo suele ser ".YUV". La relación entre la velocidad de datos y el muestreo (A:B:C) se define por la relación entre los canales Y, U y V. La notación de "YUV" seguido de tres números es vago: los tres números podrían referirse al submuestreo (como se hace en "YUV420"), o podrían referirse a la profundidad de bits en cada canal (como se hace en "YUV565&). #34;). La forma inequívoca de referirse a estos formatos es mediante el código FourCC.
Para convertir de RGB a YUV o viceversa, lo más sencillo es utilizar RGB888 y 4:4:4. Para 4:1:1, 4:2:2 y 4:2:0, los bytes deben convertirse primero a 4:4:4.
4:4:4
4:4:4 es sencillo, ya que no se realiza ninguna agrupación de píxeles: la diferencia radica únicamente en cuántos bits tiene cada canal y su disposición. El esquema básico YUV3
utiliza 3 bytes por píxel, con el orden y0, u0, v0, y1, u1, v1
(usando "u" para Cb y "v" para Cr; lo mismo se aplica al contenido siguiente). En las computadoras, es más común ver un AYUV
formato, que agrega un canal alfa y va a0, y0, u0, v0, a1, y1, u1, v1
, porque los grupos de 32 bits son más fáciles de manejar.
4:2:2
4:2:2 agrupa 2 píxeles horizontalmente en cada "contenedor" conceptual. Dos arreglos principales son:
- YUY2: también llamado YUYV, funciona en el formato
y0, u, y1, v
.YUY2 formato - UYVY: el cambio de byte de YUY2, funciona en el formato
u, y0, v, y1
.
4:1:1
4:1:1 rara vez se utiliza. Los píxeles están en grupos horizontales de 4.
4:2:0
4:2:0 se utiliza con mucha frecuencia. Los formatos principales son IMC2, IMC4, YV12 y NV12. Estos cuatro formatos son "planos", lo que significa que los valores Y, U y V están agrupados en lugar de intercalados. Todos ellos ocupan 12 bits por píxel, suponiendo un canal de 8 bits.
- IMC2 primero pone las imágenes completas en Y. Luego arregla cada línea de croma en el orden de V0... Vn, U0... Un, donde n es el número de muestras de croma por línea, igual a la mitad del ancho de Y.
- IMC4 es similar a IMC2, excepto que funciona en U0... Un, V0... Vn.
- YV12 es un diseño más simple y es más comúnmente utilizado. Toda la imagen en Y está escrita, seguida por la imagen en V, luego por toda la imagen en U.
Diseño YV12 - NV12 es posiblemente el formato 8-bit 4:2:0 más utilizado. Es el predeterminado para la cámara Android vista previa. Toda la imagen en Y está escrita, seguida de líneas interleatorias que van U0, V0, U1, V1, etc.
También hay "en mosaico" variantes de formatos planos.