Einfache, verlustfreie Streaming-Bildkomprimierung

8

Kennt jemand Bildkomprimierungstechniken mit den folgenden Eigenschaften:

  • verlustfrei
  • Streaming - Ich möchte Pixel für Pixel im laufenden Betrieb komprimieren.
  • Low-Memory-Overhead - Ich kann es mir leisten, eine einzelne Zeile zu puffern, aber im Idealfall nicht einmal das.
  • keine dynamischen Wörterbücher
  • Nur "reale" Bilder, daher ist die Leistung in "bösen Fällen" wie Schachbrettern nicht wichtig
  • 2-3x Komprimierung (5x-10x wäre noch besser, aber das verlangt viel, was ich weiß)
  • kann mit 10-16 Bit Pixel arbeiten (abhängig von meiner Kamera)

Meine Bilder werden ~ 1k Pixel breit sein, mit Pixelraten von ~ 20Mpix / Sek. Die Pixeltiefe liegt zwischen 10 und 16 Bit pro Pixel (abhängig von der Wahl der Kamera). Angenommen, Sub-16-Bit-Pixelbreiten würden vorerst in einem 16-Bit-Wort dargestellt, anstatt aus einem kontinuierlichen Bitstrom extrahiert werden zu müssen.

Vielleicht irgendeine Form von Delta + arithmetischer Codierung?

Martin Thompson
quelle
Sind Ihre 10 - 16-Bit-Pixel immer mit 16 Bit aufgefüllt oder sind sie gepackt?
Paul R
1
Es scheint, dass es dort nicht viele bildspezifische Anforderungen gibt. Haben Sie überlegt, einen Standardalgorithmus für die Komprimierung von Streaming-Daten wie zlib, LZMA usw. zu verwenden?
Jason R
@PaulR - Frage aktualisiert - die Pixel werden aufgefüllt.
Martin Thompson
@JasonR: Ich habe ein bisschen nach "Standard" -Techniken gesucht, aber mein (möglicherweise ungenauer?) Eindruck ist, dass sie zu dynamisch und ziemlich speicherhungrig zu sein scheinen (im Vergleich zu meinem Kriterium "sogar 1K streckt es") :)
Martin Thompson
1
Das unten erwähnte Huffyuv ist Ihrem eigenen "Delta + Arithmetik" -Vorschlag ziemlich ähnlich. Obwohl offensichtlich Huffman anstelle der arithmetischen Codierung für den Entropiecodierungsteil verwendet wird. Bei 8 Bit / Pixel erreicht es normalerweise etwas mehr als die 2-fache Komprimierung mit nur 1 Zeilenpuffer.
Mr. White

Antworten:

4

Sie können Huffyuv verwenden: http://neuron2.net/www.math.berkeley.edu/benrg/huffyuv.html

Dies ist nicht besser als ein einfacher Reißverschluss, aber dennoch leicht für Bilder optimiert.

Jede bildbezogene Komprimierung beruht auf Techniken wie Vektorquantisierung oder Transformationscodierung. Um Transformationen wie DCT / Wavelet zu nutzen und dennoch verlustfrei zu machen, können Sie sich JPEG-LS oder JPEG2000 für die Komprimierung vorstellen. Das einzige ist, dass es nicht im Sinne Ihrer Definition gestreamt wird .

Dipan Mehta
quelle
1
Huffyuv benötigt nur einen Zeilenpuffer, seine räumliche Dekorrelationstechnik (der Median-Prädiktor) ist daher einfach. Für höhere Komprimierungsraten ist ein guter räumlicher Prädiktor der Schlüssel. Erwarten Sie, dass die erforderliche Anzahl von Zeilenpuffern erheblich ansteigt. DCT / Wavelet zum Beispiel benötigt mindestens 4 bis 8 Zeilen, um bessere Ergebnisse als Huffyuv zu erzielen
Mr. White
2

Dies sieht so aus, als würden Sie eine Digitalkamera für eine verlustfreie RAW einsetzen.

1 / Überprüfen Sie den Quellcode von dcraw, um festzustellen, was verschiedene Kamerahersteller bereits tun. Zum Beispiel verwendet Pentax ein int-Schema variabler Länge (Länge N, codiert mit einem Huffman-Code, dann N Bits), um das Delta eines Pixels gegenüber dem vorherigen Pixel derselben Farbe im Bayer-Mosaik zu codieren. und dies erreicht routinemäßig Verhältnisse von 1: 1,5 bis 1: 2.

2 / DNG-Dateien können ebenfalls komprimiert werden. Überprüfen Sie anhand der Adobe-Spezifikationen, wie es gemacht wird. Sie sind sich nicht sicher, ob es auf einer ähnlichen Vorhersage + int-Codierung mit variabler Länge (Streaming) basiert. oder wenn es das fortgeschrittenere JPEG-LS verwendet, das auf LOCO basiert (und das leider mehrere Durchgänge für die Daten erfordert).

Pichenettes
quelle
1

zlib hat einen Komprimierungsmodus ("HUFFMAN_ONLY"), der schnell ist und nicht viel Speicher benötigt. Für typische Fotos mit zlib mit libpng erhalte ich etwa 1: 2 Komprimierungsverhältnisse. Sie können es mit ImageMagick, GraphicsMagick oder pngcrush ausprobieren.

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

Diese Beispiele verwenden alle den PNG "Sub" -Filter (1), der für Fotos wirksam ist. Für * Magick bedeutet "-quality 1" und für pngcrush "-m 12" die Verwendung des "sub" -Filters und der "huffman_only" -Komprimierung.

Glenn Randers-Pehrson
quelle