YUV - YUV

Ejemplo de plano de color UV, valor Y ′ = 0,5, representado dentro de la gama de colores RGB
Una imagen junto con sus componentes Y ′, U y V respectivamente

YUV es un sistema de codificación de color que se utiliza normalmente como parte de una canalización de imágenes en color . Codifica una imagen en color o un video teniendo en cuenta la percepción humana , lo que permite un ancho de banda reducido para los componentes de crominancia , lo que generalmente permite que los errores de transmisión o los artefactos de compresión sean enmascarados de manera más eficiente por la percepción humana que usando una representación RGB "directa". Otras codificaciones de color tienen propiedades similares, y la razón principal para implementar o investigar las propiedades de Y′UV sería para interactuar con televisión analógica o digital o equipo fotográfico que cumpla con ciertos estándares de Y′UV.

El modelo Y′UV define un espacio de color en términos de un componente de luminancia (Y ′) y dos componentes de crominancia , llamados U (proyección azul) y V (proyección roja) respectivamente. El modelo de color Y′UV se utiliza en el estándar de video en color compuesto PAL (excluyendo PAL-N ). Los sistemas en blanco y negro anteriores usaban solo información de luma (Y ′). La información de color (U y V) se agregó por separado a través de una subportadora para que un receptor en blanco y negro aún pudiera recibir y mostrar una transmisión de imagen en color en el formato nativo en blanco y negro del receptor .

Y 'representa el componente luma (el brillo) y U y V son los componentes de crominancia (color); la luminancia se denota por Y y luma por Y ′ - los símbolos primos (') denotan corrección gamma , con " luminancia " significando brillo físico en el espacio lineal, mientras que " luma " es brillo perceptual (no lineal).

El alcance de los términos Y′UV, YUV, YCbCr , YPbPr , etc., es a veces ambiguo y superpuesto. Históricamente, los términos YUV e Y'UV se usaban para una codificación analógica específica de información de color en sistemas de televisión, mientras que YCbCr se usaba para codificación digital de información de color adecuada para video y compresión y transmisión de imágenes fijas como MPEG y JPEG . Hoy en día, el término YUV se usa comúnmente en la industria de la computación para describir formatos de archivo que están codificados usando YCbCr .

El modelo de color YPbPr utilizado en el vídeo componente analógico y su versión digital YCbCr utilizada en el vídeo digital se derivan más o menos de él, y en ocasiones se denominan Y′UV. (C B / P B y C R / P R son desviaciones del gris en los ejes azul-amarillo y rojo-cian, mientras que U y V son diferencias de luminancia azul y rojo-luminancia respectivamente). El espacio de color Y′IQ utilizado en el sistema de radiodifusión de televisión analógica NTSC se relaciona con él, aunque de una manera más compleja. El espacio de color YDbDr , utilizado en los sistemas de transmisión de televisión SECAM y PAL-N analógicos, también está relacionado.

En cuanto a la etimología, Y, Y ′, U y V no son abreviaturas. El uso de la letra Y para la luminancia se remonta a la elección de las primarias XYZ . Esto se presta naturalmente al uso de la misma letra en luma (Y ′), que se aproxima a una correlación de luminancia perceptualmente uniforme . Asimismo, se eligieron U y V para diferenciar los ejes U y V de los de otros espacios, como el espacio de cromaticidad xey. Vea las ecuaciones a continuación o compare el desarrollo histórico de las matemáticas.

Historia

Y′UV se inventó cuando los ingenieros querían televisión en color en una infraestructura en blanco y negro . Necesitaban un método de transmisión de señal que fuera compatible con la televisión en blanco y negro (B / N) y que pudiera agregar color. El componente luma ya existía como señal en blanco y negro; agregaron la señal UV a esto como una solución.

La representación UV de la crominancia se eligió sobre las señales R y B directas porque U y V son señales de diferencia de color. En otras palabras, las señales U y V le dicen al televisor que cambie el color de un punto determinado (las pantallas CRT no tienen píxeles discretos) sin alterar su brillo. O las señales U y V le dicen al monitor que haga un color más brillante a costa del otro y cuánto debe cambiarse. Cuanto más altos (o más bajos cuando son negativos) los valores U y V, más saturado (colorido) se vuelve el lugar. Cuanto más se acerquen los valores U y V a cero, menos cambiará el color, lo que significa que las luces roja, verde y azul serán más igualmente brillantes, produciendo un punto más gris. Este es el beneficio de usar señales de diferencia de color, es decir, en lugar de decir cuánto rojo hay en un color, dice cuánto es más rojo que verde o azul. A su vez, esto significaba que cuando las señales U y V fueran cero o ausentes, solo mostraría una imagen en escala de grises. Si se hubieran utilizado R y B, estos tendrían valores distintos de cero incluso en una escena en blanco y negro, lo que requeriría las tres señales portadoras de datos. Esto fue importante en los primeros días de la televisión en color, porque las viejas señales de televisión en blanco y negro no tenían señales U y V presentes, lo que significa que la televisión en color simplemente la mostraría como televisión en blanco y negro. Además, los receptores en blanco y negro podrían tomar la señal Y ′ e ignorar las señales de color U y V, haciendo que Y′UV sea compatible con versiones anteriores de todos los equipos existentes en blanco y negro, entrada y salida. Si el estándar de televisión en color no hubiera utilizado señales de diferencia de color, podría significar que una televisión en color produciría colores divertidos de una transmisión en blanco y negro o necesitaría circuitos adicionales para traducir la señal en blanco y negro a color. Fue necesario asignar un ancho de banda más estrecho al canal de crominancia porque no había ancho de banda adicional disponible. Si parte de la información de luminancia llegara a través del canal de crominancia (como sucedería si se usaran señales RB en lugar de señales UV diferenciales), la resolución en blanco y negro se habría visto comprometida.

Conversión a / desde RGB

SDTV con BT.470

Las señales Y′UV se crean normalmente a partir de una fuente RGB ( rojo , verde y azul ). Los valores ponderados de R, G y B se suman para producir Y ', una medida del brillo o luminancia general. U y V se calculan como diferencias escaladas entre Y ′ y los valores de B y R.

Los estándares PAL y NTSC (NTSC originalmente usaban YIQ ) definen las siguientes constantes, derivadas de los primarios y el punto blanco BT.470 System M (al igual que más adelante en BT.601 , aunque usa 1/2 en lugar de 0.436 y 0.615):

Y′UV se calcula a partir de RGB (Gamma precorregido R'G'B ', solo SECAM IV utilizó RGB lineal) de la siguiente manera:

Los rangos resultantes de Y ′, U y V respectivamente son [0, 1], [- U max , U max ] y [- V max , V max ].

Al invertir la transformación anterior, Y′UV se convierte en RGB:

De manera equivalente, al sustituir los valores de las constantes y expresarlas como matrices se obtienen estas fórmulas para BT.470 System M (PAL):

Tenga en cuenta que para valores pequeños de Y 'es posible obtener valores R, G o B negativos, por lo que en la práctica ajustamos los resultados RGB al intervalo [0,1].

HDTV con BT.709

HDTV Rec. 709 (muy cerca de SDTV Rec. 601) en comparación con UHDTV Rec. 2020

Para HDTV, el ATSC decidió cambiar los valores básicos de W R y W B en comparación con los valores seleccionados previamente en el sistema SDTV. Para HDTV, estos valores los proporciona la Rec. 709 . Esta decisión afectó aún más a la matriz para la conversión de Y′UV↔RGB, por lo que los valores de sus miembros también son ligeramente diferentes. Como resultado, con SDTV y HDTV generalmente hay dos representaciones distintas de Y′UV posibles para cualquier triple RGB: una SDTV-Y′UV y una HDTV-Y′UV. Esto significa en detalle que cuando se convierte directamente entre SDTV y HDTV, la información de luma (Y ') es aproximadamente la misma, pero la representación de la información del canal de croma (U & V) necesita conversión. Aún en cobertura del espacio de color CIE 1931, el Rec. El espacio de color 709 es casi idéntico al Rec. 601 y cubre el 35,9%. A diferencia de este UHDTV con Rec. 2020 cubre un área mucho más grande y, por lo tanto, se derivó su propia matriz para YCbCr (no YUV / Y′UV, desde el desmantelamiento de la televisión analógica).

BT.709 define estos valores de peso:

Los valores y son de arriba.

Las matrices de conversión para BT.709 son las siguientes:

Notas

  • Los pesos utilizados para calcular Y ′ (fila superior de la matriz) son idénticos a los utilizados en el espacio de color Y′IQ .
  • Valores iguales de rojo, verde y azul (es decir, niveles de gris) producen 0 para U y V. Negro, RGB = (0, 0, 0), produce YUV = (0, 0, 0). Blanco, RGB = (1, 1, 1), produce YUV = (1, 0, 0).
  • Estas fórmulas se utilizan tradicionalmente en televisores y equipos analógicos; Los equipos digitales como HDTV y cámaras de video digitales utilizan Y′CbCr.

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 . 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, cualquiera que haga uso de esa opción acepta una pérdida de precisión de aproximadamente el último dígito binario, normalmente en una compensación para velocidades de cálculo mejoradas.

En los siguientes ejemplos, el operador " " denota un desplazamiento a la derecha de a por b posiciones binarias. Para aclarar, las variables utilizan dos caracteres de índice: "u" se utiliza para la representación final sin signo, y "t" se utiliza para el valor intermedio reducido. Los ejemplos siguientes se proporcionan solo para BT.601. El mismo principio se puede utilizar para realizar operaciones funcionalmente equivalentes utilizando valores que coincidan de forma aceptable con los datos que siguen el BT.709 o cualquier otro estándar comparable.

Los valores de Y ′ 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 swing completo o "niveles de PC "). Esta práctica se estandarizó en SMPTE-125M para adaptarse a los sobreimpulsos de la señal ("timbre") debido al filtrado. El valor 235 acomoda un sobreimpulso máximo de blanco a negro de 255 - 235 = 20, o 20 / (235 - 16) = 9,1%, que es un poco más grande que el sobreimpulso máximo teórico ( fenómeno de Gibbs ) de aproximadamente el 8,9% del paso máximo. El espacio para los dedos de los pies es más pequeño, lo que permite solo un 16/219 = 7.3% de sobreimpulso, que es menor que el sobreimpulso máximo teórico del 8.9%. Es por eso que 16 se suma a Y ′ y por qué los coeficientes Y ′ en la transformada básica suman 220 en lugar de 255. Los valores de U y V, que pueden ser positivos o negativos, se suman con 128 para hacerlos siempre positivos, dando un rango de estudio de 16-240 para U y V. (Estos rangos son importantes en la edición y producción de video, ya que el uso del rango incorrecto dará como resultado una imagen con blancos y negros "recortados" o una imagen de bajo contraste).

Columpio de estudio para BT.601

Para obtener la representación tradicional de 8 bits "studio-swing" de Y′UV para SDTV / BT.601, se pueden utilizar las siguientes operaciones:

  1. Transformación básica de valores RGB de 8 bits a valores de 16 bits (Y ′: sin signo, U / V: con signo, los valores de la matriz se redondearon para que el rango Y ′ deseado posterior de [16..235] y el rango U / V de [16..240] se alcanza):
  2. Reducir (" >> 8") a 8 bits con redondeo ("+128") (Y ′: sin signo, U / V: con signo):
  3. Agregue un desplazamiento a los valores para eliminar cualquier valor negativo (todos los resultados son de 8 bits sin signo):

Giro completo para BT.601

Para obtener una representación "completa" de 8 bits de Y′UV para SDTV / BT.601, se pueden utilizar las siguientes operaciones:

  1. Transformación básica de RGB de 8 bits a valores de 16 bits (Y ′: sin signo, U / V: con signo, los valores de la matriz se redondearon para que el rango Y′UV deseado posterior de cada [0..255] se alcance mientras no puede ocurrir un desbordamiento):
  2. Reducir (">> 8") a valores de 8 bits con redondeo ("+128") (Y ′: sin signo, U / V: con signo):
  3. Agregue un desplazamiento a los valores para eliminar cualquier valor negativo (todos los resultados son de 8 bits sin signo):

Sistemas de luminancia / crominancia en general

La principal ventaja de los sistemas luma / chroma como Y′UV, y sus parientes Y′IQ y YDbDr , es que siguen siendo compatibles con la televisión analógica en blanco y negro (en gran parte debido al trabajo de Georges Valensi ). El canal Y ′ guarda todos los datos registrados por cámaras en blanco y negro, por lo que produce una señal adecuada para la recepción en pantallas monocromas antiguas. En este caso, la U y la V simplemente se descartan. Si se muestra el color, se utilizan los tres canales y se puede decodificar la información RGB original.

Otra ventaja de Y′UV es que parte de la información se puede descartar para reducir el ancho de banda . El ojo humano tiene muy poca sensibilidad espacial al color: la precisión de la información de brillo del canal de luminancia tiene mucho más impacto en el detalle de la imagen discernido que en los otros dos. Al comprender esta deficiencia humana, los estándares como NTSC y PAL reducen considerablemente el ancho de banda de los canales de crominancia. (El ancho de banda está en el dominio temporal, pero esto se traduce en el dominio espacial a medida que se escanea la imagen).

Por lo tanto, las señales U y V resultantes se pueden "comprimir" sustancialmente. En los sistemas NTSC (Y′IQ) y PAL, las señales de crominancia tenían un ancho de banda significativamente más estrecho que el de la luminancia. Las primeras versiones de NTSC alternaban rápidamente entre colores particulares en áreas de imagen idénticas para hacer que parecieran sumarse entre sí para el ojo humano, mientras que todos los estándares de video analógicos modernos e incluso la mayoría de los digitales usan submuestreo de croma al registrar la información de color de una imagen a una resolución reducida. Solo se mantiene la mitad de la resolución horizontal en comparación con la información de brillo (denominado submuestreo de croma 4: 2: 2) y, a menudo, la resolución vertical también se reduce a la mitad (dando 4: 2: 0). El estándar 4: x: x se adoptó debido al estándar NTSC de color más antiguo que usaba un submuestreo de croma de 4: 1: 1 (donde la resolución de color horizontal se divide en cuatro mientras que la vertical es la resolución completa) de modo que la imagen lleva solo una un cuarto de la resolución de color en comparación con la resolución de brillo. Hoy en día, solo los equipos de alta gama que procesan señales sin comprimir utilizan un submuestreo de croma de 4: 4: 4 con una resolución idéntica para la información de brillo y color.

Los ejes I y Q se eligieron de acuerdo con el ancho de banda que necesita la visión humana, siendo un eje el que requiere mayor ancho de banda y el otro (fortuitamente a 90 grados) el mínimo. Sin embargo, la verdadera demodulación I y Q era relativamente más compleja, requiriendo dos líneas de retardo analógicas, y los receptores NTSC rara vez la usaban.

Sin embargo, esta conversión de espacio de color tiene pérdidas , particularmente obvia en la diafonía desde el luma al cable portador de croma, y ​​viceversa, en equipos analógicos (incluidos conectores RCA para transferir una señal digital, ya que todo lo que transportan es video compuesto analógico , que es YUV, YIQ o incluso CVBS ). Además, las señales de color codificadas en NTSC y PAL hacen que las señales de luminancia y crominancia de gran ancho de banda se mezclen entre sí en un intento por mantener la compatibilidad con versiones anteriores de los equipos de televisión en blanco y negro, lo que da como resultado un rastreo de puntos y artefactos de colores cruzados . Cuando se creó el estándar NTSC en la década de 1950, esto no era una preocupación real ya que la calidad de la imagen estaba limitada por el equipo del monitor, no por la señal de ancho de banda limitado que se recibía. Sin embargo, la televisión moderna de hoy es capaz de mostrar más información de la que contienen estas señales con pérdida. Para mantener el ritmo de las capacidades de las nuevas tecnologías de visualización, se hicieron intentos desde finales de la década de 1970 para preservar más de la señal Y′UV mientras se transfieren imágenes, como los conectores SCART (1977) y S-Video (1987).

En lugar de Y′UV, se usó Y′CbCr como formato estándar para algoritmos de compresión de video comunes (digitales) como MPEG-2 . La televisión digital y los DVD conservan sus transmisiones de video comprimido en el formato MPEG-2, que utiliza un espacio de color Y′CbCr completo, aunque conserva el proceso establecido de submuestreo de croma. El formato de video digital profesional CCIR 601 también usa Y′CbCr a la frecuencia de submuestreo de croma común de 4: 2: 2, principalmente para compatibilidad con estándares de video analógico anteriores. Esta secuencia se puede mezclar fácilmente en cualquier formato de salida necesario.

Y′UV no es un espacio de color absoluto . Es una forma de codificar la información RGB, y el color real que se muestra depende de los colorantes RGB reales utilizados para mostrar la señal. Por lo tanto, un valor expresado como Y'UV solo es predecible si se utilizan colorantes RGB estándar (es decir, un conjunto fijo de cromaticidades primarias o un conjunto particular de rojo, verde y azul).

Además, la gama de colores y brillos (conocida como gama de colores ) de RGB (ya sea BT.601 o Rec.709) es mucho más pequeña que la gama de colores y brillos permitidos por Y′UV. Esto puede ser muy importante cuando se convierte de Y′UV (o Y′CbCr) a RGB, ya que las fórmulas anteriores pueden producir valores RGB "no válidos", es decir, valores por debajo del 0% o muy por encima del 100% del rango (p. Ej., fuera del rango de luminancia estándar de 16–235 (y rango de croma de 16–240) para televisores y contenido HD, o fuera de 0–255 para definición estándar en PC). A menos que se aborden estos valores, normalmente se "recortarán" (es decir, se limitarán) al rango válido del canal afectado. Esto cambia el tono del color, lo cual es muy indeseable, por lo que a menudo se considera mejor desaturar los colores ofensivos de manera que caigan dentro de la gama RGB. Del mismo modo, cuando RGB a una profundidad de bits determinada se convierte a YUV a la misma profundidad de bits, varios colores RGB pueden convertirse en el mismo color Y'UV, lo que da como resultado la pérdida de información.

Relación con Y′CbCr

Y′UV se usa a menudo como un término para YCbCr . Sin embargo, aunque están relacionados, son formatos diferentes con diferentes factores de escala. La matriz no escalada se utiliza en PhotoYCC de Photo CD . U y V son señales bipolares que pueden ser positivas o negativas, y son cero para los grises, mientras que YCbCr generalmente escala todos los canales al rango 16-235 o al rango 0-255, lo que hace que las cantidades sin signo Cb y Cr sean 128 para grises.

Sin embargo, la relación entre ellos en el caso estándar es simple. En particular, los canales Y 'de ambos están relacionados linealmente entre sí, tanto Cb como U están relacionados linealmente con (BY), y tanto Cr como V están relacionados linealmente con (RY).

Tipos de muestreo

Para obtener una señal digital, las imágenes Y′UV se pueden muestrear de varias formas diferentes; ver submuestreo de croma .

Conversión entre Y′UV y RGB

Los archivos RGB generalmente se codifican en 8, 12, 16 o 24 bits por píxel. En estos ejemplos, asumiremos 24 bits por píxel, que está escrito como RGB888 . El formato de bytes estándar es:

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

Los archivos Y′UV se pueden codificar en 12, 16 o 24 bits por píxel. Los formatos comunes son Y′UV444 (o YUV444), YUV411, Y′UV422 (o YUV422) e Y′UV420p (o YUV420). El apóstrofe después de la Y se omite a menudo, al igual que la "p" después de YUV420p. En términos de formatos de archivo reales, YUV420 es el más común, ya que los datos se comprimen más fácilmente 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 el canal Y y el canal U y V.

Para convertir de RGB a YUV o viceversa, lo más sencillo es utilizar RGB888 y YUV444. Para YUV411, YUV422 y YUV420, los bytes deben convertirse primero a YUV444.

YUV444    3 bytes per pixel     (12 bytes per 4 pixels)
YUV422    4 bytes per 2 pixels   (8 bytes per 4 pixels)
YUV411    6 bytes per 4 pixels
YUV420p   6 bytes per 4 pixels, reordered

Conversión de Y′UV444 a RGB888

La función [R, G, B] = Y′UV444toRGB888 (Y ′, U, V) convierte el formato Y′UV a formato RGB simple.

Las fórmulas de conversión RGB utilizadas para el formato Y′UV444 también son aplicables al formato de transmisión de TV NTSC estándar de YUV420 (o YUV422 para el caso). Para YUV420, dado que cada muestra U o V se usa para representar 4 muestras Y que forman un cuadrado, un método de muestreo adecuado puede permitir la utilización de las fórmulas de conversión exactas que se muestran a continuación. Para obtener más detalles, consulte la demostración del formato 4: 2: 0 en la sección inferior de este artículo.

Estas fórmulas se basan en el estándar NTSC:

En arquitecturas más antiguas que no son SIMD , la aritmética de punto flotante es mucho más lenta que el uso de la aritmética de punto fijo, por lo que una formulación alternativa es:

Para la conversión de Y'UV a RGB, utilizando los coeficientes c, dye, y teniendo en cuenta que denota fijar un valor en el rango de 8 bits de 0 a 255, las siguientes fórmulas proporcionan la conversión de Y'UV a RGB ( Versión NTSC):

Nota: Las fórmulas anteriores están realmente implícitas para YCbCr. Aunque el término YUV se usa aquí, YUV y YCbCr no son exactamente iguales de una manera estricta.

La versión UIT-R de la fórmula es diferente, con , mientras que y superior:

Operación entera del estándar ITU-R para YCbCr (8 bits por canal) a RGB888:

Conversión de Y′UV422 a RGB888

Entrada: leer 4 bytes de Y′UV (u, y1, v, y2)
Salida: escribe 6 bytes de RGB (R, G, B, R, G, B)
u  = yuv[0];
y1 = yuv[1];
v  = yuv[2];
y2 = yuv[3];

Con esta información, se podría analizar como formato Y′UV444 normal para obtener información de 2 píxeles RGB:

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

Y′UV422 también se puede expresar con los valores en un orden alternativo, por ejemplo, para el código de formato FourCC YUY2.

Entrada: Leer 4 bytes de Y′UV (y1, u, y2, v), (y1, y2, u, v) o (u, v, y1, y2)

Conversión de Y′UV411 a RGB888

Entrada: leer 6 bytes de Y′UV
Salida: escribe 12 bytes de RGB
// Extract YUV components
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);

Entonces, el resultado es que obtenemos valores de 4 píxeles RGB (4 * 3 bytes) a partir de 6 bytes. Esto significa reducir el tamaño de los datos transferidos a la mitad, con pérdida de calidad.

Conversión de Y′UV420p (y Y′V12 o YV12) a RGB888

Y′UV420p es un formato plano, lo que significa que los valores Y ′, U y V están agrupados en lugar de intercalados. La razón de esto es que al agrupar los valores U y V juntos, la imagen se vuelve mucho más comprimible. Cuando se le da una matriz de una imagen en el formato Y′UV420p, todos los valores de Y ′ vienen primero, seguidos de todos los valores de U, seguidos finalmente de todos los valores de V.

El formato Y′V12 es esencialmente el mismo que Y′UV420p, pero tiene los datos U y V intercambiados: los valores Y ′ son seguidos por los valores V, con los valores U al final. Siempre que se tenga cuidado de extraer los valores U y V de las ubicaciones adecuadas, tanto Y′UV420p como Y′V12 pueden procesarse utilizando el mismo algoritmo.

Como ocurre con la mayoría de los formatos Y′UV, hay tantos valores Y ′ como píxeles. Donde X es igual a la altura multiplicada por el ancho, los primeros índices X de la matriz son valores Y ′ que corresponden a cada píxel individual. Sin embargo, solo hay una cuarta parte de los valores U y V. Los valores U y V corresponden a cada bloque de 2 por 2 de la imagen, lo que significa que cada entrada U y V se aplica a cuatro píxeles. Después de los valores Y ′, los siguientes índices X / 4 son los valores U para cada bloque 2 por 2, y los siguientes índices X / 4 son los valores V que también se aplican a cada bloque 2 por 2.

Yuv420.svg

Como se muestra en la imagen anterior, los componentes Y ′, U y V en Y′UV420 se codifican por separado en bloques secuenciales. El valor AY ′ se almacena para cada píxel, seguido de un valor U para cada bloque cuadrado de píxeles de 2 × 2 y, finalmente, un valor V para cada bloque de 2 × 2. Los valores correspondientes de Y ′, U y V se muestran usando el mismo color en el diagrama de arriba. Lea línea por línea como un flujo de bytes de un dispositivo, el bloque Y ′ se encontraría en la posición 0, el bloque U en la posición x × y (6 × 4 = 24 en este ejemplo) y el bloque V en la posición x × y + (x × y) / 4 (aquí, 6 × 4 + (6 × 4) / 4 = 30).

Conversión Y′UV420sp (NV21) a RGB (Android)

Este formato (NV21) es el formato de imagen estándar en la vista previa de la cámara de Android . Imagen plana YUV 4: 2: 0, con muestras de Y de 8 bits, seguida de un plano V / U intercalado con muestras de croma submuestreadas de 2x2 de 8 bits.

Código C ++ utilizado en Android para convertir píxeles de 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)); 
    // or fast integer computing with a small approximation
    // rTmp = yValue + (351*(vValue-128))>>8;
    int gTmp = yValue - (0.698001 * (vValue-128)) - (0.337633 * (uValue-128)); 
    // gTmp = yValue - (179*(vValue-128) + 86*(uValue-128))>>8;
    int bTmp = yValue + (1.732446 * (uValue-128));
    // bTmp = yValue + (443*(uValue-128))>>8;
    *r = clamp(rTmp, 0, 255);
    *g = clamp(gTmp, 0, 255);
    *b = clamp(bTmp, 0, 255);
}

Referencias

enlaces externos