5.10. Bitsgewijze bewerkingen

De rekenkundige bewerkingen op de vorige pagina werken op pixelwaarden – de gehele helderheden of de gepakte kleurwoorden. Bitsgewijze bewerkingen werken één niveau lager, op de afzonderlijke bits binnen die waarden. Voor binaire afbeeldingen, waar elke pixel slechts één bit is, zijn de bitsgewijze bewerkingen de natuurlijke rekenkunde.

5.10.1. De bitsgewijze familie

De Image-klasse stelt de volledige set van twee-invoer bitsgewijze bewerkingen beschikbaar:

Elk werkt per bit op elke byte van de buffers van beide afbeeldingen. Op een binaire afbeelding, waar elke byte acht pixels bevat, draait de bewerking op acht pixels per verwerkte byte. Op een grijswaarden- of kleurenafbeelding draait deze op elke bit van elk kanaal.

Drie waarheidstabellen voor de AND-, OR- en XOR-bewerkingen naast elkaar. Elke tabel heeft vier rijen voor de invoer- combinaties 0-0, 0-1, 1-0, 1-1 en kolommen met de labels A, B en resultaat. Onder de waarheidstabellen zijn twee kleine binaire afbeeldingen A en B getekend als rasters van zwarte en witte cellen, met het resultaat van het AND-en ervan rechts getoond als een raster dat alleen die cellen behoudt die in beide wit waren.

Boven: de AND-, OR- en XOR-waarheidstabellen – de bitniveausemantiek van elke bewerking. Onder: twee binaire afbeeldingen A en B en het resultaat van A.b_and(B), waar het resultaat alleen de posities behoudt die in beide invoeren aan stonden.

5.10.2. Masks combineren

Het allergebruikelijkste gebruik van deze bewerkingen is het combineren van masks. Een mask is een binaire afbeelding die, positie voor positie, aangeeft of aan een bepaalde voorwaarde is voldaan. Twee masks die verschillende voorwaarden beschrijven, combineren via een van de bitsgewijze bewerkingen tot een enkele mask die een samengestelde voorwaarde beschrijft:

b_and() produceert een mask waarvan de posities alleen aan staan wanneer beide invoer-masks op die positie aan stonden – de natuurlijke “en” van twee voorwaarden. Een voorgrond-mask combineren met de uitvoer van een drempelwaardedoorgang via b_and beperkt de matches van de drempelwaarde tot de voorgrond.

b_or() produceert een mask waarvan de posities aan staan wanneer een van beide invoer-masks aan stond – de natuurlijke “of”. Twee gedrempelde uitvoeren samen OR-en produceert een enkele mask die alles dekt wat met een van twee kleurbereiken overeenkwam.

b_xor() produceert een mask waarvan de posities aan staan wanneer precies één invoer-mask aan stond. Nuttig voor het detecteren van posities waar twee masks het oneens zijn – de posities waar de drempelwaarde-uitvoer tussen twee frames veranderde, het symmetrische verschil tussen twee referentie-masks, dat soort dingen.

De genegeerde varianten – b_nand(), b_nor(), b_xnor() – produceren het complement van hun niet-genegeerde tegenhangers. Ze zijn nuttig wanneer de natuurlijke manier om een voorwaarde te beschrijven “geen van beide” of “niet beide” is – niet gangbaar, maar het is goed te weten dat ze bestaan zodat de negatie niet hoeft te worden samengesteld door een AND te laten volgen door een aparte invert().

5.10.3. Bitsgewijs op niet-binaire afbeeldingen

De bitsgewijze bewerkingen draaien ook op grijswaarden- en kleurenafbeeldingen. Ze zijn daar het nuttigst wanneer de afbeelding binair-achtige inhoud bevat – een grijswaardenframe waarvan de pixels allemaal 0 of 255 zijn, een RGB565-frame met alleen volledig zwarte en volledig witte pixels – waar AND, OR en XOR dezelfde combinaties geven als op een echte binaire afbeelding. Voor afbeeldingen die het volledige waardenbereik beslaan, passen de rekenkundige bewerkingen op de vorige pagina meestal beter.