Compressione delle immagini semplice, streaming e senza perdita di dati


8

Qualcuno sa di eventuali tecniche di compressione delle immagini con le seguenti caratteristiche:

  • senza perdita
  • streaming - Voglio comprimere al volo, pixel per pixel.
  • sovraccarico di memoria insufficiente - posso permettermi di bufferizzare una singola linea, ma idealmente nemmeno quello.
  • nessun dizionario dinamico
  • Solo immagini "del mondo reale", quindi le prestazioni su "casi cattivi" come le scacchiere non sono importanti
  • Compressione 2-3x (5x-10x sarebbe ancora meglio, ma questo è molto lo so)
  • può operare su pixel da 10-16 bit (a seconda della mia fotocamera)

Le mie immagini avranno una larghezza di ~ 1k pixel, con una frequenza di pixel di ~ 20Mpix / sec. La profondità dei pixel sarà compresa tra 10 e 16 bit per pixel (a seconda della scelta della fotocamera). Supponiamo che le larghezze di pixel inferiori a 16 bit siano rappresentate all'interno di una parola di 16 bit per ora, anziché dover essere estratte da un flusso di bit continuo.

Qualche forma di delta + codifica aritmetica forse?


I pixel da 10 a 16 bit sono sempre imbottiti per dire, 16 bit o sono impacchettati?
Paul R,

1
Sembra che non ci siano molti requisiti specifici per l'immagine lì. A rischio di sembrare ovvio, hai mai considerato di provare un algoritmo standard di compressione dei dati di streaming, come zlib, LZMA, ecc.?
Jason R,

@PaulR - domanda aggiornata - i pixel saranno riempiti.
Martin Thompson,

@JasonR: Ho fatto un po 'di indagine sulle tecniche "standard", ma la mia impressione (forse imprecisa?) Sembra che siano troppo dinamiche e abbastanza affamate di memoria (rispetto al mio criterio "anche 1K lo allunga" :)
Martin Thompson,

1
l'huffyuv menzionato di seguito è abbastanza simile al tuo suggerimento "delta + aritmetico". Sebbene ovviamente usi huffman invece della codifica aritmetica per la parte di codifica entropica. su 8 bit / pixel raggiunge in genere leggermente sopra la compressione 2x, con solo 1 buffer di linea.
Mr. White,

Risposte:


4

Puoi prendere in considerazione l'utilizzo di Huffyuv: http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html

Questo non è molto meglio di un semplice zip, ma è comunque leggermente ottimizzato per le immagini.

Qualsiasi compressione legata all'immagine deriva da tecniche come la quantizzazione vettoriale o la codifica Transform. Per utilizzare trasformazioni come DCT / Wavelet e renderle senza perdita di dati, puoi pensare a JPEG-LS o JPEG2000 per la compressione. L'unica cosa è che non è streaming nel tuo senso della definizione.


1
Huffyuv richiede solo un buffer di linea, la sua tecnica di decorrelazione spaziale (il predittore mediano) è quindi semplice. Per tassi di compressione più elevati, è fondamentale un buon predittore spaziale. Aspettatevi che la quantità richiesta di buffer di linea aumenti in modo significativo. DCT / Wavelet, ad esempio, richiede almeno da 4 a 8 righe, al fine di ottenere risultati migliori rispetto a Huffyuv
Mr. White,

2

Questo sembra quello che avresti messo in una fotocamera digitale per un RAW senza perdita di dati.

1 / Controlla il codice sorgente di dcraw per vedere cosa stanno già facendo vari produttori di fotocamere. Ad esempio, Pentax utilizza uno schema int di lunghezza variabile (lunghezza N codificata con un codice huffman, quindi N bit) per codificare il delta di un pixel rispetto al pixel precedente dello stesso colore nel mosaico di Bayer; e ciò raggiunge abitualmente rapporti da 1: 1,5 a 1: 2.

Anche i file 2 / DNG possono essere compressi. Controlla come viene fatto dalle specifiche Adobe ... Non sono sicuro se si basa su una previsione simile + codifica int a lunghezza variabile (che è streaming); o se utilizza il più avanzato JPEG-LS basato su LOCO (e che purtroppo richiede diversi passaggi sui dati).


1

zlib ha una modalità di compressione ("HUFFMAN_ONLY") che è veloce e non richiede molta memoria. Per le foto tipiche che usano zlib con libpng ottengo rapporti di compressione circa 1: 2. Puoi provarlo 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

Questi esempi usano tutti il ​​filtro "sub" PNG (1) che è efficace per le foto. Per * Magick, "-quality 1" e per pngcrush, "-m 12" significa utilizzare il filtro "sub" e la compressione "huffman_only".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.