Este documento describe tres tipos de técnicas de compresión: reducción de la precisión de valores individuales, codificación de valores individuales reduciendo el número de bits, y transformación de datos a otra representación más comprimible. También describe varios métodos específicos como códigos de desplazamiento, códigos de Huffman, codificación aritmética, run-length encoding, LZW, diferenciación, fractales y transformaciones matemáticas como DCT.
Técnicas de compresión de datos: reducción de bits, codificación y transformación
1.
2.
3. Podríamos diferenciar tres tipos de técnicas de compresión :
Reducción de la precisión de los valores individuales
Codificación de los valores individuales reduciendo el número de
bits
Transformación de los datos en otra representación que sea
más hábil de ser reducida
Muchos formatos combinan dos o las tres formas de
comprimir.
4. REDUCCIÓN DE BITS
Comentamos algunos esquemas de codificación en esta línea:
Códigos de desplazamiento (shift codes)
Si sólo un pequeño subconjunto consecutivo de valores aparece la
mayor parte de las veces, entonces se puede elegir un código con
longitud (bits) suficiente sólo para representar este subconjunto,
de modo que los pocos valores que no estén en él se indican con
un código especial de overflow que señala los valores
representados con más longitud. Al indicar la mayoría de los
valores con un número reducido de bits, se pueden conseguir
reducciones significativas de tamaño, entre 2:1 y 3:1 usualmente,
aunque siempre dependiendo del gráfico.
Para ello se desprecian algunos de los bits, dependiendo del rango
de valores.
La NASA, por ejemplo, usa códigos de desplazamiento para
transmitir la imagen de satélites.
5. Códigos de Huffman
Los códigos de Huffman (su inventor) asignan un código de
longitud variable a cada posible dato, de modo que los valores
que ocurren más a menudo tienen códigos de menor longitud y
viceversa. Dada la probabilidad de que un valor dado ocurra, el
algoritmo de Huffman puede crear automáticamente un
asignación de códigos.
6. Códigos de Huffman
El concepto es sencillo de expresar gráficamente: ordenados los valores de
mayor a menor probabilidad, se le asignarán códigos binarios: a los
símbolos más frecuentes (ej. 35 %, 27, ...) se le asignan pocos bits (11, 10)
y a los menos frecuentes (ej. Del 11% o 10%) mas bits (0001, 0000)
7. Codificación aritmética
Tiene el mismo fundamento que el de Huffman (asociar un código
en función de la probabilidad de cada valor), pero en este caso se
funciona asociando códigos a grupos de valores (por ejemplo, si el
valor 7 y el valor 23 tienen mucha probabilidad, este esquema
asociará probablemente un código a la subserie 7 23, otro a la 7
7, otro a la 23 23... o incluso a subseries más largas,
dependiendo de la probabilidad.
Es algo más complejo de implementar que el código de Huffman,
pero produce entre un 5 y un 10% más compresión.
8. TRANSFORMACIÓN
Es una técnica que permite evitar o minimizar la pérdida.
Básicamente, hay que buscar patrones que se repitan en los
datos. Si no existen (datos totalmente aleatorios), no puede
existir compresión sin pérdida. De hecho, aplicar un esquema de
compresión a datos totalmente aleatorios puede con facilidad
incrementar el tamaño de los ficheros.
9. Run-Length Encoding
La codificación RLE (Run-Length Encoding) busca la repetición de
valores idénticos en una lista, y la reemplaza por un único valor
precedido por el número de veces que se repite. Por ejemplo, la
secuencia:
5 5 14 14 14 14 14 8 8 8 8 7 5 5 5 3 2 2 (18 bytes)
se podría codificar usando la siguiente:
2 5 5 14 4 8 1 7 3 5 1 3 2 2 (14 bytes)
Algunos formatos que usan este esquema son:
Postscript, Tiff, PCX, Targa ....
10. Codificación LZW
El algoritmo LZW considera la posibilidad de que una secuencia de
valores (no necesariamente iguales) se repita, aún no
consecutivamente, en la secuencia de datos. Por ejemplo, la
secuencia
4 12 10 2 8 4 12 10 9 8 4 12 10 9 8 4
se podría representar como
a 2 8 a b a b 4 (siendo a = 4 12 10, b = 9 8)
11. Diferenciación (differencing)
Este esquema de compresión se basa en el hecho de que en
ficheros gráficos realistas es común que muchos datos sucesivos
tengan diferencias pequeñas (por ejemplo, verdes de gamas muy
similares con pequeñas variaciones de brillo). En ese caso, en vez
de representar cada dato por completo, partiendo de uno inicial
los demás se pueden expresar como diferencias con respecto a
él, o al inmediato anterior, utilizando muchos menos bits para
ello. Por ejemplo, la serie:
35 37 38 33 36 35 35
se puede representar con la otra:
35 -2 -1 5 -3 1 0
12. Diferenciación (differencing)
La compresión de este tipo de algoritmos depende mucho de los
datos aunque todos los gráficos habituales, tanto fotorealistas
como no, suelen tener bastantes series reconocibles de valores
cercanos. Reducciones de 1,5:1 a 3:1 pueden alcanzarse con
facilidad.
Existen algoritmos de diferenciación de 2 dimensiones que se
basan en comparaciones de cada línea horizontal del gráfico con
la siguiente, buscando similitudes que es habitual que existan. Es
el caso de los formatos JPEG o MPEG sin pérdida.
13. Fractales
La compresión fractal se basa en encontrar grupos de datos
determinados que con transformaciones fractales sucesivas se
conviertan en una serie de datos similar a la original; con esto,
simplemente almacenando el grupo y las transformaciones se
representa de forma codificada a una serie completa (que puede
ser larga).
Esta compresión suele requerir bastante tiempo de CPU, pero
alcanza relaciones de compresión altas (entre 50:1 y 100:1,
aunque se han encontrado ejemplos de hasta 1000:1).
Los algoritmos han sido desarrollados y registrados por Michal
Barnsley, de Iterated Systems.
14. Esquemas de transformaciones matemáticas
Existen muchas operaciones matemáticas que transforman un
conjunto de valores a otro y después pueden ser aplicadas a la
inversa para reconstruir el conjunto original. Algunas de ellas son
especialmente útiles para su aplicación a algoritmos de
compresión, por ejemplo:
◦ · Discrete Fourier Transform (DFT)
◦ · Discrete Cosine Transform (DCT)
◦ · Hadamard-Haar Transforms (HHT)
◦ · Karhunen-Loeve Transforms (KLT)
◦ · Slant-Haar Transforms (SHT)
◦ · Walsh-Hadamard Transforms (WHT)
Con mucho, la función más utilizada es la DCT, que por ejemplo
se usa en versiones de JPEG y MPEG. Para ello se reemplazan
bloques de intensidad de color de 8x8 píxels por una serie de
valores parametrizando una función cosenoidal.