En el artículo pasado hablamos de una manera sencilla de comprimir imágenes en tonos de gris. Desde luego que esta idea es limitada y finalmente no funciona de forma muy adecuada para las imágenes en color. Pero antes de discutir el caso de las imágenes en color, debemos considerar otras alternativas que pueden usarse para comprimir imágenes en tonos de gris. Uno de los algoritmos más usados es el llamado RLE (Rule Length Encoding). La idea funciona así: sabemos que una imagen en tonos de gris contiene una serie de números que se repiten, en particular tripletas de pixeles (en sus componentes R, G y B), los cuales son el mismo color. Si tenemos regiones en donde se repiten estos valores R, G y B, bien podríamos pensar en sustituirlos por el byte que hemos leído y un contador que nos indique cuantas veces se repite el mismo. Esto es básicamente el RLE.
Supongamos que tenemos una imagen de puntos al azar, de todos los posibles tonos de gris. Si son al azar, probablemente no tengamos secuencias largas de un solo tono de gris, por lo que por ejemplo, si la imagen original contiene los siguientes bytes (en hexadecimal):
de de de de de de de de 98 98 98 98 98 98 ff ff 01
podríamos crear un nuevo archivo que tuviese los siguiente valores:
de 08 98 06 ff 02 01 01
Lo cual nos diría que tendríamos 08 bytes con el valor de, 06 bytes con el valor 98, 2 bytes con el valor ff y finalmente un byte con el valor 01.
Cabe señalar que el esquema RLE bien podría usarse para comprimir no solamente imágenes, sino cualquier archivo, aunque muchos no son muy susceptibles de sacar ventaja de la repetición de símbolos. Por ejemplo, sería mala idea usar RLE para comprimir textos, pues estos no tienen repeticiones de letras contíguas. Por ende, no es el mejor de los esquemas para archivos de esa naturaleza.
Los algoritmos básicos de codificación y decodificación son los siguientes
CODIFICACIÓN RLE:
DECODIFICACIÓN:
Nótese que este par de rutinas funcionan con todo el archivo que se desea procesar, lo cual no necesariamente es la mejor idea. Lo más sensato es usar el “canvas” (en donde reside la imagen en un eventual software de procesamiento de imágenes) y aplicar RLE a los pixeles. De hecho, si se procesa, como en este caso, un archivo completo, estamos intentando también comprimir el encabezado que muchos formatos gráficos tienen, incluso los archivos BMP. De nuevo, se advierte que esto es simplemente una idea y el artículo muestra una primera implementación general para ilustrar lo que hay que hacer.
En pruebas hechas con estos algoritmos se halló que una imagen en tonos de grises (que contenía simplemente un bloque en un solo tono de gris), que ocupaba originalmente 212 Kbytes, se redujo a 3Kbytes. Para saber el factor de compresión, dividimos (3K / 212K) * 100, lo cual entrega 1.415, es decir, el archivo comprimido ocupa menos del 2% del archivo original. Desde luego, las imágenes cotidianas no son tan buenas para la compresión. Sin embargo, en casos como en el del ejemplo, es espectacular la compresión de las imágenes.
Si por ejemplo, usásemos este algoritmo para procesar una imagen en tonos de gris que están al azar en una imagen, pudiese no tener ni remotamente los resultados mencionados. Utilizando la siguiente imagen
hallamos que la compresión llego a 141 KBytes, cuando la imagen original fue de 212 KB. Es decir, 66.50 % de compresión sobre la imagen original.