5.10. Bitové operace

Aritmetické operace z předchozí stránky pracují s hodnotami pixelů – celočíselnými jasy nebo zabalenými barevnými slovy. Bitové operace pracují o úroveň níže, na jednotlivých bitech uvnitř těchto hodnot. Pro binární obrazy, kde je každý pixel pouze jeden bit, jsou bitové operace přirozenou aritmetikou.

5.10.1. Rodina bitových operací

Třída Image zpřístupňuje úplnou sadu bitových operací se dvěma vstupy:

Každá operuje po bitech na každém bajtu bufferů obou obrazů. Na binárním obraze, kde každý bajt drží osm pixelů, operace běží na osmi pixelech na zpracovaný bajt. Na obraze ve stupních šedi nebo barevném běží na každém bitu každého kanálu.

Tři pravdivostní tabulky pro operace AND, OR a XOR vedle sebe. Každá tabulka má čtyři řádky pro vstupní kombinace 0-0, 0-1, 1-0, 1-1 a sloupce označené A, B a výsledek. Pod pravdivostními tabulkami jsou dva malé binární obrazy A a B nakreslené jako mřížky černých a bílých buněk, s výsledkem jejich operace AND zobrazeným vpravo jako mřížka, která ponechává jen ty buňky, které byly bílé v obou.

Nahoře: pravdivostní tabulky AND, OR a XOR – bitová sémantika každé operace. Dole: dva binární obrazy A a B a výsledek A.b_and(B), kde výsledek ponechává jen ty pozice, které byly zapnuté v obou vstupech.

5.10.2. Kombinování masek

Naprosto nejčastějším použitím těchto operací je kombinování masek. Maska je binární obraz, který říká, pozici po pozici, zda je splněna nějaká podmínka. Dvě masky popisující různé podmínky se zkombinují do jediné masky popisující složenou podmínku prostřednictvím jedné z bitových operací:

b_and() vytvoří masku, jejíž pozice jsou zapnuté jen tehdy, když byly na dané pozici zapnuté obě vstupní masky – přirozené „a“ dvou podmínek. Kombinace masky popředí s výstupem prahování pomocí b_and omezí shody prahu na popředí.

b_or() vytvoří masku, jejíž pozice jsou zapnuté, kdykoli byla zapnutá kterákoli vstupní maska – přirozené „nebo“. Operace OR dvou prahovaných výstupů dohromady vytvoří jedinou masku pokrývající cokoli, co odpovídalo kterémukoli ze dvou rozsahů barev.

b_xor() vytvoří masku, jejíž pozice jsou zapnuté, kdykoli byla zapnutá právě jedna vstupní maska. Užitečné pro detekci pozic, kde se dvě masky neshodují – pozice, kde se výstup prahování změnil mezi dvěma snímky, symetrický rozdíl mezi dvěma referenčními maskami, něco takového.

Negované varianty – b_nand(), b_nor(), b_xnor() – vytvářejí doplněk svých nenegovaných protějšků. Jsou užitečné, když je přirozený způsob, jak popsat podmínku, „ani jedno z těchto“ nebo „ne obojí“ – ne časté, ale stojí za to vědět, že existují, aby se negace nemusela skládat tak, že po AND následuje samostatný invert().

5.10.3. Bitové operace na nebinárních obrazech

Bitové operace běží také na obrazech ve stupních šedi a barevných. Tam jsou nejužitečnější, když obraz drží binárně podobný obsah – snímek ve stupních šedi, jehož pixely jsou všechny 0 nebo 255, snímek RGB565 pouze s plně černými a plně bílými pixely – kde AND, OR a XOR dávají stejné kombinace jako na skutečném binárním obraze. Pro obrazy pokrývající celý rozsah hodnot jsou aritmetické operace z předchozí stránky obvykle vhodnější.