| Artículos | 01 NOV 2000

Compresión con pérdidas: JPEG

Tags: Histórico
Nobu Yamazaki.
Comenzamos con este artículo una serie dedicada a la compresión con pérdidas (lossy compression) con el formato gráfico por excelencia: el JPEG.

Cuando hablamos de compresión de datos, podemos diferenciar dos grupos principales. Por un lado está la compresión sin pérdidas, y por el otro la compresión con pérdidas. Con la compresión sin pérdidas lo que se pretende es obtener los datos originales después de un ciclo de compresión - descompresión. No pasa lo mismo con la compresión con pérdidas, en la cual estamos dispuestos a “sacrificar” unos datos para obtener a cambio un mayor ratio de compresión. En la mayoría de las ocasiones, esto es posible aprovechando las limitaciones físicas del ojo humano para quitar esos detalles que apenas podemos percibir de una fotografía, y de esa forma eliminar información secundaria.
Uno de los formatos gráficos más utilizados actualmente es sin lugar a dudas el JPEG, pero antes de entrar en detalles quizá sería conveniente hacer un breve repaso de nociones básicas para comprender mejor el funcionamiento de este sistema de compresión.
Como curiosidad, es preciso comentar que JPEG es el acrónimo de Joint Photographic Experts Group (Grupo Conjunto de Expertos en Fotografía) y que JFIF lo es de JPEG File Interchange Format (Formato de Intercambio de Archivos JPEG). Los ficheros que generalmente asociamos a JPEG (con la extensión .JPG o .JPEG) son en realidad ficheros JFIF. De hecho, si editamos un fichero JPEG con un editor de texto, podremos ver que a partir del séptimo carácter aparece “JFIF”. Los ficheros tipo TIFF también usan una compresión JPEG. En este apartado nos ocuparemos de los ficheros JFIF en general. Los ficheros JPEG son simplemente un tipo de ficheros JFIF.

Espacio de color
Cuando miramos un píxel (el punto de menor tamaño que puede representar un monitor), en realidad lo que estamos viendo es la mezcla de las intensidades de tres colores diferentes: el Rojo (Red), el Verde (Green) y el Azul (Blue). Estos tres parámetros (RGB) definen un sistema de coordenadas tridimensional en el cual es posible situar cualquier color. Con este mismo sistema funcionan las tarjetas de vídeo que incorporan todos los PC, aunque como veremos más adelante, éste no es el único sistema válido para definir un color.
Con el eje de sistemas RGB visto anteriormente, no es difícil imaginar dónde se encontrarían los colores grises; en la recta de puntos equidistantes a todos los ejes. Está claro que los tonos grises tienen la misma intensidad en cualquiera de sus componentes de color, empezando por los de mínima intensidad (negro) hasta los de mayor intensidad (blanco). Esta recta se llama Luminancia y se denomina Y. Los otros dos ejes necesarios para crear un nuevo sistema de referencia se toman restando las componentes Rojo (R) y Azul (B) a la luminancia. Estos dos nuevos ejes se denominan Crominancia Roja (Cr o V) y Crominancia Azul (Cb o U).
El nuevo sistema de coordenadas creado a partir de los vectores Y, U y V, es el utilizado en los ficheros con formato JPEG. Se utilizan las siguientes fórmulas matemáticas para pasar de las coordenadas RGB a las YUV, y viceversa:

Y = 0,299 R + 0,587 G + 0,114 B
U = -0,1687 R - 0,3313 G + 0,5 B + 128
V = 0,5 R - 0,4187 G - 0,0813 B + 128

R = Y + 1,402 (V-128)
G = Y - 0,34414 (U-128) - 0,71414 (V-128)
B = Y + 1,772 (U-128)

Existe un motivo para utilizar el espacio YUV. Por las características físicas del ojo humano, está comprobado que éste es mucho más sensible a la luminancia que a la crominancia. Tanto es así, que el primer paso para iniciar la compresión JPEG consiste en descartar el 75% de la información de la crominancia de la imagen. Con ello, hemos reducido la información a almacenar aproximadamente a la mitad, consiguiendo que el ojo humano apenas perciba ninguna diferencia respecto al original.
Si queremos almacenar la información de 10 píxeles, necesitaremos almacenar 10 x 3 (las 3 componentes RGB) = 30 elementos. Por el contrario, si queremos almacenarlo utilizando una compresión JPEG, pasaríamos las componentes RGB a YUV, y descartaríamos el 75% de las dos crominancias, con lo cual podríamos almacenar la información de esos 10 píxeles en 1 x 10 + 0.25 x 2 x 10 = 15 elementos, exactamente la mitad.

Unidades de datos & Mínimas Unidades Codificadas
Existen dos unidades de datos con las cuales trabajan tanto los compresores como los descompresores. La más básica consiste en un bloque de 8 x 8 píxeles. Cada unidad de datos representa la información de un componente de color de un píxel. Este componente puede ser luminancia (Y), crominancia azul (U) o crominancia roja (V).
Como se comentaba anteriormente, JPEG generalmente descarta el 75% de la información de las crominancias. La cabecera de un fichero JPEG contiene los valores de los muestreos horizontales y verticales de cada componente. El componente de la luminancia (Y) siempre se muestrea a la resolución máxima, es decir, que se almacena su valor completo para cada píxel. Generalmente, aunque no siempre, el factor de muestreo de los valores horizontal y vertical es 2, mientras que el valor de las componentes de crominancia es de 1. Eso quiere decir que en un bloque de 2 x 2 píxeles, tendríamos cuatro valores para Y y sólo uno para cada componente U y V.
El orden a la hora de almacenar dichos datos, consiste en guardar primero los valores de todas las muestras de la luminancia (Y), luego todos los valores de la crominancia azul (U) y finalmente los valores correspondientes a crominancia roja (V).

Transformada Discreta de Coseno (DCT)
Una de las características más importantes de la compresión JPEG es el hecho de que trabaja en el ámbito de las frecuencias, y no en el espacial. En el campo de la ingeniería suele ser habitual trabajar con frecuencias, sobre todo a la hora de hacer cálculos eléctricos o acústicos.
En JPEG, se aplica la Transformada Discreta de Coseno (FDCT) para filtrar los componentes de altas frecuencias, ya que tienen poco efecto visual en la imagen. ¿Por qué queremos (podemos) prescindir de las componentes de alta frecuencia? Veámoslo con un ejemplo. Tenemos una foto completamente negra, en la que (evidentemente) los píxeles negros predominan y son los que más se repiten, luego son muy frecuentes (son alta frecuencia). Además, tenemos unos pocos píxeles blancos, que representan las bajas frecuencias. Llegados a este punto, ¿cuáles podemos sacrificar para lograr una mayor compresión? Pues parece lógico pensar que tenemos que intentar mantener el mayor número de píxeles blancos, y que podemos permitirnos perder algunos píxeles negros, haciendo que éstos queden grises. Pues bien, para poder hacer esto, necesitamos aplicar matemática pura y dura, y efectuar una FDCT, para poder pasar los diferentes valores de un bloque al dominio de la frecuencia.
Si tenemos un bloque de 8 x 8 píxeles, tenemos un total de 64 valores representados por la función matemática f(x,y). Si realizamos la Transformada Discreta de Coseno obtenemos F(x,y), y si después realizamos la Transformada Inversa Discreta de Coseno, deberíamos volver a obtener los valores originales. Bueno, en realidad no son exactamente los mismos, ya que para hacer tanto la Transformada Directa como su inversa, es preciso operar con valores de coma flotante, que no pueden ser almacenados exactame

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información