-
Wenn
Daten übertragen
oder gespeichert werden müssen,
werden sie gewöhnlich
zuerst komprimiert, um die Übertragungszeit
oder den Speicherbedarf zu verringern. Dies gilt besonders für Bilddaten,
die aus vier Farbseparationen von 8-Bit Pixeln bestehen können.
-
Ein
Kompressionsverfahren ist "hierarchische
Vektorquantisierung" (HVQ),
wo ein Block von Daten in einer Anzahl von Schritten auf ein einziges Codewort
reduziert werden kann. Dieses Verfahren wird in US-Patent Nr. 5,602,589
beschrieben und ist hierin durch Verweis eingeschlossen. Diese Prozedur
kann am deutlichsten durch die Verwendung eines nummerischen Beispiels
in Verbindung mit 1a dieses
Patents beschrieben werden. Es sei angenommen, dass ein 2 × 4 Pixelblock,
8 Bit pro Pixel, in eine 9-Bit Zahl zu komprimieren ist. Zuerst
wird jedes Pixelpaar an eine Stufe 1 Zuordnungstabelle (LUT), die
9-Bit Codewörter
enthält,
angelegt, wobei jedes Codewort mit einem 2-Pixel Bitmuster verbunden
ist. Die Tabelle ist so aufgebaut, dass, wenn eine genaue Übereinstimmung
der eingegebenen Pixeln nicht vorhanden ist, stattdessen ein mit
der nächsten Übereinstimmung
verbundenes Codewort ausgegeben wird. Der schließliche Ausgang dieser Stufe
1 sind vier Codewörter,
wobei jedes die nächste Übereinstimmung
mit dem Bitmuster der zwei Eingangspixeln darstellt. Da die genaue Übereinstimmung
oft nicht möglich
ist, ist diese Kompression zu einem gewissen Grad inhärent verlustbehaftet.
Der Ausgang der ersten Stufe sind vier 9-Bit Codewörter.
-
Angenommen,
dieses Ausmaß an
Kompression ist nicht ausreichend, werden diese vier Codewörter, die
jeweils das Bitmuster eines 1 × 2
Pixelblocks darstellen, als Nächstes
an zwei Stufe 2 Tabellen angelegt, woraus sich insgesamt zwei 9-Bit Ausgangs-Codewörter ergeben,
die jeweils das Bitmuster eines 2 × 2 Pixelblocks darstellen.
Wenn die Kompression noch immer nicht ausreichend ist, werden diese
zwei an die Stufe 3 Tabelle angelegt, um das endgültige Ausgangswort
zu liefern, das mit einem 2 × 4
Pixelblock verbunden ist. Jetzt kann man sehen, dass dieses Verfahren
hierarchisch ist, weil eine Vielzahl von Stufen verwendet wird,
es Vektoren enthält,
da die Eingangspixeln eine Richtungsbeziehung miteinander haben,
und quantisiert ist, weil eine Anzahl von Pegeln implementiert werden
kann, um jeden Grad an Kompression zu erreichen.
-
Zur
Dekompression wird jedes Codewort einfach an eine 256k × 64 Bit
LUT angelegt, die das Bitmuster des ganzen 8-Pixel Blocks ausgibt.
-
Druckhinweise
werden manchmal in einem Drucksystem am Scanner oder Textgenerator erzeugt,
um verschiedenen Druckelementen den Typ von Daten anzugeben, die
empfangen werden. Das System wird dann in der Lage sein, seine Kompressionselemente
für die
Daten zu optimieren. Ein Problem ist, dass die Hinweise auf Datenleitungen,
getrennt von den Daten, geliefertwerden, was das System kompliziert
macht. Wenn andererseits die Hinweise in dem Datenstrom enthalten
sind, würde
es ein Problem geben, sie herauszutrennen, und außerdem würde das
Datenkompressionsverhältnis
leiden, wenn die Hinweise in den Ausgabedaten enthalten wären.
-
Nach
einem Aspekt der vorliegenden Erfindung umfasst einen Kompressor
des Typs, der eine Serie von Datenwörtern durch Komprimieren mehrerer
Datenwörter
in ein Codewort unter Verwendung hierarchischer Vektorquantisierung
(HVQ) und dann unter Verwendung eines verlustlosen Musterübereinstimmungs-Kompressors
komprimiert, um die Folge von Codewörtern zu komprimieren, eine
Einrichtung zum Hinzufügen
eines Druckhinweises zu dem Ende eines Codewortes, bevor das Codewort
an den verlustlosen Kompressor angelegt wird.
-
Nach
einem zweiten Aspekt der vorliegenden Erfindung umfasst ein Verfahren
zum Komprimieren einer Serie von Datenwörtern das Komprimieren mehrerer
Datenwörter
in ein Codewort unter Verwendung hierarchischer Vektorquantisierung
(HVQ) und dann unter Verwendung eines verlustlosen Musterübereinstimmungs-Kompressors,
um die Codewortfolge zu komprimieren, und ist gekennzeichnet durch
Hinzufügen
eines Druckhinweises zu dem Ende eines Codewortes, bevor das Codewort
an den verlustlosen Kompressor angelegt wird.
-
Diese
Erfindung löst
das Problem durch Verwenden verlustbehafteter und verlustloser Komressoren
in Serie. Der verlustbehaftete Kompressor komprimiert die Daten
und fügt
dann den Daten den Hinweis hinzu, was die Datenausgabe länger macht. Dem
folgt jedoch ein LZ-Kompressor,
der nach vorher venrvendeten Datenmustern sucht. Für den Fall, dass
die augenblicklichen und vorangehenden Datenmuster den gleichen
Hinweis haben, was fast immer der Fall ist, dann macht die Länge des
Musters nichts aus, und das Kompressionsverhältnis wird nicht wesentlich
beeinflusst werden. Ein Kompressor, der HVQ verwendet, wird für die verlustbehaftete
Stufe benutzt.
-
Der
Kompressor empfängt
daher nicht nur Druckhinweise, die verwendet werden, um zu bestimmen,
welcher Kompressionsprozess zu verwenden ist, sondern schließt auch
Druckhinweise in die komprimierte Ausgabe zur Verwendung durch nachfolgende
Druckstufen ein. Das Einschließen
beeinflusst durch die Verwendung einer verlustbehafteten und einer
verlustlosen Kompressionsstufe in Reihe das Kompressionsverhältnis nicht
wesentlich.
-
Ein
Beispiel eines erfindungsgemäßen Kompressors
und Verfahrens wird nun mit Verweis auf die begleitenden Zeichnungen
beschrieben.
-
1 ist ein HVQ-Coder, der
einen parallellen Fehlerkanal hat.
-
2 ist der Decoder für die Anordnung
von 1.
-
3 ist eine Einkanal-Anordnung
zum Codieren eines in seine höchst-
und niedrigsiwertigen Bits geteilten Pixels.
-
4 ist eine Einkanal-Anordnung
zum Decodieren eines in seine höchst-
und niedrigstwertigen Bits geteilten Pixels.
-
5 ist eine Zweikanal-Anordnung
zum Codieren eines in seine höchst-
und niedrigstwertigen Bits geteilten Pixels.
-
6 ist ein Decoder für den Coder
von 5.
-
7 zeigt drei Schritte zur
Drehung oder Spiegelabbildung eines Bildes unter Verwendung von
HVQ-Kompression.
-
8 zeigt eine Grenze zwischen
Blöcken verschiedener
Größen.
-
9 zeigt eine Grenze zwischen
Blöcken der
gleichen Größe.
-
Das
Grund-HVQ-System kann durch Hinzufügen eines Fehlerkanals, wie
in 1 gezeigt, verbessert
werden. In dem oberen Kanal wird die Graustufen-Bytemap 16 in
der üblichen
Weise an einen HVQ-Coder 10 angelegt, der Ausgang wird
in einem LZ-Coder 11 verlustlos komprimiert, und das Ergebnis
wird an den Decoder gesendet, gewöhnlich in der Form von 8 bis
10-Bit Wörtern.
-
Des
Weiteren wird der Ausgang des HCQ-Coders an einen Decoder 12 in
einem Scanline-Format
gesendet, der eine Version der ursprünglichen Bytemap erzeugt, die
sich wegen der durch den verlustbehafteten Coder möglicherweise
eingebrachten Fehler von der ursprünglichen unterscheiden kann.
Die zwei Bytemaps werden dann Pixel für Pixel subtrahiert 13, um
Fehlerglieder zu erzeugen, die, wenn dem Ausgangscodewort hinzugefügt, die ursprüngliche
Bytemap erzeugen werden. Diese Subtraktion kann auch mittels eines
Exklusiv-ODER vorgenommen werden, was einfacher und schneller ist
und kein Vorzeichenbit benötigt.
Diese Fehlerglieder, jedes eine bezeichnete Größe 8 Bit breit oder weniger,
können
dann in einem LZ-Coder 15 komprimiert und parallel mit
dem ursprünglichen
Ausgang an den Deco der gesendet werden. Je größer das Fehlerglied, umso kleiner
wird das Kompressionsverhältnis
sein. In der Praxis sind kleine Fehler visuell nicht erfassbar.
Um die Verschlechterung des Kompressionsverhältnisses zu begrenzen, kann
das Fehlerglied im Quantisierer 14 auf ein paar höchstwertige Bits,
z. B. drei, begrenzt werden. Normalerweise wird der Fehlerbetrag
für ein
Pixel nicht groß genug
sein, um sich in den wenigen MSBs zu zeigen, wobei es in diesem
Fall überhaupt
kein Fehlerglied geben wird.
-
Der
Decoder für
quantisierte Fehler wird in 2 gezeigt.
Die komprimierten Codewörter
werden im Decoder 21 LZ-decodiert und im Decoder 22 HVQ-decodiert,
um ein Glied für
den Addierer 23 zu erzeugen. Die komprimierten quantisierten
Fehler werden im Decoder 24 LZdecodiert und als das andere
Glied an den Addierer 23 angelegt, dessen Ausgang Ausgangs-Video
ist. Der Addierer 23 kann entweder ein Addierer sein, der
ein Vorzeichenbit und 7 Bits addiert, oder ein Exklusiv-ODER sein,
wenn eines benutzt wurde, um das Fehlerglied in dem Coder zu erzeugen.
-
3 zeigt die Anordnung, wenn
ein einzelnes Codewort 31 in höchts- und niedrigstwertige
Teile 32, 33 zerlegt wird, und wo nur die niedrigstwertigen Bits
komprimiert werden. In diesem Fall werden die Bits 0 bis 4 durch
den verlustbehafteten Kompressor 35 geschickt, nicht aber
die Bits 5 bis 7. Beide werden dann mittels verlustloser LZ-Kompression
komprimiert und an den in 4 gezeigten
Decoder ausgegeben. Hier werden wiederum beide Kanäle LZ-dekomprimiert,
während
nur die LSBs HVQ-decodiert werden. Die zwei resultierenden Teile
werden dann miteinander exklusiv-Oder-verknüpft 44, um an die
Decodierungs-Zuordnungstabelle angelegt zu werden.
-
5 ist ein System, wo ein
einzelnes Pixel in ein niedrigstwertiges und ein höchstwertiges
Segment zerlegt wird, und wo ein getrennter und verschiedener Kompressionsprozess
für jedes
Segment venrwendet wird, wobei die niedrigstwertigen Bits mehr komprimiert
werden. Das ursprüngliche
Pixel wird in seine höchstwertigen
Bits 52 und niedrigstwertigen Bits 53 zerlegt.
Das Ergebnis ist, dass die höchstwertigen
Bits, die die wichtigsten sind, weniger komprimiert werden, während die
Kompression für die
niedrigstwertigen Bits ein besseres Kompressionsverhältnis hat.
Eine programmierbare Zuordnungstabelle könnte benutzt werden, um das
Eingangspixel in irgendwelche zwei Segmente anders als die gezeigte
3–5 Teilung
zu zerlegen.
-
6 ist der Decoder für den Coder
von 5. Die zwei komprimierten
Ausgänge
von 5 werden an LZ-Decoder 61, 62 angelegt
und HVQ- 63, 64 decodiert. Dann werden beide an
ein Exklusiv-ODER-Gatter 65 angelegt, um das ganze Pixel zusammenzusetzen.
Wenn der Coder irgendeine andere Kombination von Codern benutzte,
würde der Decoder
natürlich
die gleiche Form von Decodierung verwenden. Das heißt allgemeiner,
die Datenwörter in
einer Kette können
in mehr oder weniger bedeutsame Bits geteilt werden, um zwei parallele
Ketten zu erzeugen, und dann unter Verwendung von irgendwelchen
zwei Kompressionsverfahren komprimiert werden, wo die größere Kompression
auf die weniger bedeutsamen Bits angewandt wird.
-
HVQ-Kompression
kann leicht an Bilddrehung und Spiegelabbildung, wie in 7 gezeigt, angepasst werden.
Der Prozess wird hier am Beispiel eines Originalbildes gezeigt,
das vier Pixel hoch und sechzehn Pixel breit ist und 90° im Uhrzeigersinn
gedreht und gespiegelt abgebildet werden muss.
-
Schritt
1 ist der übliche
Kompressionsprozess zum Reduzieren der acht 8-Pixel Segmente auf acht
Codewörter
Cw1 bis Cw8. Schritt 2 ist der Schritt zu Umordnen der Codewörter in
die gedrehte und spiegelbildliche Reihenfolge. Diese Hardware kann in
der Form von Verdrahtung sein, wo das zweite Wort ein, z. B. Cw2,
mit dem dritten Wort aus, wie gezeigt, verbunden ist. Schritt 2
kann mehrere Verdrahtungssätze
haben, wobei jeder Satz eine andere Drehung liefert. Schließlich benutzt
der Decodierungsschritt 3 eine Tabelle, um ein Pixelmuster für jedes Segment
zu erzeugen, das richtig ausgerichtet ist. Hier können wiederum
mehrere Tabellen verwendet werden, um verschiedene Ausrichtungen
zu erzeugen.
-
Druckhinweise
können
in die ursprünglichen Daten,
die von dem Benutzer in der ursprünglichen Seitenbeschreibungssprache
geliefert werden, eingeschlossen werden, um dem Drucker anzugeben, wie
die Daten am besten zu drucken sind. Ein Hinweiswort kann z. B.
zwei Bit lang sein und eine von vier Möglichkeiten angeben, dass die
folgenden Daten Text, Halbton, Grafik usw. sind. Wenn z. B. der Drucker
Daten empfängt,
die als eine computererzeugte Grafik hervorgebracht wurden, kann
er ein anderes Halbtanraster verwenden als er es würde, wenn
die ursprünglichen
Daten aus einer Fotografie eingerastert wurden.
-
Druckhinweise
können
jedem HVQ-Kanal hinzugefügt
werden, wie in 5 gezeigt.
Angenommen, dass für
jeden 4-Pixel Block, der in den HVQ-Coder 54 gelangt, ein
Codewort mit der Länge von
9 Bits erzeugt wird, enthalten in zwei 8-Bit Bytes, sodass die ersten
8 Bits in dem ersten Byte enthalten sind, und das letzte Bit in
dem zweiten Byte enthalten ist. Dann wird der 2-Bit Hinweis hinzugefügt. Jetzt
ist jedes Codewort plus Hinweis 11 Bits, noch immer enthalten in
zwei Bytes. Der LZ-Coder schaut auf eine Kette von Bytes, vielleicht
256 Bytes lang, und bestimmt die Stelle und Größe der allerletzten identischen
Musterübereinstimmung.
Für den
Fall, dass sich der Hinweis innerhalb der Kette einmal oder zweimal än dert, wird
es einen etwas verringerten Betrag an Kompression verglichen mit
dem Betrag geben, der ohne Hinweise entstanden wäre. Für den Fall, dass sich der Hinweis
während
dieser Zeit nicht ändert,
wird es jedoch gar keine Abnahme in der Kompression geben. Das Ergebnis
ist, dass Druckhinweise nach einem HVQ-Kompressor, aber vor dem
verlustlosen Kompressor mit sehr kleiner Wirkung auf das Kompressionsverhältnis geliefert
werden können.
Auf der Ausgangsseite, nachdem die Codewörter LZ-dekomprimiert sind,
aber bevor sie decodiert werden, können die Hinweise zum späteren Gebrauch
extrahiert werden.
-
Die
Verluste eines HVQ-Kompressors können
weiter minimiert werden, indem Codewörter und Ausgangsdatenmuster
gewählt
werden, die die besten Chance haben, mit den tatsächlichen
Eingangsdaten übereinzustimmen.
Wenn Textpixeln in 4 × 2 Pixel
Gruppen codiert werden, die vier Eingangspixel in einer Linie schwarz,
dunkelgrau, hellgrau und weiß sind,
und das Eingangsvideo eingescannter Text war, waren die Daten höchstwahrscheinlich
ursprünglich eine
Grenze zwischen einem schwarzen Buchstaben und einem weißen Zwischenraum,
sodass das Ausgangspixelmuster schwarz, schwarz, weiß, weiß sein könnte. Wenn
andererseits die ursprünglichen
Eingangsdaten ein eingescannte computererzeugte Grafik war, ist
es wahrscheinlicher, dass die vier Pixeln eine sanfte Abnahme in
der Dichte von Schwarz nach Weiß sind.
Die tatsächliche
Festlegung der Coder-Codewörter
und Muster in der Decoder-Zuordnungstabelle wird durch statistische
Analyse getroffen. Eine repräsentative
Gruppe von Text- und Grafikdokumenten wird durch ein Testprogramm
geleitet, und für
jeden Typ werden die besten Werte erzeugt.
-
Eine
Komplikation tritt auf, wenn eine Grenze durch einen eingegebenen
Pixelblock läuft,
in welchem Fall weder Text- noch Grafikwerte für den ganzen Block verwendet
werden können.
Die Lösung
ist, einen dritten Satz von Codewörtern und Mustern zuzuführen, die
spezifisch für
diese Grenzbedingung erzeugt werden. In diesem Fall würde ein
Satz von Dokumenten, die sowohl Text als auch Grafik enthalten,
analysiert werden, um einen Satz von Mustern zu erzeugen, der benutzt
werden würde,
wenn eine gemischte Grenzbedingung innerhalb des Blocks festgestellt
wird.
-
Die
Grenzbedingung wird durch Beobachten der Druckhinweise erfasst.
Zum Beispiel wird ein rechteckiges eingescanntes Bild typischerweise
auf einer Textseite durch seine X-Y-Koordinaten örtlich bestimmt. Wenn der Strahl
des Rasterausgabescanners innerhalb dieser Koordinaten ist, werden
die Druckhinweise dem Drucker angeben, welche Codewörter, Tabellen
und Halbtonraster zu verwenden sind. Wenn sich z. B. der Hinweis
vom Bild zum Text in dem Block ändert,
dann weiß der
Decoder, dass innerhalb des Blocks eine Grenze vorhanden ist.
-
In
allen Fällen
muss die Blockgröße beibehalten
werden. 8 ist ein Beispiel
eines Übergangs
zwischen Text und Halbton. Da in HVQ-Codern verschiedene Blockgrößen für verschiedene
Arten von Daten verwendet werden können, wird die Blockgröße für den Text
hier als 2 × 2
Pixel gezeigt, um gößere Kantendetails
zu erlauben, während
die Blockgröße für Halbton
als 4 × 2
gezeigt wird, um höhere
Kompression zu gestatten.
-
Wenn
innerhalb eines 2 × 2
Pixel Blocks eine Grenze vorhanden ist, wird dieser Block unter
Verwendung von Grenzwerten codiert und decodiert. Außerdem werden
alle Halbtonpixeln rechts von der Grenze, z. B. Pixel 81, wenn ertordelich,
auch als Grenzpixeln behandelt, sodass alle übrigen Pixeln rechts von der
Grenzlinie in 4 × 2
Pixel Blöcken
liegen werden. Desgleichen werden in 9,
die eine Grenze zwischen 4 × 2
Pixel Blöcken
von Text und Halbton zeigt, 2 × 2
Pixel Grenzblöcke
verwendet, sodass alle übrigen
Blöcke
4 × 2
sein werden.