-
Die
Erfindung betrifft ein Verfahren zur Komprimierung und Dekomprimierung
von Bilddaten.
-
Zur
Abspeicherung von Bildern gibt es heute eine Vielzahl von Techniken
und Komprimierungsverfahren. Die verwendeten Techniken lassen sich
im wesentlichen auf Pixel-basierte und Vektor-basierte Verfahren
zurückführen.
-
Bei
den Pixel-basierten Techniken wird über das Bild ein Raster gelegt.
Jeder Rasterpunkt entspricht einem Pixel. Ein Pixelwert wird mit
einem Bit (z. B. WBMP → Schwarz-Weiß) oder
mehreren Bits (z. B. BMP → True-Color)
kodiert. Um die Größe der Bilddateien
zu reduzieren, können
verschiedene Komprimierungsverfahren angewendet werden. Ein effektives
Verfahren besteht in der Reduzierung der Bits pro Pixel. Des weiteren
können
Verfahren angewendet werden, bei denen Pixel zu Gruppen zusammengefasst
werden. Dies sind in der Regel quadratische Bereiche, die dann mit
Hilfe der DCT (Diskreten Cosinus Transformation) in den Frequenzbereich transformiert
werden. Die bei der Transformation entstandenen hohen Frequenzanteile
können
ohne merkliche Qualitätsverluste
vernachlässigt
werden. Dieses Verfahren wird z. B. bei JPEG Bildern angewendet.
Bei sehr hohen JPEG Kompressionen kann es zu störenden, rechteckig-verschachtelten
Bildflecken – sogenannten "Artefakten" – führen.
-
Bei
den Vektor basierten Verfahren wird das Bild mit Hilfe von geometrischen
Formen (z. B. Rechtecke, Kreise) eindeutig beschrieben. Ein bekanntes
Verfahren ist das sogenannte SVG (Scalable Vector Graphics). Dieses
Verfahren ist bei technischen Zeichnungen hervorragend einsetzbar,
da so erstellte Bilder sehr gut skalierbar sind. Die entsprechenden
Dateien sind deutlich kleiner als bei herkömmlichen binären Bitmap-Formaten.
Diese Verfahren eignen sich jedoch weniger um Photos abzuspeichern.
-
Neben
den herkömmlichen
Fotoapparaten die auf einem Film belichten, gibt es immer mehr Fotoapparate,
die die Fotos anstelle auf einen Film digital auf Speichermedien
abspeichern. Da diese Speichermedien nur eine begrenzte Kapazität besitzen, können nur
eine kleine Anzahl hochauflösender
Fotos, oder viele Bilder mit geringerer Auflösung abgespeichert werden.
Eine flexible Skalierung ist zur Zeit nicht möglich.
-
Die
Aufgabe der Erfindung liegt in der Schaffung eines Verfahrens zur
Komprimierung und Dekomprimierung von Bilddaten, welches eine einfache und
flexible Anpassung an Speichergröße, unterschiedliche
Bildauflösungen
und Displaygrößen erlaubt.
-
Diese
Aufgabe wird durch die Merkmale des Patentanspruchs 1 und 8 gelöst.
-
Vorteilhafte
Ausgestaltungen und Weiterbildungen der Erfindung sind in den Unteransprüchen angegeben.
-
Die
Erfindung beruht auf einer Kombination der Pixel-basierten und Vektorbasierten
Technik. Als erstes wird das Bild mit einem Raster belegt. Für jedes
Pixel des Rasters wird zunächst
der Pixelwert, d. h. Farbwert bzw. Helligkeitswert, ermittelt. Anschließend wird
für jeden
Pixel, aus einer zuvor festgelegten Menge von benachbarten Pixeln,
ein weiterer Wert, im folgenden Pixeldifferenzwert genannt, berechnet.
Der Pixeldifferenzwert ergibt sich aus der Differenz des Pixelwerts
eines betrachteten Pixels zu jedem seiner betrachteten Nachbarpixel.
Dieser Wert ist umso höher,
je größer die
Differenz des Pixelwertes zu seinen benachbarten Pixeln ist. Anschließend werden
die Pixeldifferenzwerte der einzelnen Pixel des Bildes absteigend
sortiert. Die für
die Berechnung eines Pixeldifferenzwerts hinzugezogenen Pixel werden
jeweils zu einer Pixelgruppe zusammengefasst. Die so gewonnenen
Pixelgruppen werden entsprechend der absteigenden Sortierung der
Pixeldifferenzwerte, d. h. entsprechend ihrer durch den Pixeldifferenzwert
bestimmten Priorität,
abgespeichert.
-
Es
ergibt sich einen Prioritätenliste,
wobei zuoberst auf der Liste diejenigen Pixelgruppen erscheinen,
deren Pixeldifferenzwert und damit Priorität am größten ist.
-
Die
Pixelwerte der Pixelgruppen können durch
Lauflängencodierung
oder andere bekannte Komprimierungsmethoden, z. B. Zip-Verfahren,
weiter komprimiert werden.
-
Zur
Wiederherstellung des Bildes werden zunächst die Pixelgruppen mit den
höchsten
Pixeldifferenzwerten (Prioritäten)
geladen. Aus jeweils drei sich am nächsten liegenden Pixelgruppen
wird jeweils ein Dreieck gebildet. Dreiecke sind in ihrer Größe skalierbar,
und können
so an unterschiedliche Auflösungen
angepasst werden. Sollen bestimmte Bildbereiche besonders genau wiedergegeben
werden, können
die Pixelgruppen dieser Bereiche mit einer höheren Priorität versehen
werden. Die Fläche der
jeweiligen Dreiecke wird durch einen Farbverlauf, der aus den Farbwerten
der jeweils drei die Ecken des Dreiecks bildenden Pixelgruppen berechnet wird,
ausgefüllt.
-
Bei
Schwarz-Weiß Bildern
wird anstelle der Farbwerte der jeweilige Helligkeitswert der Pixel
bzw. Pixelgruppen betrachtet und ein entsprechender Helligkeitsverlauf
berechnet.
-
Je
mehr Pixelgruppen dargestellt werden, je kleiner werden die Dreiecke
und je genauer kann das Bild rekonstruiert werden.
-
Die
Vorteile des erfindungsgemäßen Verfahrens
liegen in der hohen Skalierbarkeit durch einfache Anpassung an unterschiedliche
Displaygrößen und
der Möglichkeit
einer erhöhten
Auflösung
von interessanten Bereichen eines Bildes durch Priorisierung bestimmter
Bildbereiche.
-
Das
Verfahren ermöglicht
es den Hersteller bzw. Bildverarbeitungsprofis, durch unterschiedliche Priorisierungen
der Pixelgruppen herstellerspezifische Optimierungsroutinen verwenden.
Da jedoch immer die Quellpixelwerte übertragen werden, kann das
Bild aber auch ohne Verwendung der herstellerspezifischen Optimierungsroutinen
wieder erzeugt werden.
-
Ferner
ist eine Erhöhung
der Auflösung
von Details durch Nachladen der interessanten Bildbereiche, anstelle
des Nachladens eines komplett neuen Bildes mit einer anderen Auflösung möglich.
-
Das
Verfahren ist sehr fehlertolerant, da das Bild auch bei Übertragungsfehlern
einzelner Pixelgruppen wieder erzeugt werden kann.
-
Ein
Ausführungsbeispiel
der Erfindung wird anhand der Zeichnungsfiguren näher erläutert. Aus den
Zeichnungen und deren Beschreibung ergeben sich weitere Merkmale,
Vorteile und Anwendungsmöglichkeiten
der Erfindung. Es zeigt:
-
1:
Darstellung eines Bildarrays aus 20 × 21 Pixeln;
-
2:
Darstellung verschiedener Formen von Pixelgruppen;
-
3:
neu generiertes Bildarray mit eingefügten Pixelgruppen in der Bildecke;
-
4:
ausfüllen
der Flächen
zwischen den bereits eingefügten
Pixelgruppen;
-
5:
einfügen
weitere Pixelgruppen und Ausfüllen
der dazwischenliegenden Flächen.
-
Nachfolgend
wird anhand eines exemplarischen Beispiels eine Komprimierung und
Dekomprimierung einer 2 dimensionalen Bilddatei (Bildarray) beschrieben.
-
Folgende
Annahmen werden getroffen:
Die Bildquelle liegt als Bitmap,
d. h. als Bildarray, vor.
-
Jedes
Pixel des Bildarrays wird durch einen 32 Bit Wert (Pixelwert) repräsentiert.
Die 32 Bit sind z. B. in 4 Werte (Transparent, Rot, Grün, Blau)
mit jeweils 8 Bit aufgeteilt.
-
Das
beispielhaft dargestellte Bildarray ist ein Bild mit der Bildbreite
von 20 Pixeln und einer Bildhöhe
von 21 Pixeln. Die Position der Pixel ist durch eine Integer Zahl
festgelegt. Das Bildarray wird in der in 1 gezeigten
Weise von 0 bis 419 durchgezählt. Die
Zahl innerhalb jedes Kastens entspricht der Position des zugehörigen Pixels.
-
Die
Komprimierung des Bildes erfolgt folgendermaßen:
-
Bildarray einlesen
-
Ein
Bild wird in das in 1 gezeigte 20 × 21 Pixel
große
Bildarray eingelesen. Jedes Pixel ist durch seine Position (0 bis
419) und seinen Pixelwert (Farb- bzw. Helligkeitswert) definiert.
-
Pixelgruppen festlegen
-
Als
Nächstes
wird festgelegt, welche benachbarten Pixel eine Pixelgruppe bilden.
Mit p0 ist dabei dasjenige Pixel bezeichnet, das die Position der
Pixelgruppe angibt. Die relative Position der übrigen Pixel, z. B. p1–p4, einer
Pixelgruppe zum Bezugspixel p0 ergibt sich aus der verwendeten Art (Form)
der Pixelgruppe. In 2 sind exemplarisch einige mögliche Formen
von Pixelgruppen dargestellt. Es können sowohl zum Bezugspixel
p0 symmetrische als auch unsymmetrische Pixelgruppen gebildet werden.
Welche Art von Pixelgruppe verwendet wird, ist u.a. von der Art
des Bildmaterials und der angestrebten Kompressionsrate abhängig. In
der Regel ist der zu erreichende Kompressionsfaktor umso größer, je
mehr Pixel eine Pixelgruppe umfasst. Zum kodieren und dekodieren,
d. h. komprimieren und dekomprimieren des Bildes muss die gleiche Form
von Pixelgruppen verwendet werden.
-
In
der weiteren Beschreibung des Verfahrens wird mit der Form der in 2 dick
umrandeten Pixelgruppe (links unten) weitergearbeitet.
-
Prioritätswerte
ermitteln
-
Für jedes
Pixel p0 einer Pixelgruppe wird nun die Priorität in Bezug auf dessen Pixelgruppe
berechnet. Dabei wird jedes Pixel 0–419 des Bildes einmal zum
Bezugspixel p0.
-
Die
Pixel am Bildrand können
eine besondere Behandlung erfahren, z. B. durch Auswahl einer bestimmten
Pixelgruppenform im Randbereich oder Verkleinerung der zu betrachteten
Fläche
(Abschneiden der Randbereiche).
-
Zur
Berechnung der Priorität
kann es verschiedene Rechenmethoden geben. Exemplarisch wird hier
eine lineare Methode verwendet.
-
Dazu
werden die einzelnen Pixelwerte P0, P1, P2, P3 und P4 einer Pixelgruppe
in ihre Farbanteile Rot, Grün
und Blau zerlegt. Jeder dieser Farbwerte wird durch 8 Bit repräsentiert.
Für jede
Farbe eines jeden Pixels P1–P4
wird nun ein Farbdifferenzwert in Bezug auf P0 ermittelt,
z.
B. P0_rot – P1_rot,
P0_rot – P2_rot,
..., P0_blau – P4_blau.
Die absoluten Farbdifferenzwerte werden addiert und durch die Anzahl
der Farben und Anzahl der betrachteten Pixel geteilt. Das Ergebnis
ist ein Prioritätswert
für die
betrachtete Pixelgruppe. Dieser Prioritätswert ist umso höher, je
unterschiedlicher die Farbwerte der einzelnen Pixel der Pixelgruppe
sind.
-
Weitere
Methoden zur Ermittlung des Prioritätswert sind die Benutzung von
Grauwerten oder der Maximalwert einer Farbdifferenz einer Farbe.
Da der Prioritätswert
später
selbst nicht übertragen,
bzw. abgespeichert wird, hat das Verfahren zur Ermittlung des Prioritätswert keinen
direkten Einfluss auf die Dekodierung.
-
Durch
diese Priorisierung wird erreicht, dass Bildbereiche, die einen
großen
Farb- oder Kontrastwechsel aufweisen, wie z. B. Kanten, eine hohe
Priorität
erhalten, und relativ gleichbleibende Bildinhalte, wie z. B. blauer
Himmel, eine Niedrige.
-
Prioritätswerte
sortieren
-
In
diesem Schritt werden die Prioritätswerte der Größe nach
absteigend sortiert. In Abhängigkeit der
Implementierung kann eine Sortierung nach Ermittlung jedes neuen
Prioritätswertes
oder im nachhinein durchgeführt
werden.
-
In
Abhängigkeit
der verfügbaren
Ressourcen können
neben der reinen Priorisierung durch die Farbwerte benachbarter
Pixel auch Abhängigkeiten der
Lage der priorisierten Pixelgruppen herangezogen werden.
-
Ein
Anwendungsfall soll dies verdeutlichen. Betrachtet man auf See einen
Horizont, erscheint dieser wie eine waagerechte Linie. Es ist zu
erwarten, dass die Prioritätswerte
jeder Pixelgruppe entlang diesem Horizont in etwa gleich sind. In
diesem Fall besitzen die am weitesten auseinander liegenden Punkte
der Horizontlinie die größte Aussagekraft.
Durch Übertragung
der äußersten linken
und äußersten
rechten Pixelgruppen des Horizonts ist es schon möglich, diesen
wieder zu rekonstruieren.
-
Eine
weitere Möglichkeit
der Priorisierung liegt in der Höherbewertung
bestimmter Bildbereiche. Ein solcher Bildbereich können zum
Beispiel Gesichter auf Fotos sein. Obwohl Gesichter auf Urlaubsfotos
manchmal nur einen prozentual kleinen Bereich des gesamten Bildes
ausmachen, stehen sie beim Betrachten meist im Mittelpunkt. Ein
solches menschliches Sehverhalten kann durch entsprechende Priorisierung
der Pixelgruppen dieser Bildbereiche (Gesichtsbereiche) berücksichtigt
werden. Ebenso können
die Pixelgruppen im Zentrum des Bildes eine entsprechend höhere Priorisierung
erfahren.
-
Eine
weitere Möglichkeit
der Optimierung besteht in der Tatsache, dass sich benachbarte Pixelgruppen
gegenseitig überlagern.
Durch geschickte Auswahl der Pixelgruppen kann vermieden werden, dass
sich überlagernde
Pixelwerte benachbarten Pixelgruppen wiederholt übertragen werden.
-
Wird
das zu komprimierende Bild direkt mit einer CCD Kamera oder einem
Scanner aufgenommen, besteht prinzipiell die Möglichkeit, aus dem in der Kamera/dem
Scanner vorhandenen, bildbearbeitenden Mikrochip direkt ein nach
Prioritäten
sortiertes Array zu erhalten. Somit wird beim komprimieren ein wesentlicher
Teil des Rechenaufwandes eingespart.
-
Pixelgruppen abspeichern
-
Zunächst werden
einige Kenngrößen des Bildes
abgespeichert. Exemplarisch aufgeführt sind das:
- – Bildbreite
(in Pixel)
- – Bildhöhe (in Pixel)
- – Verwendete
form der Pixelgruppe (nicht notwendig wenn nur eine Form standardisiert
ist)
- – die
4 Pixelgruppen der Bildecken
-
Anschließend werden
die einzelnen Pixelgruppen entsprechend ihrer Priorität abgespeichert, d.
h. Pixelgruppen mit hoher Priorität werden zuerst gespeichert
(und später
auch zuerst ausgelesen).
-
Dazu
wird zunächst
der Positionswert des Bezugspixels p0 der Pixelgruppe abgespeichert.
Anschließend
werden die Pixelwerte P0, P1, P2, P3, P4 abgespeichert.
-
Beispiel:
-
Positionswert
P0, Pixelwerte P0, P1, P2, P3, P4; nächster Positionswert P0 (mit
gleicher oder niedrigerer Priorität), Pixelwerte P0, P1, P2,
P3, P4, ..., nächster
Positionswert P0 (mit geringster Priorität), Pixelwerte P0, P1, P2,
P3, P4.
-
Das
Abspeichern kann durch verschiedene Methoden, die hier nur exemplarisch
angesprochen werden, optimiert werden.
-
Es
kann eine Lauflängencodierung
der Pixelgruppen vorgenommen werden.
-
Z.
B. wenn in einem Bildbereich keine Rotanteile vorkommen, kann dies
anstelle von 8 Bit (rot) nur mit z. B. 2 Bit übertragen werden, oder es kann die
Anzahl der führenden
Nullen ausgenutzt werden.
-
Ferner
können
allgemein übliche
Komprimierungsmethoden, z. B. Zip- Format, verwendet werden.
-
Durch
Festlegung eines Grenzwertes für
die Priorisierung kann eine bestimmte Qualität gewährleistet werden. Z. B. kann
ein Grenzwert für
die Pixeldifferenzwerte festgelegt werden unterhalb dessen die zugeordnete
Pixelgruppe immer den niedrigsten Prioritätswert bekommt.
-
Bei
einer Festlegung einer maximalen Dateigröße ist durch die Priorisierung
sichergestellt, dass die wesentlichsten Bildinformationen zuerst
abgespeichert werden.
-
Dekomprimieren des Bildes:
-
Neues Bildarray generieren
-
Zur
Generierung eines neuen Bildes werden zunächst die Kenngrößen des
Bildes eingelesen und ausgewertet.
-
Exemplarisch
sind dies Bildbreite, Bildhöhe und
Form der Pixelgruppe. Aus diesen Werten wird dann ein zunächst leeres
Bildarray vergleichbar mit der Darstellung in 1 erzeugt.
Stimmen die Bildhöhe
und Bildbreite zwischen dem Ursprungsbild und der nun gewünschten
Darstellung (z. B. begrenztes PDA Display oder hochauflösender Bildschirm)
nicht überein,
muss entsprechend skaliert werden. Dazu werden zunächst Umrechnungsfaktoren
ermittelt (Bildbreite_Orginal/Bildbreite_Display und Bildhöhe Orginal/Bildhöhe_Display).
Diese Faktoren können benutzt
werden um den Positionswert von dem Originalbild in den Positionswert
des neuen Displays umzurechnen.
-
Eck-Pixelgruppen einfügen
-
Wie
in 3 dargestellt ist, werden entsprechend der Reihenfolge
der priorisierten Pixelgruppen diese nun eingelesen. Zunächst werden
die 4 Pixelgruppen der Ecken in das neu generierte Bildarray eingetragen.
Die Position (p0) der jeweiligen Pixelgruppe ist durch die schwarz
unterlegten Felder 21, 38, 381 bzw. 398 bestimmt. Dieser Positionswert
(p0) liegt als Integerwert in der abgespeicherten Datei vor. Anschließend können die
zur jeweiligen Pixelgruppe gehörenden,
dunkelgrau grau unterlegten Pixelwerte (p1–p4) in das neue Bildarray
eingetragen werden. Die dazwischen liegenden, hellgrau markierten
Pixelwerte lassen sich dann aus den dunkelgrau und schwarz markierten
Feldern berechnen. Zur Berechnung werden zunächst die bekannten Pixelwerte
in ihre Bestandteile Rot, Grün
und Blau zerlegt. Anschließend
wird der Mittelwert jeder Farbe berechnet, z. B. Pixel(22) = (Pixel(2)
+ Pixel(21) + Pixel(42))/3).
-
Flächen ausfüllen
-
Nun
werden die vorhandenen Pixelgruppen durch Linien miteinander verbunden.
Es ergeben sich Dreiecke, dessen Ecken durch die entsprechenden Pixelgruppen
definiert sind. Exemplarisch soll dies an der Linie zwischen Pixelposition
2 und Pixelposition 17 verdeutlicht werden. Der Farbverlauf der Linie
wird anhand der Farbwerte der Pixel 2 und 17 berechnet. Zunächst wird
die Anzahl der Pixel zwischen diesen beiden Positionen ermittelt,
im Beispiel 14. Anschließend
wird für
jede Farbe (Rot, Grün, Blau)
die Farbdifferenz ermittelt, z. B. Farbwert an Position 2 = 2; Farbwert
an Position 17 = 30 ergibt Farbdifferenz von 28). Eine Farbwertsteigerung
pro Pixel – vom
Pixel 2 zum Pixel 17 – errechnet
sich dann aus Farbdifferenz/Anzahl (Im Beispiel 28/14 = 2).
-
Die
noch übrigen
Flächen
werden durch Zeichnen von horizontalen Linien ausgefüllt, z.
B. von Position 63 nach Position 74, von Position 82 nach Position
93, usw. Auch hier wird ein vorläufiger
Farbverlauf zwischen den Punkten wie oben angegeben berechnet.
-
Wie 5 zeigt,
ergibt jede weitere hinzufügte
Pixelgruppe weitere Dreiecke die entsprechend ausgefüllt werden
können.
Nachdem zunächst
die gesamte Fläche
durch Nutzung der 4 Eckpunkte (21, 38, 398, 381) ausgefüllt wurde,
kann nun mit jeder weiteren Pixelgruppe die Auflösung verfeinert werden. Das
Hinzufügen
der Pixelgruppe 87 führt
zu 4 Dreiecken mit den Bezugspunkten (21, 38, 87), (21, 87, 381),
(381, 87, 398), (398, 78, 38). Wird nun innerhalb eines solchen
Dreieckes, z. B. 87, 381, 398, eine weitere Pixelgruppe (247) eingefügt entstehen
3 neue Dreiecke (247, 381, 398), (247, 87, 381) und (247, 87, 398).
Jede neue Pixelgruppe erzeugt somit 3 neue Dreiecke, die ausgefüllt werden
können.
Je mehr Pixelgruppen eingefügt
sind, d. h. je mehr Dreiecke gebildet werden, desto näher kommt
der berechnete Farbverlauf dem tatsächlichen Farbverlauf des Bildes.
Da ab nun immer nur neue Dreiecke entstehen, können für die Berechnungen optimierte
Verfahren verwendet werden. Ferner können die jeweils 3 neu entstehenden
Dreiecke parallel berechnet werden, um die Bearbeitungsgeschwindigkeit
zu steigern. Zusätzliche
Möglichkeit
der Parallelisierung entsteht dadurch, wenn neue Pixelgruppen in
unterschiedlichen Regionen des Bildes hinzugefügt werden.