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:
b_and()– bitenkénti ÉS.b_or()– bitenkénti VAGY.b_xor()– bitenkénti kizáró VAGY.b_nand()– NEM-ÉS.b_nor()– NEM-VAGY.b_xnor()– NEM-XOR.
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.
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.