mikrocontroller.net

Forum: PC-Programmierung Inkrementelle Bildkompression


Autor: Julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

:
Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Julian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: // (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom Ekman (tkon)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom Ekman (tkon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.