5.10. Bitweise Operationen

Die arithmetischen Operationen auf der vorherigen Seite arbeiten mit Pixel-Werten – den ganzzahligen Helligkeiten oder den gepackten Farbwörtern. Bitweise Operationen arbeiten eine Ebene tiefer, auf den einzelnen Bits innerhalb dieser Werte. Für binäre Bilder, bei denen jedes Pixel nur ein Bit ist, sind die bitweisen Operationen die natürliche Arithmetik.

5.10.1. Die bitweise Familie

Die Image-Klasse stellt die vollständige Menge der bitweisen Zwei-Eingaben-Operationen bereit:

Jede operiert bitweise auf jedem Byte der Puffer beider Bilder. Bei einem Binärbild, bei dem jedes Byte acht Pixel enthält, läuft die Operation pro verarbeitetem Byte auf acht Pixeln. Bei einem Graustufen- oder Farbbild läuft sie auf jedem Bit jedes Kanals.

Drei Wahrheitstabellen für die Operationen AND, OR und XOR nebeneinander. Jede Tabelle hat vier Zeilen für die Eingabe- kombinationen 0-0, 0-1, 1-0, 1-1 und Spalten mit den Beschriftungen A, B und Ergebnis. Unter den Wahrheitstabellen sind zwei kleine Binärbilder A und B als Gitter aus schwarzen und weißen Zellen gezeichnet, wobei das Ergebnis ihrer AND-Verknüpfung rechts als Gitter dargestellt ist, das nur die Zellen behält, die in beiden weiß waren.

Oben: die Wahrheitstabellen für AND, OR und XOR – die Bit-Ebenen-Semantik jeder Operation. Unten: zwei Binärbilder A und B und das Ergebnis von A.b_and(B), bei dem das Ergebnis nur die Positionen behält, die in beiden Eingaben aktiviert waren.

5.10.2. Masken kombinieren

Die mit Abstand häufigste Verwendung dieser Operationen ist das Kombinieren von Masken. Eine Maske ist ein Binärbild, das Position für Position angibt, ob eine bestimmte Bedingung erfüllt ist. Zwei Masken, die unterschiedliche Bedingungen beschreiben, lassen sich durch eine der bitweisen Operationen zu einer einzigen Maske kombinieren, die eine zusammengesetzte Bedingung beschreibt:

b_and() erzeugt eine Maske, deren Positionen nur dann aktiviert sind, wenn beide Eingabemasken an dieser Position aktiviert waren – das natürliche „Und“ zweier Bedingungen. Das Kombinieren einer Vordergrundmaske mit der Ausgabe eines Schwellenwert-Durchlaufs über b_and beschränkt die Treffer des Schwellenwerts auf den Vordergrund.

b_or() erzeugt eine Maske, deren Positionen immer dann aktiviert sind, wenn eine der beiden Eingabemasken aktiviert war – das natürliche „Oder“. Das ODER-Verknüpfen zweier mit Schwellenwerten versehener Ausgaben erzeugt eine einzige Maske, die alles abdeckt, was einem der beiden Farbbereiche entsprach.

b_xor() erzeugt eine Maske, deren Positionen immer dann aktiviert sind, wenn genau eine Eingabemaske aktiviert war. Nützlich, um Positionen zu erkennen, an denen zwei Masken voneinander abweichen – die Positionen, an denen sich die Schwellenwert-Ausgabe zwischen zwei Einzelbildern geändert hat, die symmetrische Differenz zwischen zwei Referenzmasken, solche Dinge.

Die negierten Varianten – b_nand(), b_nor(), b_xnor() – erzeugen das Komplement ihrer nicht negierten Gegenstücke. Sie sind nützlich, wenn die natürliche Art, eine Bedingung zu beschreiben, „keines von beiden“ oder „nicht beides“ lautet – nicht häufig, aber es lohnt sich zu wissen, dass es sie gibt, damit die Negation nicht durch das Verketten eines AND mit einem separaten invert() zusammengesetzt werden muss.

5.10.3. Bitweise Operationen auf nicht-binären Bildern

Die bitweisen Operationen laufen auch auf Graustufen- und Farbbildern. Dort sind sie am nützlichsten, wenn das Bild binärähnlichen Inhalt enthält – ein Graustufen-Einzelbild, dessen Pixel alle 0 oder 255 sind, ein RGB565-Einzelbild mit nur vollständig schwarzen und vollständig weißen Pixeln – wo AND, OR und XOR dieselben Kombinationen ergeben, die sie auf einem echten Binärbild ergeben würden. Für Bilder, die den vollen Wertebereich umfassen, passen die arithmetischen Operationen auf der vorherigen Seite normalerweise besser.