Compression d'image simple, en continu et sans perte

8

Quelqu'un connaît-il des techniques de compression d'image présentant les caractéristiques suivantes:

  • sans perte
  • streaming - je veux compresser à la volée, pixel par pixel.
  • surcharge de mémoire faible - je peux me permettre de mettre en mémoire tampon une seule ligne, mais idéalement pas même cela.
  • pas de dictionnaires dynamiques
  • Images "du monde réel" uniquement, donc les performances sur des "cas désagréables" comme des damiers ne sont pas importantes
  • 2-3x compression (5x-10x serait encore mieux, mais c'est beaucoup demander, je sais)
  • peut fonctionner sur des pixels de 10 à 16 bits (selon mon appareil photo)

Mes images auront une largeur de ~ 1k pixels, avec des taux de pixels de ~ 20Mpix / sec. La profondeur de pixel sera comprise entre 10 et 16 bits par pixel (selon le choix de la caméra). Supposons que les largeurs de pixels inférieures à 16 bits soient représentées dans un mot de 16 bits pour le moment, plutôt que d'avoir besoin d'être extraites d'un flux binaire continu.

Une forme de codage delta + arithmétique peut-être?

Martin Thompson
la source
Vos pixels 10 - 16 bits sont-ils toujours rembourrés pour dire 16 bits, ou sont-ils emballés?
Paul R
1
Il semble qu'il n'y ait pas beaucoup d'exigences spécifiques à l'image là-bas. Au risque de paraître évident, avez-vous envisagé d'essayer un algorithme de compression de données en streaming standard, comme zlib, LZMA, etc.?
Jason R
@PaulR - question mise à jour - les pixels seront remplis.
Martin Thompson
@JasonR: J'ai fait un peu d'investigation sur les techniques "standard", mais mon impression (peut-être inexacte?) Est qu'elles semblent trop dynamiques et assez gourmandes en mémoire (par rapport à mon critère "même 1K l'étire" :)
Martin Thompson
1
le huffyuv mentionné ci-dessous est assez similaire à votre propre suggestion «delta + arithmétique». Bien qu'évidemment, il utilise Huffman au lieu du codage arithmétique pour la partie codage entropique. sur 8 bits / pixel, il atteint généralement légèrement au-dessus de la compression 2x, avec seulement 1 ligne de mémoire tampon.
M. White

Réponses:

4

Vous pouvez envisager d'utiliser Huffyuv: http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html

Ce n'est pas mieux qu'un simple zip, mais reste légèrement optimisé pour les images.

Toute compression liée à l'image provient de techniques telles que la quantification vectorielle ou le codage de transformation. Afin d'utiliser des transformations telles que DCT / Wavelet tout en les rendant sans perte, vous pouvez penser à JPEG-LS ou JPEG2000 pour la compression. La seule chose est que ce n'est pas en streaming dans votre sens de la définition.

Dipan Mehta
la source
1
Huffyuv ne nécessite qu'un seul tampon de ligne, sa technique de décorrélation spatiale (le prédicteur médian) est donc simple. Pour des taux de compression plus élevés, un bon prédicteur spatial est essentiel. Attendez-vous à ce que la quantité requise de tampons de ligne augmente considérablement. DCT / Wavelet par exemple, nécessite au moins 4 à 8 lignes, afin d'obtenir de meilleurs résultats que Huffyuv
Mr. White
2

Cela ressemble à ce que vous mettriez dans un appareil photo numérique pour un RAW sans perte.

1 / Vérifiez le code source de dcraw pour voir ce que font déjà différents fabricants d'appareils photo. Par exemple, Pentax utilise un schéma int de longueur variable (longueur N codée avec un code de Huffman, puis N bits) pour coder le delta d'un pixel par rapport au pixel précédent de la même couleur dans la mosaïque Bayer; et ceci atteint régulièrement des rapports de 1: 1,5 à 1: 2.

2 / Les fichiers DNG peuvent également être compressés. Vérifiez comment cela est fait à partir des spécifications Adobe ... Je ne sais pas si elle est basée sur une prédiction similaire + un codage int de longueur variable (qui est en streaming); ou s'il utilise le JPEG-LS plus avancé basé sur LOCO (et qui nécessite malheureusement plusieurs passes sur les données).

pichenettes
la source
1

zlib a un mode de compression ("HUFFMAN_ONLY") qui est rapide et ne nécessite pas beaucoup de mémoire. Pour les photos typiques utilisant zlib avec libpng, j'obtiens des taux de compression d'environ 1: 2. Vous pouvez l'essayer avec ImageMagick, GraphicsMagick ou 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

Ces exemples utilisent tous le filtre "sub" PNG (1) qui est efficace pour les photos. Pour * Magick, "-quality 1" et pour pngcrush, "-m 12" signifie utiliser le filtre "sub" et la compression "huffman_only".

Glenn Randers-Pehrson
la source