5.10. Bitenkénti műveletek

Az előző oldalon tárgyalt aritmetikai műveletek a képpontértékeken dolgoznak – az egész szám fényességeken vagy a csomagolt színszavakon. A bitenkénti műveletek egy szinttel lejjebb dolgoznak, az ezeken az értékeken belüli egyes biteken. Bináris képeknél, ahol minden képpont csupán egyetlen bit, a bitenkénti műveletek a természetes aritmetika.

5.10.1. A bitenkénti család

Az Image osztály a kétbemenetes bitenkénti műveletek teljes halmazát kínálja:

Mindegyik bitenként működik mindkét kép pufferének minden bájtján. Egy bináris képen, ahol minden bájt nyolc képpontot tartalmaz, a művelet minden feldolgozott bájtonként nyolc képponton fut. Egy szürkeárnyalatos vagy színes képen minden csatorna minden bitjén fut.

Három igazságtábla az ÉS, VAGY és XOR műveletekhez egymás mellett. Minden táblának négy sora van a 0-0, 0-1, 1-0, 1-1 bemeneti kombinációkhoz, és A, B, valamint eredmény címkéjű oszlopai. Az igazságtáblák alatt két kis bináris kép, A és B, fekete és fehér cellák rácsaként rajzolva, a kettő ÉS-eléséből származó eredménnyel jobbra, olyan rácsként, amely csak a mindkettőben fehér cellákat tartja meg.

Felül: az ÉS, VAGY és XOR igazságtáblák – az egyes műveletek bitszintű szemantikája. Alul: két bináris kép, A és B, valamint az A.b_and(B) eredménye, ahol az eredmény csak azokat a pozíciókat tartja meg, amelyek mindkét bemenetben be voltak kapcsolva.

5.10.2. Maszkok kombinálása

E műveletek messze leggyakoribb felhasználása a maszkok kombinálása. A maszk egy bináris kép, amely pozícióról pozícióra megmondja, hogy teljesül-e valamilyen feltétel. Két, különböző feltételeket leíró maszk egyetlen, összetett feltételt leíró maszkká kombinálható a bitenkénti műveletek egyikén keresztül:

A b_and() olyan maszkot állít elő, amelynek pozíciói csak akkor vannak bekapcsolva, ha mindkét bemeneti maszk be volt kapcsolva azon a pozíción – két feltétel természetes „és”-e. Egy előtér-maszk kombinálása egy küszöbölési menet kimenetével a b_and segítségével a küszöb találatait az előtérre korlátozza.

A b_or() olyan maszkot állít elő, amelynek pozíciói bekapcsolva vannak, valahányszor bármelyik bemeneti maszk be volt kapcsolva – a természetes „vagy”. Két küszöbölt kimenet VAGY-olása egyetlen maszkot eredményez, amely lefed bármit, ami a két színtartomány bármelyikére illeszkedett.

A b_xor() olyan maszkot állít elő, amelynek pozíciói bekapcsolva vannak, valahányszor pontosan egy bemeneti maszk volt bekapcsolva. Hasznos olyan pozíciók észleléséhez, ahol két maszk eltér – azok a pozíciók, ahol a küszöbkimenet két képkocka között megváltozott, két referenciamaszk szimmetrikus különbsége, és hasonlók.

A negált változatok – b_nand(), b_nor(), b_xnor() – a nem negált megfelelőik komplementerét állítják elő. Akkor hasznosak, amikor egy feltétel leírásának természetes módja a „egyik sem ezek közül” vagy a „nem mindkettő” – nem gyakori, de érdemes tudni, hogy léteznek, hogy a negációt ne kelljen egy ÉS és egy külön invert() egymásutánjával összeállítani.

5.10.3. Bitenkénti műveletek nem bináris képeken

A bitenkénti műveletek szürkeárnyalatos és színes képeken is futnak. Ott akkor a leghasznosabbak, amikor a kép bináris jellegű tartalmat hordoz – egy szürkeárnyalatos képkocka, amelynek képpontjai mind 0 vagy 255, egy RGB565 képkocka, amelyben csak teljesen fekete és teljesen fehér képpontok vannak –, ahol az ÉS, a VAGY és az XOR ugyanazokat a kombinációkat adja, mint egy valódi bináris képen. Azoknál a képeknél, amelyek az értékek teljes tartományát átfogják, az előző oldalon tárgyalt aritmetikai műveletek általában jobban megfelelnek.