Compresión de imágenes simple, sin streaming y sin pérdidas


8

¿Alguien sabe de alguna técnica de compresión de imágenes con las siguientes características:

  • sin pérdidas
  • transmisión: quiero comprimir sobre la marcha, píxel por píxel.
  • sobrecarga de poca memoria: puedo permitirme amortiguar una sola línea, pero idealmente ni siquiera eso.
  • no hay diccionarios dinámicos
  • Solo imágenes del "mundo real", por lo que el rendimiento en "casos desagradables" como los tableros de ajedrez no es importante
  • Compresión 2-3x (5x-10x sería aún mejor, pero eso es mucho lo que sé)
  • puede operar en píxeles de 10-16 bits (dependiendo de mi cámara)

Mis imágenes tendrán ~ 1k píxeles de ancho, con tasas de píxeles de ~ 20Mpix / seg. La profundidad de píxel será algo entre 10 y 16 bits por píxel (dependiendo de la elección de la cámara). Suponga que los anchos de píxeles de menos de 16 bits estarían representados dentro de una palabra de 16 bits por ahora, en lugar de tener que extraerse de un flujo continuo de bits.

¿Alguna forma de codificación aritmética delta + quizás?


¿Sus píxeles de 10 a 16 bits siempre están rellenados para decir, 16 bits, o están empaquetados?
Paul R

1
Parece que no hay muchos requisitos específicos de imagen allí. A riesgo de sonar obvio, ¿ha considerado probar un algoritmo estándar de compresión de transmisión de datos, como zlib, LZMA, etc.?
Jason R

@PaulR - pregunta actualizada - los píxeles serán rellenados.
Martin Thompson

@JasonR: He investigado un poco sobre técnicas "estándar", pero mi impresión (¿posiblemente inexacta?) Es que parecen ser demasiado dinámicas y bastante hambrientas de memoria (en relación con mi criterio de "incluso 1K lo extiende" :)
Martin Thompson

1
el huffyuv mencionado a continuación es bastante similar a su propia sugerencia 'delta + aritmética'. Aunque obviamente usa huffman en lugar de codificación aritmética para la parte de codificación de entropía. en 8 bits / píxel suele alcanzar un poco más de 2x de compresión, con solo 1 línea de búfer.
Sr. White

Respuestas:


4

Puede considerar usar Huffyuv: http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html

Esto no es mucho mejor que un simple zip, pero todavía está ligeramente optimizado para imágenes.

Cualquier compresión relacionada con la imagen proviene de técnicas como la cuantización vectorial o la codificación de transformación. Para utilizar transformaciones como DCT / Wavelet y sin pérdidas, puede pensar en JPEG-LS o JPEG2000 para la compresión. Lo único es que no se está transmitiendo en su sentido de definición.


1
Huffyuv solo requiere un buffer de línea, su técnica de descorrelación espacial (el predictor mediano) es, por lo tanto, simple. Para tasas de compresión más altas, un buen predictor espacial es clave. Espere que la cantidad requerida de buffers de línea aumente significativamente. DCT / Wavelet, por ejemplo, requiere de 4 a 8 líneas como mínimo, para lograr mejores resultados que Huffyuv
Sr. White,

2

Esto se parece a lo que pondrías en una cámara digital para un RAW sin pérdidas.

1 / Verifique el código fuente de dcraw para ver lo que varios fabricantes de cámaras ya están haciendo. Por ejemplo, Pentax usa un esquema int de longitud variable (longitud N codificada con un código huffman, luego N bits) para codificar el delta de un píxel wrt el píxel anterior del mismo color en el mosaico Bayer; y esto logra rutinariamente proporciones de 1: 1.5 a 1: 2.

2 / Los archivos DNG también se pueden comprimir. Verifique cómo se hace desde las especificaciones de Adobe ... No estoy seguro si se basa en una predicción similar + codificación int de longitud variable (que es streaming); o si utiliza el JPEG-LS más avanzado basado en LOCO (y que desafortunadamente requiere varios pases en los datos).


1

zlib tiene un modo de compresión ("HUFFMAN_ONLY") que es rápido y no requiere mucha memoria. Para fotos típicas que usan zlib con libpng, obtengo relaciones de compresión de 1: 2. Puede probarlo con ImageMagick, GraphicsMagick o pngcrush.

convert input.ppm -quality 1 output_im.png
gm convert input.ppm -quality 1 output_gm.png
pngcrush -force -m 12 input.png output_pc.png

Todos estos ejemplos usan el filtro "sub" PNG (1) que es efectivo para fotos. Para * Magick, "-quality 1" y para pngcrush, "-m 12" significa utilizar el filtro "sub" y la compresión "huffman_only".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.