From d8bb5b6d1cb0605a38365d8dd6f932fc87abc21e Mon Sep 17 00:00:00 2001 From: Peter Gerwinski <peter.gerwinski@hs-bochum.de> Date: Wed, 12 Jun 2024 08:07:00 +0200 Subject: [PATCH] Notizen 6.6.2024 --- 20240606/ad-20240606.txt | 250 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 20240606/ad-20240606.txt diff --git a/20240606/ad-20240606.txt b/20240606/ad-20240606.txt new file mode 100644 index 0000000..5d78501 --- /dev/null +++ b/20240606/ad-20240606.txt @@ -0,0 +1,250 @@ +Bildkompressionsalgorithmus, selbst entwickelt, 06.06.2024, 17:22:52 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +verlustbehafteter Algorithmus: Informationen gehen dauerhaft verloren. +--> Rekonstruktionen durch KI sind notwendigerweise fehlerhaft. + +Anzahl der Pixel verkleinern: mehrere Pixel zu 1 zusammenfassen, Farben mitteln +--> Reduktion der Größe --> Wir verlieren Bildschärfe. +Farbspektrum minimieren --> Wir verlieren Farbinformation. + +Verlustfreie Kompression, 06.06.2024, 17:27:57 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Kann es einen verlustfreien Kompressionsalgorithmus geben, der _immer_ zu einem +kürzeren Ergebnis führt? +--> Nein, denn dann könnte man dieses Ergebnis weiter verkleinern, + bis man zwangsläufig irgendwann bei 0 Bit (leere Datei) ankommt. +--> Nein, denn es gibt 2^n verschiedene Nachrichten mit n Bits, + aber nur 2^(n-1) verschiedene Nachrichten mit n - 1 Bits. + --> Sobald ich Bits weg-komprimiere, kann ich nicht mehr alle + möglichen Nachrichten darstellen. + +Huffman-Kodierung: + - Bestimmung der relativen Häufigkeit der Symbole + (z.B. Text in deutscher Sprache: e ist am häufigsten, y eher selten) + - Erstellung eines binären Baumes: häufige Symbole ganz oben (Wurzel), + seltene Symbole unten (Blätter). + - Zuordnung von Bitfolgen gemäß dem Baum: + kurze Folgen für häufige, lange für seltene + +Auch Morse-Code ist eine Art Huffman-Kodiering, allerdings +mit einem (mindestens) ternären Baum: +es gibt nicht nur "0" und "1", sondern "kurz", "lang" und "Pause" + + + .----- jeweils 3 Abzweigungen + v + + kurz + Pause: e + + kurz + Pause: i + | + + lang + Pause: a + + kurz + Pause: r + + lang + Pause: t + + Pause: Leerzeichen + +Nachteil der Huffman-Kodierung: +Man muß den Codierungsbaum ("Morse-Alphabet") mitsenden - +oder sich vorher auf einen "Universal"-Codierungsbaum einigen. + +Lempel-Ziv-Welch-Algorithmus: Baum wächst mit, 06.06.2024, 17:45:25 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +8-Bit-Daten komprimieren: Wir senden zunächst 9-Bit-Code. +Die unteren 8 Bit entsprechen den Daten. + +Beispiel: BARBARAS RHABARBERBAR (21 Zeichen) +sende: B (+0-Bit) + A merke: BA = 256 + R merke: AR = 257 + BA merke: RBA = 258 + R merke: BAR = 259 + A merke: RA = 260 + S merke: AS = 261 + _ (Leerzeichen) merke: S_ = 262 + R merke: _R = 263 + H merke: RH = 264 + A merke: HA = 265 + BAR merke: ABAR = 266 + B merke: BARB = 267 + E merke: BE = 268 + RBA merke: ERBA = 269 + R merke: RBAR = 270 + --------- + 16 · 9 Bit ^^^^^^^^^^^^^^^^^ + gesendet Wenn das überläuft: von 9 Bit auf 10 erweitern + = 18 Bytes + +Differenzbildung, 06.06.2024, 17:59:53 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Beispiel: Linie in Pixelgrafik + 100 nach rechts -. + 1 rauf | + 5 nach rechts | + 1 rauf | + 2 nach rechts | + 1 rauf | + 1 nach rechts | + 1 rauf } Diese Zahlen sind leicht zu komprimieren, z.B.: + 1 nach rechts | - mit LZW + 1 rauf | - y als 4-Bit-Zahlen mit Vorzeichen, + 1 nach rechts | x als 3-Bit-Zahlen mit Vorzeichen, + 2 rauf | + Escape-Symbol für "Ausreißer" (z.B. die 100 am Anfang) + 1 nach rechts | + 1 rauf | + 1 nach rechts | + 3 rauf -' + +Davon kann man auch noch mal Differenzen bilden: + 100 + -99 + +4 + -4 + +1 + 0 + 0 + 0 + 0 + ... +--> In manchen Fällen wird das Ergebnis dadurch noch leichter zu komprimieren. + +Besondere Praxisrelevanz: Video-Komprimierung +Video-Formate haben Key-Frames (ganzes Bild abgespeichert). +Bilder zwischen den Key-Frames werden als Differenzen dazu abgespeichert. +(zusätzlich: Vektoren für Scrolling, z.B. bei Kameraschwenks) + +Weitere Nutzen von Key-Frames: + - Resynchronisation bei Ausfällen (z.B. beim Streamen) + - Nutzung von verlustbehafteter Komprimierung möglich + +Verlustbehaftete Kompression: JPEG, 06.06.2024, 18:19:14 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Farbmodell umrechnen: statt Rot/Grün/Blau verwenden wir: + - Kontrast (Graustufenbild) - gut sichtbar, in voller Auflösung speichern + - Differenz Blau/Gelb ("color blueness") - schlecht sichtbar, in halber Auflösung speichern + - Differenz Rot/trün ("color redness") - schlecht sichtbar, in halber Auflösung speichern +--> Bereits hierdurch: Komprimierung um den Faktor ... + vorher: 24 Bit pro Pixel + nachher: 8 Bit (Graustufen) + 1/4 von 8 Bit (redness) + 1/4 von 8 Bit (blueness) + = 12 Bit pro Pixel + ... Faktor 2. + +Räumliche Fourier-Transformation + - 8x8 Pixel, jeweils eine Zahl speichern, z.B. von 0 bis 255 --> 64 Bytes +--> 64 Basisvektoren für den Vektorraum aller auf diese Weise möglichen Bilder + + . . + | 1 | Zeile 1, Spalte 1 + | 0 | Zeile 1, Spalte 2 + | 0 | + | 0 | + | 0 | + a1 = | 0 | 64 Komponenten für ein Bild aus 8x8 Pixeln + | · | + | · | + | · | + | 0 | + | 0 | Zeile 64, Spalte 64 + ` ' + + . . + | 0 | Zeile 1, Spalte 1 + | 0 | Zeile 1, Spalte 2 + | 0 | + | 0 | + | 0 | + a64 = | 0 | 64 Komponenten für ein Bild aus 8x8 Pixeln + | · | + | · | + | · | + | 0 | + | 1 | Zeile 8, Spalte 8 + ` ' + + + Bild = x0 · a1 + x1 · a2 + ... + x64 · a64 + +Trick: Verwende eine andere Basis --> Fourier-Transformation + + . . + | 1 | Zeile 1, Spalte 1 + | 1 | Zeile 1, Spalte 2 + | 1 | + | 1 | + | 1 | + b1 = | 1 | 64 Komponenten für ein Bild aus 8x8 Pixeln + | · | + | · | + | · | + | 1 | + | 1 | Zeile 64, Spalte 64 + ` ' + + . . + | 1 | Zeile 1, Spalte 1 + | 0 | Zeile 1, Spalte 2 + | 1 | + | 0 | + | 1 | + | 0 | + | 1 | + | 0 | Zeile 1, Spalte 8 + | 0 | Zeile 2, Spalte 1 + | 1 | + | 0 | + | 1 | + | 0 | + | 1 | + | · | + | · | + | · | + b64 = | 0 | 64 Komponenten für ein Bild aus 8x8 Pixeln + | · | + | · | + | · | + | 1 | + | 0 | + | 1 | + | 0 | Zeile 8, Spalte 8 + ` ' + +Siehe: https://de.wikipedia.org/wiki/Datei:Dctjpeg.png + +Stelle das Bild bzgl. der Basis b (statt a) dar +--> andere Zahlen, z.B. y1 bis y64 (statt x1 bis x64) + +Trick: lasse alls Basisvektoren "unten rechts" "einfach so" weg. +--> Was man schlechter sehen kann, verschwindet. +(Siehe auch: https://de.wikipedia.org/wiki/Datei:JPEG_ZigZag.jpg) + +Danach: Differenz bilden + +Danach: Huffman-Kodierung + +Bemerkungen zur Kompression, 06.06.2024, 18:43:55 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + - "Eine Datei wird durch wiederholtes Kopieren immer schlechter." + --> Nein, wird sie nicht. + + - "Komprimieren lohnt sich nicht. Mein Netz ist schnell genug." + --> Doch. Es lohnt sich. + + - Eine Datei wird durch Komprimieren und Dekomprimieren ... + --> nicht schlechter (bei verlustfreier Kompression) + --> schlechter (bei verlustbehafteter Kompression) + + - Pixel- vs. Vektorgrafik + + Für Strichzeichnungen (z.B. Schaltpläne, UML-Diagramme, ...) + --> Vektorgrafik verwenden. PDF (kann auch Pixelgrafik enthalten!), SVG, PS, EPS, ... + Pixelgrafik hat geringere Qualität und verbraucht viel mehr Speicherplatz. + + Für Fotos und Vergleichbares: verlustbehaftet komprimieren. JPEG + --> In der Regel ist eine Auflösung von 300 dpi zu empfehlen. + dpi = dots per inch = Pixel pro 2.54cm + z.B. für ein Bild der Breite 5.08cm: 600 Bildpunkte + + Für pixelgenaue Nicht-Foto-Grafiken: verlustfrei komprimieren. PNG + + - E-Mail-Attachments sind Base64-codiert (6 von 8 Bit) + und damit viel größer als die Original-Daten -- GitLab