Forum: PC-Programmierung Inkrementelle Bildkompression


von Julian (Gast)


Lesenswert?

Ich suche ein Verfahren, mit dem ich Animationen (Folge von 
Einzelbildern in Form von Pixelbuffern) effizient komprimieren kann. Der 
wesentliche Punkt ist, dass die Animation zeitweise statisch ist, dass 
sich das Bild also insgesamt (oder in großen Bildbereichen) zeitweise 
nicht ändert. In diesen statischen Bereichen muss das reproduzierte Bild 
nach kurzer Zeit (<1s) dem Original exakt entsprechen.

Dies ist mit MPEG & Co nicht möglich, da diese Verfahren auch statische 
Szenen verlustbehaftet komprimieren (afaik). Wer hat Hinweise, nach 
welchen Algorithmen bzw. Implementierungen ich suchen sollte? Wenn 
möglich, sollte er nicht allzu schwer durchschaubar sein (als Messlatte 
gebe ich mal an, dass ich die JPEG-Kompression meine verstanden zu 
haben, während ich MPEG aufgrund der vielen Formate und Spezifikationen 
ziemlich undurchschaubar finde). Wenn eine Implementation mit 
Beispielen/Demos als open source verfügbar wäre, bringt es mich noch 
einen großen Schritt weiter.

Danke
Julian

:
von Tom E. (tkon)


Lesenswert?

Hi Julian,

wenn dir 256 Farben reichen versuchs mal mit einem "Animated GIF". Die 
können auch mit den meisten Programmen (inkl. Browser) betrachtet werden 
und es gibt auch einiges an Software dafür.

Für Echtfarben schau mal in der Wikipedia unter "Videoformat", da 
findest du einen kleinen Überblick gängiger Codecs.

von Julian (Gast)


Lesenswert?

Danke, Animated GIF werde ich mir in jedem Fall ansehen. 8 bit Farbtiefe 
ist etwas wenig, aber vielleicht lässt sich das Verfahren auf 16 bit 
erweitern? Kurze Nachfrage: ist Animated GIF verlustfrei (abgesehen von 
der Farbquantisierung)? Sonst wäre dies schon ein Ausschlusskriterium.

Es ist übrigens nicht notwendig, ein Standardformat zu verwenden. Die 
Animationen werden auf einer Speicherkarte transportiert und können auf 
dem Zielrechner mit einer noch maßzuschneidernden Software abgespielt 
werden. Ein weiterer Schritt wird darin bestehen, die Speicherkarte 
durch einen Infrarotübertragungskanal zu ersetzen.

von Julian (Gast)


Lesenswert?

Hallo Tom,
noch ein Nachtrag. Das Problem mit Animated GIF ist, wie ich eben 
herausgefunden habe, dass es auch schnell bewegte Bereiche verlustfrei 
komprimiert. Dies ergibt keine ausreichenden Kompressionsraten.

Wir brauchen eine Kombination aus
i) verlustbehafteter Kompression bewegter Bereiche mit einem 
vorgegebenen Limit der bps (bits per second)
ii) exakter Rekonstruktion statischer Bereiche innerhalb einiger Frames 
(z.B. 10-50 Frames bei 50fps).

Gibt es Verfahren, die automatisch zwischen i) und ii) hin und her 
schalten?

Julian

von Tom E. (tkon)


Lesenswert?

Ja, Animated GIF's sind verlustfrei.
Wie gesagt schau mal auf den Wikipediaartikel. Dort findest du z.B. 
"HuffYUV" oder "Lagarith" und noch einige mehr, welche verlustfrei 
arbeiten inkl. weiterführender Links.

von Kai G. (runtimeterror)


Lesenswert?

Wenn ich das richtig im Kopf habe wird bei MPEG alle paar Frames ein 
absoluter Stand zwischengeschoben - insbesondere bei starken 
Bildwechseln. Die Bilder dürften im JPEG-Format gespeichert sein. In der 
JPEG-Norm ist auch verlustfreie Kompressionsverfahren beschrieben. Ggf. 
kann man sich daraus was basteln.

Fertige Algorithmen dürften aber schwierig zu organisieren sein.

Schöne Grüße,
Kai

von // (Gast)


Lesenswert?

Dazu müsste man wohl festellen können WANN genau das Bild statisch ist.
Also laufend die Differenz bilden und schauen ob sich was über die 
letzten x Frames geändert hat?

von Kai G. (runtimeterror)


Lesenswert?

>Dazu müsste man wohl festellen können WANN genau das Bild statisch ist.
>Also laufend die Differenz bilden und schauen ob sich was über die
>letzten x Frames geändert hat?

Wenn die letzte Bilddifferenz nach einer verlustbehafteten Kompression 
ein bestimmtes Limit (in Bytes) unterschreitet, wird ein statisches 
verlustfreies Bild eingeschoben. Wird anschließend das Limit wieder 
überschritten, werden die Differenzen in komprimierter Form wieder 
übertragen. Eine gewisse Hysterese wird hier nötig sein.

von Tom E. (tkon)


Lesenswert?

Noch etwas:
Falls dir die 8 Bit von GIF genügen könntest du auch einfach deinen 
eigenen Encoder schreiben, welcher bei überschreiten deiner max. 
Datenrate automatisch nur ein (leicht) modifiziertes Bild abspeichert, 
welches weniger Speicher verbraucht. Da ja immer ein Differenzbild 
abgespeichert wird, wird sich nach einigen Bilder automatisch wieder 
einen 100% Übereinstimmung ergeben.

Wichtig dabei ist, dass nicht veränderte Pixel als transparente Pixel 
abgespeichert werden.

Für Vollfarbendarstellung waren mal die Formate APNG und MNG gedacht. 
Beide sich bis heute jedoch nicht besonders verbreitet.

von Tom E. (tkon)


Lesenswert?

Kannst /darfst du weitere Angaben machen um welche Art von Daten es sich 
handelt?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

// schrieb:
> Dazu müsste man wohl festellen können WANN genau das Bild statisch ist.
> Also laufend die Differenz bilden und schauen ob sich was über die
> letzten x Frames geändert hat?

So würde ich auch vorgehen.

Bild 1 komplett speichern
Differenz Bild2 - Bild1 speichern
Differenz Bild3 - Bild2 (alternativ Differenz Bild3 - Bild1) speichern
...
Verlustlosen Codec einsetzen

An den ... Stellen ggf. wieder Vollbilder einstreuen, wenn die Unordnung 
in den Differenzbildern zu gross wird, d.h. die Kompressionseffizienz 
sinkt.

Bei den Screenrecordern und/oder VNC Programmen müsste sowas bereits 
implementiert sein.

von Tom E. (tkon)


Lesenswert?

@Stefan
Daran dachte ich ursprünglich auch - klassischer Fall von 
Delta-Kompression.
Leider funktioniert das oft nicht effektiv, z.B. bei Rauschen oder wenn 
sich Vieles ändert. In meinem Fall waren es Aufnahmen von Webcambildern.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.