En la codificación HEVC (High-Efficiency Video Coding), la predicción inter es un componente crucial para la compresión eficiente de los videos. En este proceso, las unidades de predicción (PU, por sus siglas en inglés) se codifican utilizando información de cuadros de referencia, lo que permite reducir el tamaño del archivo sin perder calidad visual. Examinemos cómo funcionan las modalidades de codificación y las decisiones que toma el codificador al utilizar las predicciones inter para los PUs.

Codificación de PUs: Modos AMVP y de fusión

Cuando el codificador enfrenta la necesidad de codificar un PU, como el PU1 mostrado en la figura 6.103, debe decidir el modo de predicción a utilizar. En este caso, el codificador elige el modo AMVP (Advanced Motion Vector Prediction), que utiliza vecinos disponibles para predecir el bloque. A la izquierda, los vecinos A0 y A1 son fuentes de predicción válidas, mientras que los vecinos superiores B0, B1 y B2 no lo son, ya que están codificados de forma intra. Los bloques T1 y T2 en la imagen de referencia sí están disponibles como predictores. Así, la lista de predictores posibles es: (A0, T1).

El codificador selecciona A0 como predictor y establece la señalización correspondiente: merge_flag = 0 (es decir, no se utiliza fusión) y mvp_flag = 0 (selección del primer predictor). La elección del vector de movimiento se realiza restando el vector de movimiento del bloque A0 del vector de movimiento del bloque actual.

Tras codificar el PU1, el codificador decide cómo codificar el siguiente PU, PU2, utilizando el modo de fusión. En este caso, el candidato izquierdo A0 no está disponible porque aún no ha sido codificado, pero A1 es accesible ya que se ha utilizado en PU1. Los bloques T1 y T2 en la imagen de referencia siguen disponibles. La lista de candidatos de fusión es: (A1, B0, T1, Pad), donde "Pad" representa un vector de movimiento cero. El codificador elige A1 y marca la señalización como merge_flag = 1 con merge_idx = 0, es decir, selecciona el primer candidato de fusión. El decodificador luego copia el vector de movimiento y el índice de referencia de A1.

La fusión para crear regiones irregulares

El modo de fusión de HEVC es particularmente útil para modelar movimiento en regiones de formas irregulares. Como se ilustra en la figura 6.105, el proceso de fusión puede comenzar con un PU rectangular de 8x16 en CTU1, que se codifica en el modo AMVP. Posteriormente, se utiliza la fusión para extender la predicción hacia bloques adyacentes, como el PU de 12x16 en CTU3. Al usar la fusión, el codificador hereda los parámetros de movimiento del primer PU, lo que permite que múltiples bloques en la misma región compartan el mismo vector de movimiento.

Este enfoque tiene la ventaja de que permite que áreas de formas complejas o irregulares sean representadas mediante un conjunto único de parámetros de movimiento, lo que reduce la redundancia de datos y mejora la eficiencia de la compresión.

Fuentes de predicción inter en HEVC

En una imagen de tipo P (P-slice), cada PU se predice a partir de una sola imagen de referencia, elegida de una lista de imágenes de referencia disponibles, List 0. El codificador transmite información codificada sobre la predicción, como si se utiliza fusión o predicción, el índice de la imagen de referencia y la información residual codificada. En un B-slice, un PU puede predecirse a partir de una o dos imágenes de referencia. Esto incluye la posibilidad de usar predicción bipredicción, en la que se emplean dos imágenes de referencia, una del pasado y otra del futuro, para predecir el movimiento.

El uso de diferentes imágenes de referencia, tanto pasadas como futuras, en las P-slices y B-slices permite modelar el movimiento en escenas complejas, como aquellas con objetos en movimiento rápido o cambios de escena.

Bipredicción y predicción ponderada

La bipredicción es una característica clave de los B-slices en HEVC, donde cada PU se predice a partir de dos imágenes de referencia. La predicción resultante es una combinación ponderada de las muestras de cada imagen de referencia. Esta ponderación se puede ajustar mediante un factor de ponderación, que puede ser enviado en el encabezado del segmento del slice. Este ajuste es útil, por ejemplo, cuando se realiza una transición suave o un "fade" entre dos imágenes.

Además, la predicción ponderada puede aplicarse de manera independiente a los componentes de luma y croma, lo que otorga mayor control sobre la calidad y la eficiencia de la compresión, permitiendo al codificador adaptar la predicción según las necesidades específicas de la imagen.

Interpolación subpíxel en HEVC

HEVC también emplea interpolación subpíxel para mejorar la precisión de la predicción. Utilizando filtros de siete o ocho taps, el codificador interpola la componente de luma a una resolución de cuarto de píxel. La componente de croma se interpola a una resolución de octavo de píxel mediante filtros de cuatro taps. Esta interpolación subpíxel asegura que la predicción inter sea lo más precisa posible, reduciendo los errores de predicción y mejorando la calidad visual del video comprimido.

Por ejemplo, las posiciones de muestreo en luma Aij, que corresponden a posiciones de píxel entero en la imagen de referencia, tienen quince posiciones intermedias de cuarto de píxel que el codificador utiliza para interpolar la predicción. Esta técnica permite que los bloques de video se ajusten de manera más precisa a las imágenes de referencia, mejorando la calidad de la predicción y la eficiencia de la codificación.

Es crucial entender que la precisión de la interpolación subpíxel no solo mejora la calidad visual, sino que también optimiza la compresión al reducir los residuos que deben ser codificados. Al utilizar movimientos más precisos, se disminuye la cantidad de datos que se necesitan para describir las diferencias entre el cuadro original y el predicho, lo que resulta en una mejor relación de compresión.

¿Cómo afecta el tamaño del paso de cuantización a la calidad y compresión de una imagen o video?

La cuantización es un paso fundamental en la compresión de imágenes y videos, que implica representar los coeficientes transformados de una imagen con una precisión finita. Este proceso puede ser ajustado modificando el tamaño del paso de cuantización, lo que influye directamente en la calidad visual del bloque decodificado y en la eficiencia de compresión. En esta sección, abordamos cómo tres tamaños de paso de cuantización (16, 32 y 64) afectan tanto la calidad de la imagen como la cantidad de compresión obtenida.

Al utilizar un tamaño de paso de cuantización de 16, como se ilustra en la figura 7.35, se observa que un mayor número de coeficientes se establece en cero, lo que implica una mayor compresión. Sin embargo, la diferencia entre el bloque original y el bloque de salida es aún leve, lo que sugiere que la calidad visual no se ve significativamente afectada, aunque comienza a ser evidente una leve distorsión. Este comportamiento refleja una reducción en la cantidad de información que necesita ser codificada, pero sin una pérdida visual apreciable. La imagen sigue siendo "visualmente similar" a la original, lo que indica que este tipo de cuantización es útil cuando se busca un buen equilibrio entre compresión y calidad.

Cuando el paso de cuantización se incrementa a 32, como se muestra en la figura 7.36, la cantidad de coeficientes no nulos disminuye aún más. Con un paso de 64, como se observa en la figura 7.37, solo ocho de los 64 coeficientes originales permanecen activos, lo que resulta en una mayor pérdida de información. La calidad visual del bloque decodificado comienza a diferir notablemente de la imagen original, lo que ilustra la relación directa entre el tamaño del paso de cuantización, la compresión y la calidad de la imagen. A mayor tamaño del paso, mayor compresión y menor calidad visual.

Es importante comprender que la cuantización y la rescalificación de los coeficientes tienen un impacto directo en la compresión, pero también en la distorsión. Si bien aumentar el paso de cuantización reduce la cantidad de información que necesita ser codificada, también aumenta la diferencia visual entre la imagen original y la decodificada. Así, el tamaño del paso de cuantización no solo determina el grado de compresión, sino también la calidad percibida del contenido después de la decodificación.

La cuantización se realiza dividiendo cada coeficiente por el tamaño del paso y redondeando el resultado al número entero más cercano. Posteriormente, el coeficiente cuantizado es rescalado multiplicándolo nuevamente por el mismo tamaño de paso. Este proceso simple de cuantización es conocido como Cuantizador (a). Sin embargo, este proceso puede ser optimizado para generar diferentes mapas entre los coeficientes originales y los coeficientes rescalados, como en el caso de Cuantizador (b). En este segundo caso, el mapeo entre los coeficientes originales y los rescalados es más "agresivo", ya que más coeficientes se cuantizan a cero, lo que resulta en una mayor compresión pero también en una mayor distorsión.

Por ejemplo, un coeficiente de -5, que con Cuantizador (a) sería cuantizado a -1 y rescalado a -8, en Cuantizador (b) sería cuantizado a cero y rescalado a cero. Esto muestra cómo el diseño de la cuantización puede ajustarse para ser más agresivo, sacrificando más información para obtener una mayor tasa de compresión, aunque esto puede venir a costa de la calidad visual.

Para mejorar la calidad visual en la compresión de imágenes o videos, es posible ajustar el tamaño del paso de cuantización de manera que las frecuencias bajas sean cuantizadas con menor agresividad que las frecuencias altas. Esta técnica se conoce como cuantización ponderada por frecuencia. Como se observa en la figura 7.40, el tamaño del paso de cuantización aumenta hacia la parte inferior derecha de un bloque de 8x8, donde las frecuencias son más altas. Al aplicar este tipo de cuantización, se pueden retener más detalles en las frecuencias bajas, que son más relevantes para la percepción visual, mientras que se elimina más información de las frecuencias altas, que tienen menos impacto visual.

Este enfoque de ponderación de frecuencias mejora la eficiencia de la compresión sin sacrificar tanto la calidad visual. Los coeficientes de frecuencia baja, que generalmente contienen la mayor parte de la información visual importante, reciben una menor cuantización, lo que les permite conservar más detalles. En cambio, los coeficientes de alta frecuencia, que a menudo contienen información más sutil y menos relevante para la percepción visual, se cuantizan de manera más agresiva, reduciendo la cantidad de datos necesarios para representar esos detalles.

Es crucial entender que el objetivo del diseño de un cuantizador es encontrar un balance entre la tasa de compresión y la calidad de la imagen o video decodificado. Mientras más agresivo sea el proceso de cuantización, mayor será la compresión, pero también mayor será la distorsión visual. Además, un diseño eficiente del cuantizador debe tener en cuenta otros factores prácticos, como la complejidad computacional y la compatibilidad entre codificadores y decodificadores.

¿Cómo funciona la codificación aritmética binaria (BAC) en la transmisión de fracciones binarias?

La codificación aritmética binaria (BAC) se utiliza para representar secuencias binarias de manera eficiente, transmitiendo fracciones binarias con una precisión adecuada para que el decodificador pueda reconstruir la secuencia original. Para explicar este proceso, tomemos como ejemplo la secuencia binaria b0b1b2=101b_0b_1b_2 = 101, cuya probabilidad de ocurrencia es 0.035. En este caso, la cantidad de información contenida en esta secuencia es I=log2(10.035)=4.84I = \log_2\left(\frac{1}{0.035}\right) = 4.84 bits. Sin embargo, el codificador binario aritmético tiene como objetivo representar esta secuencia con solo 5 bits, logrando así una representación eficiente de la información.

En el proceso de codificación, se asume que la parte entera del número siempre es 0, es decir, no se enviarán punteros fraccionarios cuyo valor sea igual o mayor a 1.0b. De esta manera, el codificador transmite la secuencia de 5 bits 01011 para representar la fracción 0.01011b. Cuando el decodificador recibe estos 5 bits, construye la fracción y la utiliza para localizar el rango correspondiente a la secuencia de bins 101101.

El codificador y el decodificador enfrentan dos desafíos clave en este proceso. Primero, si se tiene una secuencia larga de bins para codificar, no se desea esperar hasta el final para enviar información. Segundo, a medida que el rango se va estrechando, se requieren variables de alta precisión tanto en el codificador como en el decodificador para rastrear el rango y el puntero. Estos desafíos se resuelven mediante un proceso de escalado o renormalización.

Una vez que el bit más significativo (MSB) del puntero fraccionario se vuelve inconfundible, es decir, cuando es claro que el MSB es 0 o 1, el codificador puede enviar ese bit al decodificador, evitando que el rango se vuelva demasiado estrecho. El decodificador, por su parte, recibe estos MSBs, escala su propio rango y decodifica los bins cuando ha recibido suficientes MSBs fraccionarios.

El proceso de elección de una fracción binaria puede ilustrarse a través de la figura 8.19, donde las fracciones binarias se desarrollan conforme el sub-rango se va estrechando. Por ejemplo, cuando el primer valor de bin b0=1b_0 = 1, el rango resultante es (0.3, 1). La fracción binaria 0.1b se ajusta dentro de este rango, pero el MSB no es claro, ya que otras fracciones binarias como 0.0101b también encajan en este rango. Al introducir el segundo valor b1=0b_1 = 0, el rango se ajusta a (0.3, 0.37), y los dos MSBs se vuelven inconfundibles, lo que permite al codificador enviar un 0 y renormalizar la fracción. Finalmente, con el tercer valor b2=1b_2 = 1, el rango se estrecha aún más a (0.335, 0.37), y el codificador puede continuar con la transmisión de bits hasta representar toda la secuencia original.

El proceso de renormalización es crucial para que el codificador pueda manejar correctamente los rangos que se vuelven demasiado estrechos. Si el valor máximo del rango es menor que 0.5, se renormaliza multiplicando los valores del rango por 2 y enviando un 0. Si el valor mínimo del rango es mayor que 0.5, se renormaliza multiplicando los valores del rango por 2 y restando 1, enviando un 1. Este proceso asegura que el rango del puntero fraccionario se mantenga dentro de límites manejables y que la información se codifique de manera eficiente. El ejemplo en la figura 8.22 ilustra cómo el codificador toma decisiones de normalización dependiendo de las condiciones del rango.

El proceso de codificación con BAC también puede incluir múltiples iteraciones de renormalización, como se ve en el ejemplo del bin sequence b0b1b2=101b_0b_1b_2 = 101. En este caso, al codificar el primer bin b0=1b_0 = 1, el rango resultante es (0.3, 1), que no requiere renormalización. Luego, al codificar b1=0b_1 = 0, el rango se ajusta a (0.3, 0.37), y el codificador realiza tres pasos de renormalización antes de pasar al siguiente valor binario. Este proceso asegura que la secuencia binaria se represente de manera precisa y eficiente a lo largo de la codificación.

Además de la eficiencia en la representación de la información, uno de los aspectos clave que debe entender el lector es cómo la renormalización impacta en la precisión de los resultados. En codificaciones aritméticas complejas, la precisión del rango es fundamental para evitar pérdidas de información y garantizar una correcta reconstrucción de la secuencia binaria. A medida que se avanza en la codificación de secuencias más largas, el proceso de renormalización y la correcta administración de los rangos se vuelve esencial para mantener la eficiencia de la codificación, evitando que el rango se vuelva incontrolable y se pierdan datos importantes.