5.10. Bitvisa operationer¶
De aritmetiska operationerna på föregående sida arbetar på pixelvärden – heltalsljusstyrkorna eller de packade färgorden. Bitvisa operationer arbetar en nivå lägre, på de enskilda bitarna inuti dessa värden. För binära bilder, där varje pixel bara är en bit, är de bitvisa operationerna den naturliga aritmetiken.
5.10.1. Den bitvisa familjen¶
Image-klassen exponerar hela uppsättningen av bitvisa operationer med två indata:
b_and()– bitvis AND.b_or()– bitvis OR.b_xor()– bitvis exklusiv-OR.b_nand()– NOT-AND.b_nor()– NOT-OR.b_xnor()– NOT-XOR.
Var och en opererar bit för bit på varje byte i båda bildernas buffertar. På en binär bild, där varje byte rymmer åtta pixlar, körs operationen på åtta pixlar per behandlad byte. På en gråskale- eller färgbild körs den på varje bit i varje kanal.
Överst: sanningstabellerna för AND, OR och XOR – den bitnivåsemantik för varje operation. Nederst: två binära bilder A och B och resultatet av A.b_and(B), där resultatet behåller endast de positioner som var på i båda indata.¶
5.10.2. Kombinera masker¶
Den enskilt vanligaste användningen av dessa operationer är att kombinera masker. En mask är en binär bild som anger, position för position, huruvida något villkor är uppfyllt. Två masker som beskriver olika villkor kombineras till en enda mask som beskriver ett sammansatt villkor genom en av de bitvisa operationerna:
b_and() producerar en mask vars positioner är på endast när båda indatamaskerna var på på den positionen – det naturliga ”och” av två villkor. Att kombinera en förgrundsmask med utdata från en tröskelvärdesgenomgång genom b_and begränsar tröskelvärdets matchningar till förgrunden.
b_or() producerar en mask vars positioner är på närhelst endera indatamasken var på – det naturliga ”eller”. Att OR:a samman två tröskelvärdesgivna utdata producerar en enda mask som täcker allt som matchade endera av två färgintervall.
b_xor() producerar en mask vars positioner är på närhelst exakt en indatamask var på. Användbart för att detektera positioner där två masker är oense – de positioner där tröskelvärdesutdata ändrades mellan två bildrutor, den symmetriska differensen mellan två referensmasker, den sortens sak.
De negerade varianterna – b_nand(), b_nor(), b_xnor() – producerar komplementet till sina icke-negerade motsvarigheter. De är användbara när det naturliga sättet att beskriva ett villkor är ”ingendera av dessa” eller ”inte båda” – inte vanligt, men värt att veta att de existerar så att negeringen inte behöver sättas samman genom att följa en AND med en separat invert().
5.10.3. Bitvist på icke-binära bilder¶
De bitvisa operationerna körs också på gråskale- och färgbilder. De är mest användbara där när bilden rymmer binärt liknande innehåll – en gråskalebildruta vars pixlar alla är 0 eller 255, en RGB565-bildruta med endast helt svarta och helt vita pixlar – där AND, OR och XOR ger samma kombinationer som de skulle på en äkta binär bild. För bilder som spänner över hela värdeintervallet är de aritmetiska operationerna på föregående sida vanligtvis en bättre passform.