La compensación de movimiento en informática es una técnica algorítmica utilizada para predecir un fotograma en un vídeo teniendo en cuenta los fotogramas anteriores y/o futuros teniendo en cuenta el movimiento de la cámara y/o los objetos en el vídeo. Se emplea en la codificación de datos de vídeo para compresión de vídeo , por ejemplo en la generación de archivos MPEG-2 . La compensación de movimiento describe una imagen en términos de la transformación de una imagen de referencia en la imagen actual. La imagen de referencia puede ser anterior en el tiempo o incluso del futuro. Cuando las imágenes se pueden sintetizar con precisión a partir de imágenes previamente transmitidas/almacenadas, se puede mejorar la eficiencia de la compresión.
La compensación de movimiento es una de las dos técnicas clave de compresión de vídeo utilizadas en los estándares de codificación de vídeo , junto con la transformada de coseno discreta (DCT). La mayoría de los estándares de codificación de vídeo, como los formatos H.26x y MPEG , suelen utilizar codificación híbrida DCT con compensación de movimiento, [1] [2] conocida como compensación de movimiento en bloque (BMC) o DCT con compensación de movimiento (MC DCT).
La compensación de movimiento aprovecha el hecho de que, a menudo, para muchos fotogramas de una película, la única diferencia entre un fotograma y otro es el resultado del movimiento de la cámara o del movimiento de un objeto en el fotograma. En referencia a un archivo de vídeo, esto significa que gran parte de la información que representa un fotograma será la misma que la información utilizada en el siguiente fotograma.
Al utilizar la compensación de movimiento, una transmisión de vídeo contendrá algunos fotogramas completos (de referencia); entonces la única información almacenada para los fotogramas intermedios sería la información necesaria para transformar el fotograma anterior en el siguiente.
La siguiente es una explicación ilustrada simplista de cómo funciona la compensación de movimiento. Se capturaron dos fotogramas sucesivos de la película Elephants Dream . Como se puede ver en las imágenes, la diferencia inferior (con compensación de movimiento) entre dos cuadros contiene significativamente menos detalles que las imágenes anteriores y, por lo tanto, se comprime mucho mejor que el resto. Por tanto, la información necesaria para codificar el cuadro compensado será mucho menor que con el cuadro diferenciado. Esto también significa que también es posible codificar la información usando imágenes diferentes a un costo de menor eficiencia de compresión pero ahorrando complejidad de codificación sin codificación compensada por movimiento; De hecho, la codificación con compensación de movimiento (junto con la estimación de movimiento y la compensación de movimiento) ocupa más del 90% de la complejidad de la codificación.
En MPEG , las imágenes se predicen a partir de fotogramas anteriores ( fotogramas P ) o bidireccionalmente a partir de fotogramas anteriores y futuros ( fotogramas B ). Los fotogramas B son más complejos porque la secuencia de imágenes debe transmitirse y almacenarse desordenadamente para que el fotograma futuro esté disponible para generar los fotogramas B. [3]
Después de predecir fotogramas mediante compensación de movimiento, el codificador encuentra el residual, que luego se comprime y transmite.
En la compensación de movimiento global , el modelo de movimiento básicamente refleja movimientos de la cámara como:
Funciona mejor para escenas fijas sin objetos en movimiento.
Hay varias ventajas de la compensación de movimiento global:
MPEG-4 ASP admite la compensación de movimiento global con tres puntos de referencia, aunque algunas implementaciones solo pueden utilizar uno. Un único punto de referencia sólo permite el movimiento de traslación, lo que por su costo de rendimiento relativamente alto proporciona poca ventaja sobre la compensación de movimiento basada en bloques.
Los objetos en movimiento dentro de un cuadro no están suficientemente representados por la compensación de movimiento global. Por tanto, también es necesaria la estimación del movimiento local .
La compensación de movimiento en bloque (BMC), también conocida como transformada de coseno discreta con compensación de movimiento (MC DCT), es la técnica de compensación de movimiento más utilizada. [2] En BMC, los fotogramas se dividen en bloques de píxeles (por ejemplo, macrobloques de 16×16 píxeles en MPEG ). Cada bloque se predice a partir de un bloque de igual tamaño en el marco de referencia. Los bloques no se transforman de ninguna manera, excepto que se desplazan a la posición del bloque previsto. Este cambio está representado por un vector de movimiento .
Para explotar la redundancia entre vectores de bloques vecinos (por ejemplo, para un único objeto en movimiento cubierto por múltiples bloques) es común codificar sólo la diferencia entre el vector de movimiento actual y anterior en el flujo de bits. El resultado de este proceso diferenciador es matemáticamente equivalente a una compensación global del movimiento capaz de realizar una panorámica. Más adelante en el proceso de codificación, un codificador de entropía aprovechará la distribución estadística resultante de los vectores de movimiento alrededor del vector cero para reducir el tamaño de salida.
Es posible desplazar un bloque en un número no entero de píxeles, lo que se denomina precisión de subpíxeles . Los píxeles intermedios se generan interpolando píxeles vecinos. Comúnmente se utiliza la precisión de medio píxel o un cuarto de píxel ( Qpel , utilizada por H.264 y MPEG-4/ASP). El gasto computacional de la precisión de subpíxeles es mucho mayor debido al procesamiento adicional requerido para la interpolación y, en el lado del codificador, a una cantidad mucho mayor de bloques fuente potenciales para evaluar.
La principal desventaja de la compensación del movimiento del bloque es que introduce discontinuidades en los bordes del bloque (artefactos de bloqueo). Estos artefactos aparecen en forma de bordes horizontales y verticales nítidos que el ojo humano detecta fácilmente y producen bordes falsos y efectos de timbre (coeficientes grandes en subbandas de alta frecuencia) debido a la cuantificación de los coeficientes de la transformada relacionada de Fourier utilizada para codificación por transformación de los fotogramas residuales [4]
La compensación de movimiento de bloques divide el cuadro actual en bloques que no se superponen, y el vector de compensación de movimiento indica de dónde provienen esos bloques ( un error común es que el cuadro anterior se divide en bloques que no se superponen, y los vectores de compensación de movimiento indican dónde esos bloques se mueven a ). Los bloques fuente normalmente se superponen en el marco fuente. Algunos algoritmos de compresión de vídeo ensamblan el fotograma actual a partir de fragmentos de varios fotogramas diferentes transmitidos previamente.
Los fotogramas también se pueden predecir a partir de fotogramas futuros. Los fotogramas futuros deben codificarse antes que los fotogramas predichos y, por tanto, el orden de codificación no coincide necesariamente con el orden de los fotogramas reales. Tales tramas normalmente se predicen desde dos direcciones, es decir, a partir de las tramas I o P que preceden o siguen inmediatamente a la trama predicha. Estos fotogramas predichos bidireccionalmente se denominan fotogramas B. Un esquema de codificación podría ser, por ejemplo, IBBPBBPBBPBB.
Además, también se ha propuesto el uso de baldosas triangulares para compensar el movimiento. Según este esquema, el marco está repleto de triángulos y el siguiente marco se genera realizando una transformación afín en estos triángulos. [5] Sólo se registran/transmiten las transformaciones afines. Esto es capaz de manejar el zoom, la rotación, la traducción, etc.
La compensación de movimiento de tamaño de bloque variable (VBSMC) es el uso de BMC con la capacidad del codificador de seleccionar dinámicamente el tamaño de los bloques. Al codificar vídeo, el uso de bloques más grandes puede reducir la cantidad de bits necesarios para representar los vectores de movimiento, mientras que el uso de bloques más pequeños puede dar como resultado una menor cantidad de información residual de predicción para codificar. Otras áreas de trabajo han examinado el uso de métricas de características de forma variable, más allá de los límites de los bloques, a partir de las cuales se pueden calcular los vectores entre cuadros. [6] Los diseños más antiguos, como el vídeo H.261 y MPEG-1, suelen utilizar un tamaño de bloque fijo, mientras que los más nuevos, como H.263 , MPEG-4 Part 2 , H.264/MPEG-4 AVC y VC-1. brinde al codificador la capacidad de elegir dinámicamente qué tamaño de bloque se utilizará para representar el movimiento.
La compensación de movimiento de bloques superpuestos (OBMC) es una buena solución a estos problemas porque no solo aumenta la precisión de la predicción sino que también evita artefactos de bloqueo. Cuando se utiliza OBMC, los bloques suelen ser dos veces más grandes en cada dimensión y se superponen en cuadrantes con los 8 bloques vecinos. Por tanto, cada píxel pertenece a 4 bloques. En dicho esquema, hay 4 predicciones para cada píxel que se suman a una media ponderada. Para ello, los bloques se asocian a una función de ventana que tiene la propiedad de que la suma de 4 ventanas superpuestas es igual a 1 en todas partes.
Los estudios de métodos para reducir la complejidad de OBMC han demostrado que la contribución a la función de ventana es menor para el bloque diagonalmente adyacente. Reducir el peso de esta contribución a cero y aumentar los otros pesos en una cantidad igual conduce a una reducción sustancial de la complejidad sin una gran penalización en la calidad. En tal esquema, cada píxel pertenece a 3 bloques en lugar de 4, y en lugar de utilizar 8 bloques vecinos, sólo se utilizan 4 para cada bloque a compensar. Un esquema de este tipo se encuentra en el modo de predicción avanzada del anexo F de H.263.
En la compensación de movimiento, un cuarto o la mitad de las muestras son en realidad submuestras interpoladas causadas por vectores de movimiento fraccionarios. En función de los vectores y las muestras completas, las submuestras se pueden calcular mediante filtrado 2D bicúbico o bilineal. Ver subcláusula 8.4.2.2 "Proceso de interpolación de muestra fraccionada" del estándar H.264.
La compensación de movimiento se utiliza en la codificación de vídeo estereoscópico .
En el vídeo, el tiempo suele considerarse la tercera dimensión. Aún así, las técnicas de codificación de imágenes se pueden ampliar a una dimensión adicional.
JPEG 2000 utiliza wavelets, que también se pueden utilizar para codificar el movimiento sin espacios entre bloques de forma adaptativa. Las transformaciones afines de píxeles fraccionarios provocan sangrado entre píxeles adyacentes. Si no se utiliza una resolución interna más alta, las imágenes delta luchan en su mayoría contra la imagen borrosa. La imagen delta también se puede codificar como wavelets, de modo que coincidan los bordes de los bloques adaptativos.
Las técnicas de codificación 2D+Delta utilizan codificación compatible con H.264 y MPEG-2 y pueden utilizar compensación de movimiento para comprimir entre imágenes estereoscópicas.
Un precursor del concepto de compensación de movimiento se remonta a 1929, cuando RD Kell en Gran Bretaña propuso el concepto de transmitir sólo las partes de una escena de vídeo analógico que cambiaban de cuadro a cuadro. En 1959, el concepto de compensación de movimiento entre cuadros fue propuesto por los investigadores de la NHK Y. Taki, M. Hatori y S. Tanaka, quienes propusieron una codificación de video predictiva entre cuadros en la dimensión temporal . [7]
La compresión práctica de vídeo con compensación de movimiento surgió con el desarrollo de la codificación DCT con compensación de movimiento (MC DCT), [8] también llamada compensación de movimiento en bloque (BMC) o compensación de movimiento DCT. Se trata de un algoritmo de codificación híbrido [7] que combina dos técnicas clave de compresión de datos : codificación por transformada de coseno discreta (DCT) [8] en la dimensión espacial y compensación predictiva de movimiento en la dimensión temporal . [7] La codificación DCT es una técnica de codificación por transformación de compresión de bloques con pérdida que fue propuesta por primera vez por Nasir Ahmed , quien inicialmente la pensó para la compresión de imágenes , en 1972. [9]
En 1974, Ali Habibi de la Universidad del Sur de California introdujo la codificación híbrida, [10] [11] que combina la codificación predictiva con la codificación transformada. [7] [12] Sin embargo, su algoritmo se limitó inicialmente a la codificación intra-cuadro en la dimensión espacial. En 1975, John A. Roese y Guner S. Robinson ampliaron el algoritmo de codificación híbrida de Habibi a la dimensión temporal, utilizando codificación de transformación en la dimensión espacial y codificación predictiva en la dimensión temporal, desarrollando una codificación híbrida con compensación de movimiento entre cuadros . [7] [13] Para la codificación de transformada espacial, experimentaron con la DCT y la transformada rápida de Fourier (FFT), desarrollando codificadores híbridos entre cuadros para ambas, y descubrieron que la DCT es la más eficiente debido a su complejidad reducida. capaz de comprimir datos de imagen hasta 0,25 bits por píxel para una escena de videoteléfono con una calidad de imagen comparable a la de un codificador intracuadro que requiere 2 bits por píxel. [14] [13]
En 1977, Wen-Hsiung Chen desarrolló un algoritmo DCT rápido con CH Smith y SC Fralick. [15] En 1979, Anil K. Jain y Jaswant R. Jain desarrollaron aún más la compresión de vídeo DCT con compensación de movimiento, [16] [7] también llamada compensación de movimiento en bloque. [7] Esto llevó a Chen a desarrollar un algoritmo práctico de compresión de video, llamado DCT con compensación de movimiento o codificación de escena adaptativa, en 1981. [7] La DCT con compensación de movimiento se convirtió más tarde en la técnica de codificación estándar para la compresión de video desde finales de la década de 1980 en adelante. [17] [2]
El primer estándar de codificación de vídeo digital fue H.120 , desarrollado por el CCITT (ahora ITU-T) en 1984. [18] H.120 utilizó codificación DPCM con compensación de movimiento, [7] que era ineficiente para la codificación de vídeo, [17] Por lo tanto, H.120 no era práctico debido al bajo rendimiento. [18] El estándar H.261 se desarrolló en 1988 basándose en la compresión DCT con compensación de movimiento, [17] [2] y fue el primer estándar práctico de codificación de vídeo. [18] Desde entonces, la compresión DCT con compensación de movimiento ha sido adoptada por todos los principales estándares de codificación de vídeo (incluidos los formatos H.26x y MPEG ) que siguieron. [17] [2]