La predicción intra en el estándar HEVC (High Efficiency Video Coding) es una técnica avanzada utilizada para mejorar la compresión de imágenes estáticas dentro de los cuadros de un video. Esta predicción se basa en la interpolación de los valores de píxeles ya codificados en un bloque vecino para predecir los valores de los píxeles dentro de un bloque que aún no ha sido procesado. El proceso de predicción tiene como objetivo minimizar la cantidad de datos que necesitan ser enviados, aprovechando las redundancias espaciales que existen dentro de una imagen.

El modo de predicción más básico en HEVC es el modo DC, en el que se calcula un promedio de los píxeles vecinos, generalmente los de arriba y a la izquierda del bloque en cuestión. Este valor promedio se utiliza para predecir todos los píxeles dentro del bloque, lo que es especialmente útil cuando la imagen es homogénea o cuando las diferencias entre los píxeles vecinos son mínimas. Por otro lado, los modos angulares permiten realizar predicciones mucho más complejas y precisas al extrapolar información desde los píxeles vecinos en direcciones específicas. Estos modos pueden extrapolar en líneas diagonales, horizontales o verticales, con ángulos definidos según el patrón de dirección más cercano a los detalles visuales presentes en la imagen.

En el caso de la predicción angular, se disponen de 33 modos posibles, cada uno ajustado para una orientación diferente del bloque. Los modos horizontales y verticales, como el modo 10 (horizontal) o el modo 26 (vertical), son opciones especialmente útiles cuando se identifican patrones horizontales o verticales dominantes en la imagen. Mientras que otros modos, como el modo 2, modo 18 o modo 34, predicen en ángulos de 45 grados, ajustándose mejor a las imágenes que presentan características diagonales. De esta forma, se logra una representación más precisa de los detalles del bloque al seguir la estructura inherente de la imagen.

Es importante destacar que la suavización de los píxeles de referencia juega un papel fundamental en el proceso de predicción. En los bloques más grandes, como los de 8x8 o mayores, se emplea una interpolación bilineal para obtener un valor de predicción más fino cuando la fuente de la predicción no se encuentra exactamente en la posición de un píxel. Para los bloques de mayor tamaño, los valores de los píxeles de los bordes son suavizados utilizando filtros lineales de tres pasos, lo que garantiza que no haya discontinuidades o saltos abruptos en los bordes del bloque.

En cuanto al señalamiento de los modos de predicción en el flujo de bits, HEVC utiliza una técnica eficiente en la que se envían indicaciones para los modos más probables. A través del Modo de Predicción Más Probable (MPM), el codificador envía un conjunto de tres posibles modos de predicción para cada bloque. Si los bloques vecinos tienen el mismo modo de predicción, estos se ajustan dentro de una lista de candidatos (+/- 1). De esta manera, se reduce la cantidad de datos que deben transmitirse, ya que no es necesario enviar información redundante cuando las predicciones de los bloques vecinos son similares.

Además, HEVC permite que los bloques cromáticos, es decir, los componentes de color, utilicen los mismos modos de predicción que los bloques de luma (luminancia). Si los bloques de luma se codifican con un modo específico, los bloques cromáticos pueden heredar el mismo modo de predicción, lo que optimiza aún más la compresión.

Es importante comprender que la predicción intra no es una solución definitiva para todo tipo de contenido visual. La efectividad de la predicción depende en gran medida de la naturaleza de la imagen: si la imagen tiene áreas con mucho detalle o transiciones suaves, los modos de predicción más simples, como el DC, pueden ser los más efectivos. Sin embargo, en imágenes con texturas o detalles muy finos, los modos angulares ofrecerán una mejor aproximación al valor real de los píxeles.

Por último, cuando se codifican bloques en los bordes de las imágenes o en las transiciones entre diferentes tipos de predicción, algunos de los píxeles vecinos pueden no estar disponibles. En estos casos, el codificador puede copiar los valores de los píxeles adyacentes que sí están presentes, permitiendo que se mantenga la consistencia en los modos de predicción y facilitando el uso de un mayor número de modos predichos. Esto es especialmente útil para las transiciones entre bloques de tamaño más pequeño, como los de 4x4.

¿Cómo se realiza la codificación aritmética binaria (BAC)?

La codificación aritmética binaria (BAC) es una técnica utilizada en compresión de datos que convierte una secuencia de valores binarios en una representación más eficiente en términos de espacio. Esta técnica es esencialmente una forma de compresión de datos que permite transmitir información utilizando menos bits, basándose en las probabilidades de los valores posibles de los elementos codificados.

En un proceso típico de codificación BAC, cada parámetro o conjunto de datos a codificar es binarizado primero, lo que implica convertir el valor no binario (como un valor de un vector de movimiento) en su representación binaria. Este valor binario se descompone en una serie de "bins" (contenedores) que se codifican utilizando la codificación aritmética. Cada "bin" tiene un modelo de contexto asociado, que puede ser único para ese bin o compartido con otros. Por ejemplo, el bin 0 puede tener su propio modelo de contexto, mientras que los bins 2 a 9 pueden compartir el mismo modelo.

Proceso de binarización

El proceso de binarización convierte un valor de parámetro en una secuencia binaria, como se muestra en el ejemplo de la Tabla 8.12. Aquí, el valor de un parámetro con varios valores enteros se mapea a un código binario unario. Cada bit en esta secuencia de bits es considerado un "bin". Para el valor 0, el primer bin será 0, el segundo bin será 1, y así sucesivamente. Cada uno de estos bins se codifica utilizando un codificador aritmético binario.

Este proceso de codificación se basa en probabilidades, las cuales indican la frecuencia con la que un valor particular puede aparecer en una secuencia de datos. Si un valor tiene una mayor probabilidad de ocurrir, se asigna un intervalo más amplio dentro del rango. Por otro lado, los valores menos probables se asignan a intervalos más pequeños.

Codificación de un bin

La codificación de cada bin sigue un proceso similar al de la codificación aritmética general. Comienza con un rango inicial, que es un valor entre el mínimo y el máximo posible, y luego se subdivide el rango en dos partes, en función de las probabilidades de los valores de los bins. Si el valor de un bin es 0, se elige la subdivisión inferior, mientras que si es 1, se elige la subdivisión superior. Este proceso se repite para cada bin de la secuencia.

El resultado de esta codificación es una secuencia cada vez más estrecha de rangos, que se va reduciendo conforme se van codificando más bins. La secuencia final representará completamente la secuencia de bins codificados. La estrechez del rango es proporcional a la probabilidad de que los bins sean menos probables. Es decir, un bin menos probable dará lugar a un rango más estrecho.

Decodificación de un bin

En el proceso de decodificación de BAC, el decodificador utiliza la fracción binaria enviada por el codificador para identificar el rango final. La secuencia de bins es decodificada mediante la iteración de los pasos similares a los de codificación, pero en sentido inverso. El decodificador parte de un rango inicial y, basándose en las probabilidades asociadas con cada bin, determina la subdivisión en la que se encuentra la fracción.

Por ejemplo, si el valor de un bin es 0, el decodificador seleccionará la subdivisión inferior del rango; si es 1, elegirá la subdivisión superior. Este proceso se repite hasta que se haya decodificado toda la secuencia de bins.

Ejemplo práctico de codificación y decodificación

Consideremos tres bins, b0, b1 y b2, con sus probabilidades correspondientes. La codificación de estos bins sigue el proceso mencionado. Si comenzamos con un rango de (0, 1), se realiza la siguiente codificación:

  1. Codificación de b0: El rango inicial (0, 1) se divide en dos subintervalos, uno correspondiente a P(0) = 0.3 y otro a P(1) = 0.7. Si el valor de b0 es 1 (el más probable), seleccionamos el subintervalo superior (0.3, 1).

  2. Codificación de b1: El rango (0.3, 1) se divide en dos subintervalos, correspondientes a P(0) = 0.1 y P(1) = 0.9. Si b1 es 0 (el menos probable), seleccionamos el subintervalo inferior (0.3, 0.37).

  3. Codificación de b2: El rango (0.3, 0.37) se divide en dos subintervalos iguales (P(0) = P(1) = 0.5). Si b2 es 1, seleccionamos el subintervalo superior (0.335, 0.37).

El proceso de decodificación sigue un camino similar. A medida que el decodificador recibe la fracción binaria correspondiente, puede empezar a decodificar y emitir los valores de los bins, ajustando el rango según las probabilidades de cada bin.

Este proceso de codificación y decodificación se realiza de manera eficiente gracias a que se utiliza un rango cada vez más estrecho para representar las secuencias de datos.

Consideraciones adicionales

Es importante entender que la codificación aritmética binaria es extremadamente eficiente en términos de espacio, ya que utiliza un rango dinámico para representar los datos en función de sus probabilidades. Sin embargo, para una implementación práctica, es crucial gestionar adecuadamente los rangos y las fracciones, ya que un manejo incorrecto de estos puede llevar a errores de precisión. Además, el proceso de codificación y decodificación debe realizarse en tiempo real para que funcione correctamente en aplicaciones de compresión de datos en vivo, como la transmisión de video o audio.

En el contexto de la codificación aritmética, la eficiencia depende en gran medida de las estimaciones precisas de las probabilidades. Si las probabilidades no se calculan correctamente, el rendimiento de la codificación puede disminuir considerablemente. También es relevante destacar que, aunque este proceso es más eficiente que otras formas de codificación, como la codificación Huffman, requiere una mayor capacidad de procesamiento debido a la complejidad de las operaciones involucradas en la manipulación de los rangos y las fracciones binarias.