Bitmaps
Eine Bitmap (BMP) ist im Wesentlichen das, was Sie beschreiben, ein Array von Zahlen, die Pixelfarben darstellen. ZB sowas
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
Verlustfreie Kompression
Definieren wir nun ein Komprimierungsschema. In unserem Komprimierungsschema haben wir ein Array von Zahlenpaaren. Z.B
3, 1, 1, 0, 7, 1
Als erstes möchte ich darauf hinweisen, dass dieses Komprimierungsschema die gleichen Pixel wie das erste Array darstellt. Das erste Array hat drei Einsen, gefolgt von einer einzelnen 0 und dann sieben Einsen. Und genau das vertreten wir hier. Dieses Format ist kürzer, da es mehrere Pixel mit zwei Zahlen darstellt. Das Bitmap-Format muss eine Zahl für jedes Pixel verwenden.
Offensichtlich ist dies eine etwas vereinfachte Ansicht eines Bildes (z. B. nur eine Zeile) und ein Komprimierungsschema. Hoffentlich können Sie so sehen, wie ein Komprimierungsschema das Format eines Bildes ändert. So bezieht sich ein GIF auf ein BMP. GIF verwendet ein Komprimierungsschema namens Lempel-Ziv-Welch anstelle dieses vereinfachten.
Was wir hier beschrieben haben, ist ein verlustfreies Komprimierungsschema. Ein Problem bei verlustfreien Komprimierungsschemata besteht darin, dass bei einigen Eingaben die codierte Form möglicherweise länger als das Original ist. ZB für
1, 0, 1, 0, 1
Die Kodierung ist
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
Nun, das war nutzlos. Wir haben die Eingabe doppelt so lang gemacht.
Eine weitere verlustfreie Komprimierung
Betrachten wir nun ein anderes Komprimierungsschema. In diesem Beispiel stellen wir das Bild als überlagerte Kreise dar. Für jeden Kreis definieren wir einen Mittelpunkt, einen Radius und eine Farbe.
Unsere erste Bitmap würde werden
5, 5, 1, 3, 0, 0
Dies entspricht der Länge unserer ersten Komprimierungsmethode.
Und unsere zweite könnte beides sein
2, 2, 1, 2, 1, 0, 2, 0, 1
Dies sind drei Kreise, die in der Mitte des Elements zentriert sind (was bei der Computerzählung die Nummer 2 ist, da Computer bei 0 zu zählen beginnen). Ein Kreis hat Radius 2 und Farbe 1. Dann fügen wir einen Kreis mit Farbe 0 und Radius 1 hinzu. Schließlich haben wir einen Kreis mit Farbe 1 und Radius 0. In Schritten wäre dies
1, 1, 1, 1, 1
, 0, 0, 0, 1
1, 0, 1, 0, 1
Oder
2, 2, 1, 1, 0, 0, 3, 0, 0
Dies ist der gleiche Anfangskreis, der jedoch durch zwei Punktkreise abgedeckt ist. In Schritten wäre es
1, 1, 1, 1, 1
, 0, 1, 1, 1
1, 0, 1, 0, 1
Diese sind beide eine kürzer als die erste codierte Version, aber immer noch länger als das Original.
Sie fragen sich vielleicht, warum ich von Kreisen und nicht von Bereichen spreche. Der Hauptgrund ist, dass Kreise näher an den tatsächlichen zweidimensionalen Bildern liegen.
Verlustbehaftete Kompression
Wir haben auch das Konzept der verlustbehafteten Komprimierung. Diese verlustfreien Komprimierungsschemata können wieder in das ursprüngliche Bitmap-Array umgewandelt werden. Verlustbehaftete Komprimierungsschemata sind möglicherweise nicht umkehrbar.
Betrachten wir eine verlustbehaftete Version unserer Kreise-Methode. In diesem Beispiel verwenden wir eine einfache Regel. Wir werden keine Kreise mit einem Radius von weniger als 1 speichern. In unseren letzten beiden Codierungen hätten wir also stattdessen
2, 2, 1, 2, 1, 0
und
2, 2, 1
die wieder in pixel konvertiert sind
1, 0, 0, 0, 1
und
1, 1, 1, 1, 1
Die erste Version ist nur ein Element länger als das Original. Die zweite Version ist kürzer. Beide sind gültig, daher kann der Algorithmus beide entwickeln und den kürzeren auswählen.
Wir beschreiben Bilder mit restriktiveren Regeln als von geringerer Qualität.
Diese Darstellung von Bildern als überlagerte Sammlungen kreisförmiger Formen ähnelt der Funktionsweise der Joint Photographic Experts Group oder des JPEG- Formats. Seine Formen sind eher Ellipsen als Kreise, aber die Idee ist ähnlich. Anstelle unserer simplen Methode wird die diskrete Cosinustransformation zum Codieren von Bildern verwendet.
Im Gegensatz zu GIF ist JPEG eine andere Art, das Bild darzustellen. GIF ist immer noch Pixel. Sie werden nur auf andere Weise gespeichert. JPEG ist Formen. Um ein JPEG anzuzeigen, konvertieren wir die Formen in Pixel, da die Bildschirme so funktionieren. Theoretisch könnten wir einen Bildschirm entwickeln, der so nicht funktioniert. Anstelle von Pixeln könnten Formen erzeugt werden, die dem JPEG-Format besser entsprechen. Natürlich kann dieser Bildschirm keine Bitmaps anzeigen. Um ein BMP oder GIF anzuzeigen, müssten wir in JPEG konvertieren.
Wenn Sie ein Standard-GIF konvertieren, z. B. 300 x 300 Pixel, es in ein JPEG konvertieren und die Qualität nach unten drehen, sollten die verwendeten Basisformen sichtbar sein. Viele JPEGs vermeiden diese Artefakte, indem sie mit einem Bild mit einer viel höheren Auflösung beginnen.
JPEGs lassen sich gut skalieren, da es sich eher um Formen als um Pixel handelt. Wenn Sie also mit einem 8000 x 8000-Bild beginnen, es in JPEG konvertieren und als 300 x 300-Bild anzeigen, wäre ein Großteil der verloren gegangenen Details ohnehin verloren gegangen. Wenn Sie die 8000 x 8000-Bitmap zuerst in eine 300 x 300-Bitmap und dann in JPEG konvertiert haben, sind die Ergebnisse häufig von geringerer Qualität.
MPEG
Wir haben über Standbilder gesprochen. Das Moving Picture Experts Group- oder MPEG-Format verwendet dieselbe Komprimierungsart wie JPEG, aber es wird auch etwas anderes verwendet. Während eine einfache Methode zum Erstellen von Videos das Senden einer Sequenz von Standbildern ist, sendet MPEG tatsächlich ein Bild, gefolgt von einer Reihe von Bildern, in denen Änderungen aufgelistet sind, und endet mit einem Endbild. Da die meisten Bilder dem vorherigen Bild ähnlich sind, ist die Liste der Änderungen häufig kleiner als ein zweites Bild.
Die Sequenz ist normalerweise nicht so lang, sagen wir fünf Frames. Aber es hilft, den Stream kleiner zu machen, als es sonst der Fall wäre.
Vereinfachungen
Ich habe viel ignoriert. Meine Bilder haben nur zwei Farben (1 Bit), nicht die 256 eines 8-Bit-Bildes und schon gar nicht die 4 294 967 296 eines 32-Bit-Bildes. Beachten Sie auch bei 8-Bit-Bildern, dass Sie häufig unterschiedliche Paletten für das Bild auswählen können. Daher können zwei 8-Bit-Bitmaps mit derselben Sequenz Bilder darstellen, die unterschiedlich aussehen (gleiche Form, aber unterschiedliche Farben).
Meine Bilder sind einzelne Reihen, nicht zweidimensional. Bei den meisten Bildern wird eine bestimmte Zeilengröße gespeichert, wodurch die Arrays zweidimensional werden.
Ich habe nicht versucht, die tatsächlichen Kodierungen überhaupt darzustellen. Sie sind viel komplexer als die einfachen, die ich verwendet habe. Ich tat dies, weil ich die Kodierungen in diesem Beitrag beschreiben wollte. Ich bin nicht davon überzeugt, dass ich Lempel-Ziv noch viel weniger erklären könnte, als die komplexere Lempel-Ziv-Welch-Verfeinerung in einer einzigen Antwort. Und ich verstehe Fourier-Transformationen nicht gut genug, um sie ausführlich zu erklären.
Dies ist eine stark vereinfachte Version der eigentlichen Bildverarbeitung. Ich bin jedoch der Meinung, dass es aus didaktischen Gründen einfacher ist, die komplexere Realität zu verstehen, ohne dabei die wesentlichen Punkte außer Acht zu lassen.