stringtranslate.com

Codificación de longitud de ejecución

La codificación de longitud de ejecución ( RLE ) es una forma de compresión de datos sin pérdidas en la que las ejecuciones de datos (apariciones consecutivas del mismo valor de datos) se almacenan como una única aparición de ese valor de datos y un recuento de sus apariciones consecutivas, en lugar de como el ejecución original. Como ejemplo imaginario del concepto, al codificar una imagen formada por puntos de colores, la secuencia "verde verde verde verde verde verde verde verde" se acorta a "verde x 9". Esto es más eficaz en datos que contienen muchas ejecuciones de este tipo, por ejemplo, imágenes gráficas simples como iconos, dibujos lineales, juegos y animaciones. Para archivos que no tienen muchas ejecuciones, codificarlos con RLE podría aumentar el tamaño del archivo.

RLE también puede referirse en particular a uno de los primeros formatos de archivos de gráficos admitidos por CompuServe para comprimir imágenes en blanco y negro, que fue ampliamente suplantado por su posterior formato de intercambio de gráficos (GIF).

RLE también hace referencia a un formato de imagen poco utilizado en Windows 3.x que se guarda con la extensión de archivo rle; es un mapa de bits codificado de longitud de ejecución y el formato se usó para la pantalla de inicio de Windows 3.x.

Historia y aplicaciones

Los esquemas de codificación de longitud de ejecución (RLE) se emplearon en la transmisión de señales de televisión analógicas ya en 1967. [1] En 1983, Hitachi patentó la codificación de longitud de ejecución . [2] [3] [4] RLE se adapta particularmente bien a imágenes de mapa de bits basadas en paletas (que utilizan relativamente pocos colores), como iconos de computadora , y fue un método de compresión de imágenes popular en los primeros servicios en línea como CompuServe antes de la llegada de formatos más sofisticados como GIF . [5] No funciona bien en imágenes de tonos continuos (que utilizan muchos colores), como fotografías, aunque JPEG lo utiliza en los coeficientes que quedan después de transformar y cuantificar bloques de imágenes.

Los formatos comunes para datos codificados de longitud de ejecución incluyen Truevision TGA , PackBits (de Apple, utilizado en MacPaint ), PCX e ILBM . La Unión Internacional de Telecomunicaciones también describe un estándar para codificar el color de tiradas para máquinas de fax , conocido como T.45. [6] Ese estándar de codificación de colores de fax, que junto con otras técnicas se incorpora a la codificación Huffman modificada , [ cita necesaria ] es relativamente eficiente porque la mayoría de los documentos enviados por fax son principalmente espacios en blanco, con interrupciones ocasionales de negro.

Algoritmo

RLE tiene una complejidad espacial de ⁠ ⁠ , donde n es el tamaño de los datos de entrada.

Algoritmo de codificación

La codificación de longitud de ejecución comprime los datos reduciendo el tamaño físico de una cadena de caracteres repetida. Este proceso implica convertir los datos de entrada a un formato comprimido identificando y contando las apariciones consecutivas de cada carácter. Los pasos son los siguientes:

  1. Recorre los datos de entrada.
  2. Cuente el número de caracteres repetidos consecutivos (longitud de la ejecución).
  3. Almacene el carácter y su duración.

Implementación de Python

Importaciones y funciones auxiliares.
importar  colecciones desde  itertools  importar  recuento ,  agrupar pordef  consumir ( iterador ): """  Agota eficientemente un iterador sin devolver valores.  >>> i = (x para x en rango(10))  >>> consumir(i)  >>> siguiente(i)  Rastreo (última llamada más reciente):  Archivo "<stdin>", línea 1, en <módulo > Colecciones  StopIteration " "  "  .deque ( iterador , maxlen = 0 ) def  ilen ( iterable ): """  Devuelve el número de elementos en iterable.  >>> ilen(x para x en el rango(1000000) if x % 3 == 0)  333334  """  contador  =  contar ()  consumir ( zip ( iterable ,  contador ))  regresar  siguiente ( contador )
def  rle_encode ( iterable ,  * ,  length_first = True ): """  >>> "".join(rle_encode("AAAABBBCCDAA"))  '4A3B2C1D2A'  >>> "".join(rle_encode("AAAABBBCCDAA", length_first=False ))  'A4B3C2D1A2'  """ return ( f " { ilen ( g ) }{ k } " if length_first else f " { k }{ ilen ( g ) } " # ilen(g): longitud de g iterable para k , g en groupby ( iterable ) )               

[7]

Algoritmo de decodificación

El proceso de decodificación implica reconstruir los datos originales a partir del formato codificado repitiendo caracteres según su recuento. Los pasos son los siguientes:

  1. Recorre los datos codificados.
  2. Para cada par de recuento y caracteres, repita el recuento de caracteres varias veces.
  3. Agregue estos caracteres a la cadena de resultado.

Implementación de Python

Importaciones
desde  itertools  cadena de importación  , repetición , por lotes  
def  rle_decode ( iterable ,  * ,  length_first = True ): """  >>> "".join(rle_decode("4A3B2C1D2A"))  'AAAABBBCCDAA'  >>> "".join(rle_decode("A4B3C2D1A2", length_first=False ))  'AAAABBBCCDAA'  """ cadena de retorno . from_iterable ( repetir ( b , int ( a )) si length_first else repetir ( a , int ( b )) para a , b en lotes ( iterable , 2 ) )                 

[7]

Ejemplo

Considere una pantalla que contiene texto negro sobre un fondo blanco sólido. Habrá muchas tiradas largas de píxeles blancos en el espacio en blanco y muchas tiradas cortas de píxeles negros dentro del texto. Una línea de escaneo hipotética , donde B representa un píxel negro y W representa un píxel blanco, podría leerse de la siguiente manera:

WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW

Con un algoritmo de compresión de datos de codificación de longitud de ejecución (RLE) aplicado a la línea de exploración hipotética anterior, se puede representar de la siguiente manera:

12W1B12W3B24W1B14W


Esto se puede interpretar como una secuencia de doce W, una B, doce W, tres B, etc., y representa los 67 caracteres originales en sólo 18. Si bien el formato real utilizado para el almacenamiento de imágenes es generalmente binario en lugar de caracteres ASCII. De esta manera, el principio sigue siendo el mismo. Incluso los archivos de datos binarios se pueden comprimir con este método; Las especificaciones de formato de archivo a menudo dictan bytes repetidos en los archivos como espacio de relleno. Sin embargo, los métodos de compresión más nuevos, como DEFLATE, suelen utilizar algoritmos basados ​​en LZ77 , una generalización de la codificación de longitud de ejecución que puede aprovechar ejecuciones de cadenas de caracteres (como BWWBWWBWWBWW).

La codificación de longitud de ejecución se puede expresar de varias maneras para adaptarse a las propiedades de los datos, así como a algoritmos de compresión adicionales. Por ejemplo, un método popular codifica longitudes de ejecución para ejecuciones de dos o más caracteres únicamente, usando un símbolo de "escape" para identificar las ejecuciones, o usando el carácter mismo como escape, de modo que cada vez que un carácter aparece dos veces denota una ejecución. En el ejemplo anterior, esto daría lo siguiente:

WW12BWW12BB3WW24BWW14

Esto se interpretaría como una ejecución de doce W, una B, una ejecución de doce W, una ejecución de tres B, etc. En los datos donde las ejecuciones son menos frecuentes, esto puede mejorar significativamente la tasa de compresión.

Otro asunto es la aplicación de algoritmos de compresión adicionales. Incluso con las ejecuciones extraídas, las frecuencias de los diferentes caracteres pueden ser grandes, lo que permite una mayor compresión; sin embargo, si las longitudes de las ejecuciones se escriben en el archivo en las ubicaciones donde se produjeron las ejecuciones, la presencia de estos números interrumpe el flujo normal y hace que sea más difícil de comprimir. Para superar esto, algunos codificadores de longitud de ejecución separan los datos y los símbolos de escape de las longitudes de ejecución, de modo que los dos puedan manejarse de forma independiente. Para los datos de ejemplo, esto daría como resultado dos salidas, la cadena " WWBWWBBWWBWW" y los números ( 12,12,3,24,14).

Variantes

Ver también

Referencias

  1. ^ Robinson, AH; Cereza, C. (1967). "Resultados de un prototipo de esquema de compresión de ancho de banda de televisión". Actas del IEEE . 55 (3). IEEE : 356–364. doi :10.1109/PROC.1967.5493.
  2. ^ "Patentes de codificación de longitud de ejecución". Consorcio de preguntas frecuentes sobre Internet. 21 de marzo de 1996 . Consultado el 14 de julio de 2019 .
  3. ^ "Método y sistema de compresión y restauración de datos". Patentes de Google . 7 de agosto de 1984 . Consultado el 14 de julio de 2019 .
  4. ^ "Método de registro de datos". Patentes de Google . 8 de agosto de 1983 . Consultado el 14 de julio de 2019 .
  5. ^ Dunn, Christopher (1987). "¡Sonríe! ¡Estás en RLE!" (PDF) . El Transactor . 7 (6). Publicación de transacciones : 16–18 . Consultado el 6 de diciembre de 2015 .
  6. ^ Recomendación T.45 (02/00): Codificación de colores de longitud de tirada. Unión Internacional de Telecomunicaciones . 2000 . Consultado el 6 de diciembre de 2015 .
  7. ^ ab https://more-itertools.readthedocs.io/en/stable/_modules/more_itertools/more.html#run_length

enlaces externos