ENTRADAS

3 ago 2018

LA CODIFICACIÓN DE IMÁGENES

//
Comentarios0
/

Lo que para nosotros es una imagen para un ordenador no es más que una matriz de píxeles. Si la imagen es en color cada pixel se representa como una lista de tres números comprendidos entre 0 y 255, que indica cuánto de cada uno de los tres colores fundamentales (rojo, verde y azul) contiene. Con las combinaciones de estos tres valores podemos formar más de 16 millones de colores diferentes (256^3), permitiendo de esta forma construir la imagen. A esta forma de representar una imagen se le llama RGB (Red, Green and Blue).

Una imagen de tamaño 1024 x 683 píxeles (valores típicos para fotogramas de películas, por ejemplo) tendrá por tanto 700 000 píxeles distintos. Si cada píxel se representa como 3 bytes (un byte por cada color), nos encontramos con el problema de que la imagen ocupará más de 2 Mbytes en nuestro disco duro. Por tanto, una película de 2 horas a 20 frames por segundo ocuparía ¡288 gigas!

Obviamente, el almacenamiento y procesado de imágenes no funciona de esta forma exactamente ya que nunca podríamos haber desarrollado tecnologías como el visionado de vídeos en streaming. En la práctica, cualquier archivo de datos multimedia que nos encontremos estará en algún formato comprimido.

¿Qué es la compresión?

La compresión de archivos permite almacenar una imagen en un formato especial tal que ocupe mucho menos tamaño. La idea para lograr esto es muy sencilla: en lugar de codificar todos los valores usando el mismo número de bits, usaremos una menor cantidad para representar los valores que aparecen más veces y más bits para aquellos menos frecuentes. Por ejemplo, supongamos que queremos codificar los siguientes números:

4,4,2,4,6,3,2,5

Dado que todos los valores son menores que 8, podemos codificarlos usando 3 bits para cada uno. De esta forma, usaremos la siguiente tabla:

9

Por lo tanto, los 8 valores serán codificados en 3 bits cada uno y la lista completa ocupará 24 bits. El resultado de la codificación será:  100100010100110011010101

Pero si observamos la lista de valores de nuevo, podemos comprobar que hay valores como el 0 o el 1 que ni siquiera aparecen, mientras que otros como el 4 son muy frecuentes. Podríamos usar la siguiente tabla para codificar los valores:

10

Si usamos esta codificación, la lista de números se convertirá en: 0010011011101011110

Lo que resulta en 19 bit para la lista que previamente ocupaba 24. Algunas de las combinaciones de 0 y 1 no se han usado (por ejemplo, no se ha usado el 1 para codificar ningún valor). Esto es necesario para saber dentro de la lista de bits cuándo acaba un valor y cuándo empieza el siguiente. De esta forma sabremos que el valor acaba bien cuando se encuentra un 0 o hay siete 1 seguidos:  0 0 10 0 110 1110 10 11110

A este tipo de codificación se le llama codificación Huffman. Una imagen como la siguiente (conocida como “cameraman”) ocupa 65.536 bytes sin comprimir. Si vemos su histograma, comprobamos que los distintos valores aparecen con frecuencias muy diferentes.

CODIFICACIÓN DE IMÁGENES

“Cameraman”, 65.536 bytes sin comprimir

CODIFICACIÓN DE IMÁGENES

Histograma de imagen

 

Por lo tanto, es candidata a poder reducir notablemente su tamaño con una codificación Huffman. Con ella, se puede comprimir a 57.712 bytes, lo cual supone un ahorro del 12%.

Por lo tanto, podemos concluir que una imagen en la que prácticamente todos sus píxeles sean iguales admitirá mucha más compresión que una con mucha pluralidad de valores.

Transformaciones para comprimir

Existen algunas transformaciones que ayudan notablemente a comprimir una imagen. Podemos entender una transformación como una operación matemática que convierte una imagen en otra distinta, de forma que dicha operación pueda revertirse.

Algunas transformadas como la transformada del coseno discreto (DCT) o una transformada wavelet discreta (DWT) convierten la mayoría de las imágenes en otra en la que prácticamente todos sus píxeles son negros. Por ejemplo, si aplicamos la DCT sobre la imagen “cameraman” obtenemos el siguiente resultado:

CODIFICACIÓN DE IMÁGENES

Compresión de imagen con pérdidas

Al tener casi todos los píxeles negros, esta imagen puede codificarse con muy pocos bits. El problema es que los valores obtenidos en esta imagen dejan de estar entre 0 y 255, pueden tomar cualquier valor incluidos números decimales y negativos. Estos valores deben cuantificarse antes de comprimirse, lo que produce cierto error provocando que la imagen descomprimida no sea exactamente la original. A esto se le llama “compresión con pérdidas”.

CODIFICACIÓN DE IMÁGENES CON PÉRDIDAS

Codificación y decodificación de imágenes

 

Si aplicamos esta técnica sobre la imagen de “cameraman” usando 256 niveles para cuantificar, podemos comprimirla usando solamente 19.131 bits. Esto es solo un 30% del tamaño sin comprimir. La imagen descomprimida es la siguiente:

CODIFICACIÓN DE IMÁGENES

Codificación de imagen con 256 niveles

No se aprecia una pérdida de calidad notable. Usando 100 niveles conseguimos comprimirla a 13.733 bytes aunque se aprecia cierto deterioro.

CODIFICACIÓN DE IMÁGENES

Codificación de imagen con 100 niveles

Por tanto, es necesario buscar hasta qué punto nos interesa comprimir perdiendo calidad de la imagen.

¿Y con vídeo?

En vídeo se puede aplicar una técnica que también permite reducir mucho el tamaño del archivo. Si miramos dos fotogramas seguidos de una película, lo normal es que apenas haya diferencias entre ambas salvo algunos elementos que se han desplazado de lugar. Por ejemplo, si en la imagen aparece un hombre hablando habrá diferencias entre la posición de algunas partes de la boca, pero el resto del cuerpo o el fondo será muy similar. Por lo tanto, si hacemos la resta de un fotograma y el anterior, obtendremos una imagen completamente negra con algunos valores de calor (correspondiente a los lugares donde estaba la boca). Nuevamente, esta imagen, puede comprimirse por tener un valor muy frecuente. De esta forma, en lugar de codificar cada fotograma lo haremos con la diferencia de entre dos frames consecutivos.

 

AUTOR: RODRIGO SERNA PÉREZ

Más entradas del mismo autor en en blog de FdeT

Si quieres participar en el blog como colaborador en alguna de las secciones o realizar alguna pregunta para que un especialista te responda, envíanos un email a info@fdet.es

Grupo FdeT

Leave a Reply

A %d blogueros les gusta esto: