5.10. Operações bit a bit¶
As operações aritméticas da página anterior trabalham com valores de pixel – os brilhos inteiros ou as palavras de cor compactadas. As operações bit a bit trabalham um nível abaixo, nos bits individuais dentro desses valores. Para imagens binárias, onde cada pixel é apenas um bit, as operações bit a bit são a aritmética natural.
5.10.1. A família bit a bit¶
A classe Image expõe o conjunto completo de operações bit a bit de duas entradas:
b_and()– AND bit a bit.b_or()– OR bit a bit.b_xor()– OR exclusivo bit a bit.b_nand()– NOT-AND.b_nor()– NOT-OR.b_xnor()– NOT-XOR.
Cada uma opera bit a bit em cada byte dos buffers de ambas as imagens. Numa imagem binária, onde cada byte contém oito pixels, a operação é executada em oito pixels por byte processado. Numa imagem em escala de cinzentos ou a cores, é executada em cada bit de cada canal.
Topo: as tabelas de verdade de AND, OR e XOR – a semântica ao nível de bit de cada operação. Fundo: duas imagens binárias A e B e o resultado de A.b_and(B), onde o resultado mantém apenas as posições que estavam ativas em ambas as entradas.¶
5.10.2. Combinação de máscaras¶
O uso mais comum destas operações é a combinação de máscaras. Uma máscara é uma imagem binária que indica, posição a posição, se alguma condição é satisfeita. Duas máscaras que descrevem condições diferentes combinam-se numa única máscara que descreve uma condição composta através de uma das operações bit a bit:
b_and() produz uma máscara cujas posições estão ativas apenas quando ambas as máscaras de entrada estavam ativas nessa posição – o «e» natural de duas condições. Combinar uma máscara de primeiro plano com a saída de um passo de limiarização através de b_and restringe as correspondências do limiar ao primeiro plano.
b_or() produz uma máscara cujas posições estão ativas sempre que qualquer uma das máscaras de entrada estava ativa – o «ou» natural. Fazer OR de duas saídas com limiarização produz uma única máscara que cobre tudo o que correspondeu a um dos dois intervalos de cor.
b_xor() produz uma máscara cujas posições estão ativas sempre que exatamente uma das máscaras de entrada estava ativa. Útil para detetar posições onde duas máscaras discordam – as posições onde a saída do limiar mudou entre dois fotogramas, a diferença simétrica entre duas máscaras de referência, esse tipo de situação.
As variantes negadas – b_nand(), b_nor(), b_xnor() – produzem o complemento dos seus equivalentes não negados. São úteis quando a forma natural de descrever uma condição é «nenhum destes» ou «não ambos» – não é comum, mas vale a pena saber que existem para que a negação não tenha de ser composta seguindo um AND com um invert() separado.
5.10.3. Operações bit a bit em imagens não binárias¶
As operações bit a bit também são executadas em imagens em escala de cinzentos e a cores. São mais úteis nesse contexto quando a imagem contém conteúdo semelhante a binário – um fotograma em escala de cinzentos cujos pixels são todos 0 ou 255, um fotograma RGB565 com apenas pixels completamente pretos e completamente brancos – onde AND, OR e XOR dão as mesmas combinações que dariam numa imagem verdadeiramente binária. Para imagens que abrangem o intervalo completo de valores, as operações aritméticas da página anterior são geralmente mais adequadas.