You are on page 1of 8

MÉTODOS DE CODIFICACIÓN DE ENTROPÍA

Thalía C. Cumbal Piure


tccumbalp@unl.edu.ec

Normalmente, la compresión general de datos no tiene en cuenta el tipo de


datos que se está comprimiendo y no tiene pérdidas. Puede aplicarse a
archivos de datos de computadora, documentos, imágenes, etc. Las dos
técnicas principales son la codificación estadística y la supresión de secuencias
repetitivas

Codificación Huffman

La codificación Huffman utiliza un código de longitud variable para cada uno de


los elementos dentro de la información. Esto normalmente implica analizar la
información para determinar la probabilidad de elementos dentro de la
información. Los elementos más probables están codificados con unos pocos
bits y los menos probables codificados con un mayor número de bits. El
ejemplo siguiente se refiere a caracteres. En primer lugar, se escanea la
información textual para determinar el número de ocurrencias de una letra
dada. Por ejemplo:

A continuación los caracteres se ordenan en orden de su número de


ocurrencias, tales como

A continuación, se asigna a los dos caracteres menos probables un 0 o un 1.


La figura 1 muestra que al menos probable ('c') se le ha asignado un 0 y al
siguiente menos probable ('b') se le ha asignado un 1.La suma de los dos
sucesos se lleva a la siguiente columna y los valores de ocurrencia se disponen
de nuevo en orden descendente (es decir, 57, 51, 33, 20 y 15). Al igual que
ocurre con la primera columna, se asigna un 0 a la ocurrencia menos probable
y se le asigna un 1 a la siguiente ocurrencia menos probable. Esto continúa
hasta la última columna. Los valores Huffman coded se leen de izquierda a
derecha y los bits se enumeran de derecha a izquierda
Figura 1. Ejemplo de codificación Huffman.

La codificación final será:

‘e’ 11
‘i’ 10
‘o’ 00
‘p’ 011
‘b’ 0101
‘c’ 0100

La gran ventaja de la codificación Huffman es que, aunque cada carácter está


codificado con un número diferente de bits, el receptor determinará
automáticamente el carácter independientemente de su orden. Por ejemplo, si
un 1 es seguido por un 1 entonces el carácter recibido es un 'e'. Si luego es
seguido por dos 0s entonces es un 'o'. Aquí hay un ejemplo:

11000110100100110100

Será decodificado como:

Al transmitir o almacenar datos Huffman codificados, la tabla de codificación


necesita ser almacenada con los datos (si la tabla se genera dinámicamente).
Generalmente es una buena técnica de compresión, pero no tiene en cuenta
asociaciones de orden superior entre caracteres. Por ejemplo, el carácter "q" es
seguido normalmente por el carácter "u" (aparte de palabras como Irak). Un
esquema de codificación eficiente para el texto sería codificar un solo carácter
'q' con una secuencia de bits más larga que una secuencia 'qu'

Codificación Lempel-Ziv-Welsh
El algoritmo Lempel-Ziv-Welsh (LZW) (también conocido como LZ-78)
construye un diccionario de grupos de caracteres de uso frecuente (o valores
binarios de 8 bits). Antes de decodificar el archivo, el diccionario de compresión
debe enviarse (si se están transmitiendo datos) o almacenado (si se están
almacenando datos). Este método es bueno para comprimir archivos de texto
porque los archivos de texto contienen caracteres ASCII (que se almacenan
como valores binarios de 8 bits), pero no tan buenos para los archivos gráficos,
que pueden tener patrones de repetición de dígitos binarios que podrían no ser
múltiplos de 8 bits. Un ejemplo sencillo es utilizar un alfabeto de 6 caracteres y
un diccionario de 16 entradas, por lo que la palabra de código resultante tendrá
4 bits. Si el mensaje transmitido es:

ababacdcdaaaaaaef
A continuación, el transmisor y el receptor inicialmente agregaría lo siguiente a
su diccionario:

0000 ‘a’
0001 ‘b’
0010 ‘c’
0011 ‘d’
0100 ‘e’
0101 ‘f’
0110–1111 espacio

Primero se envía el carácter 'a' con 0000, después se envía el carácter 'b' y el
transmisor comprueba que la secuencia 'ab' se ha almacenado en el
diccionario. Como no lo ha hecho, agrega 'ab' al diccionario, para dar:

0000 ‘a’
0001 ‘b’
0010 ‘c’
0011 ‘d’
0100 ‘e’
0101 ‘f’
0110 ‘ab’
0111–1111 espacio

El receptor también agregará esto a su tabla (así el transmisor y el receptor


siempre tendrán las mismas tablas). A continuación, el transmisor lee el
carácter 'a' y comprueba si la secuencia 'ba' está en la tabla de códigos. Como
no lo es, transmite el carácter 'a' como 0000, agrega la secuencia 'ba' al
diccionario, que ahora contendrá:
0000 ‘a’
0001 ‘b’
0010 ‘c’
0011 ‘d’
0100 ‘e’
0101 ‘f’
0110 ‘ab’
0111 ‘ba’
1000–1111 espacio

A continuación, el transmisor lee el carácter 'b' y comprueba si la secuencia 'ba'


está en la tabla. Tal como es, transmitirá la dirección de la tabla de códigos que
Lo identifica, es decir, 0111. Cuando se recibe, el receptor detecta que está en
su diccionario y sabe que la secuencia dirigida es 'ba'.
A continuación, el transmisor lee un 'c' y comprueba el carácter en su
diccionario. Como se incluye, transmite su dirección, es decir, 0010. Cuando se
recibe, el receptor comprueba su diccionario y localiza el carácter 'c'. Esto
continúa con el transmisor y el receptor manteniendo copias idénticas de sus
diccionarios. Una gran cantidad de compresión se produce al enviar una
secuencia de un carácter, como una larga secuencia de 'a'.
Típicamente, en una implementación práctica de LZW, el tamaño de diccionario
para LZW comienza en 4K (4096). El diccionario almacena entonces los bytes
de 0 a 255 y las direcciones 256 a 4095 se utilizan para cadenas (que pueden
contener dos o más caracteres). Como hay 4096 entradas, entonces es un
esquema de codificación de 12 bits (0 a 4096 da 0 a 212-1 direcciones
diferentes). (Huffman/Lempel-Ziv Compression s.f.)

Codificación aritmética
La codificación aritmética es una forma de codificación entrópica utilizado
en compresión sin pérdidas. Normalmente, una cadena de caracteres como las
palabras "hola allí" está representada utilizando un número fijo de bits por
carácter, como en el código ASCII. Cuándo una cadena es convertida a
codificación aritmética, los caracteres frecuentemente usados serán
almacenados con menos bits y los no-tan-frecuentemente utilizados caracteres
serán almacenados con más bits, resultando en menos bits utilizados en total.
La codificación aritmética difiere de otras formas de codificación entrópica,
como la codificación de Huffman, en que más que separar la entrada a
símbolos componentes y reemplazar cada uno con un código, la codificación
aritmética codifica el mensaje entero a un solo número, una fracción n dónde
[0.0 ≤ ''n'' < 1.0).
En esta técnica de codificación sin pérdida de información se tiene en cuenta
los siguientes pasos:
 Se toma un alfabeto de n símbolos, cada símbolo tiene una frecuencia
de aparición asociada o probabilidad de aparición del símbolo, la
probabilidad en la secuencia de símbolos no necesariamente se
presentan en orden.
 Se calcula la probabilidad acumulativa para cada símbolo de una
secuencia, probabilidad que se torna para cada símbolo procesado en
un valor cada vez más pequeño.
 Se asigna a cada símbolo su rango que tienen como límite superior su
probabilidad acumulativa y como límite inferior la probabilidad del
símbolo anterior de la secuencia o cero sí es el primer símbolo.
 Se traduce el resultado a código binario. Los símbolos con mayor
probabilidad utilizan pocos bits, por ejemplo, 0.875 se traduce a 1110,
mientras que 0.25 a 01.

Codificación aritmética es una técnica eficiente, sin embargo es una técnica


patentada. En la Figura 1, se presenta un ejemplo de codificación aritmética.
Se observan los símbolos del alfabeto, su probabilidad, la probabilidad
acumulada de cada uno de ellos y el intervalo de probabilidades. (Serna s.f.)

Figura 2. Ejemplo de codificación aritmética

Codificación RLE (Run-Length Encoding)

La compresión RLE o Run-length encoding es una forma muy simple de


compresión de datos en la que secuencias de datos con el mismo valor son
almacenadas como un único valor más su recuento. Esto es más útil en datos
que contienen muchas de estas "secuencias"; por ejemplo, gráficos sencillos
con áreas de color plano, como iconos y logotipos.

Por ejemplo, considera una pantalla que contiene texto en negro sobre un
fondo blanco. Habría muchas secuencias de este tipo con pixeles blancos en
los márgenes vacíos, y otras secuencias de pixeles negros en la zona del texto.
Supongamos una única línea con N representando las zonas en negro y B las
de blanco:

BBBBBBBBBBBBNBBBBBBBBBBBBNNNBBBBBBBBBBBBBBBBBBBBB
BBBNBBBBBBBBBBBBBB
Si aplicamos la codificación run-length a esta línea, obtendríamos lo siguiente:

12BN12B3N24BN14B

Interpretado esto como 12 bes, 1 ene, 12 bes, 3 enes, etc. El código run-length
representa el original de 67 carácteres en tan sólo 16. Esta codificación
traducida a binario, cuyo principio es el mismo, se utiliza para el
almacenamiento de imágenes. Incluso ficheros de datos binarios pueden ser
comprimidos utilizando este método. El primer byte contiene un número que
representa el número de veces que el carácter está repetido. El segundo byte
contiene al propio carácter. En otros casos se codifican en un solo byte: 1 bit (0
o 1) y 7 bits para especificar el número de caracteres consecutivos.

Sin embargo, sistemas de compresión más modernos a menudo usan el


algoritmo de deflación u otros algoritmos basados en el LZ77, el cual tiene la
ventaja de utilizar secuencias de cadenas de caracteres

La codificación run-length realiza una compresión de datos sin pérdidas y es


muy utilizado en imágenes de 8 bits indexadas (en un principio fue utilizado
para imágenes en blanco y negro). No funciona tan bien en imágenes donde
varía constantemente el color de los pixels como fotografías, aunque JPEG lo
utiliza de forma efectiva en los coeficientes que quedan después de transformar
y cuantificar bloques de imágenes. (elhacker.net s.f.)

Figura 3. Codificación RLE

Codificación de byte pares

La codificación de bytes pares es una forma simple de comprimir datos. Consta


en reemplazar los pares de bytes más comunes por un byte que no esté
presente en los datos originales. Se requiere de una tabla de «emplazamiento»
o «reconstrucción» que contenga los pares de bytes originales y el que los
remplaza.
Supongamos que tenemos que codificar el siguiente texto:
aaabaaabac
El par "aa" que ocurre con frecuencia en el texto, es remplazado por un byte
que no es usado en el texto, ejemplo "Z" .Ahora en la tabla de reconstrucción
esta:
Z aa
Y el texto en entonces:
ZabZabac
El par "Za" ocurre con frecuencia, entonces tendrá que ser remplazado con un
byte que no sea usado en el texto, "Y". (En este caso "Za" puede ser
remplazada por "Z", siempre que cada ocurrencia de "Z" sea posteriormente
remplazada). La tabla de reconstrucción es entonces:
Z aa Y Za
Y el texto:
YbYbac
Otra vez más remplazamos el byte más frecuente:
Z aa Y Za X Yb
Y el texto:
XXac
Este texto no debe ser recomprimido con el mismo método ya que no hay un
par de bytes que se repitan más de una vez. En el caso de que se remplace XX
por X se estaría aumentando el tamaño del archivo en 2 bytes de más. Para
descomprimir el texto simplemente se remplazan los pares de bytes en orden
inverso. (Solveet beta s.f.)

Bibliografía

elhacker.net. s.f. https://foro.elhacker.net/programacion_cc/metodo_de_kompresion_rle-


t185414.0.html (último acceso: 07 de 2017).

«Huffman/Lempel-Ziv Compression.» s.f.


http://www.soc.napier.ac.uk/~bill/pdf/ADCO_C03.PDF (último acceso: 07 de 2017).

Serna, Dra. Nora La. Compresión de imágenes: Fundamentos, técnicas y formatos . s.f.
http://sisbib.unmsm.edu.pe/BibVirtual/publicaciones/risi/2009_n1/v6n1/a04v6n1.pdf
(último acceso: 07 de 2017).

Solveet beta. s.f. http://www.solveet.com/exercises/Compresion-RLE/35 (último acceso: 07 de


2017).

You might also like