5.10. Побітові операції

Арифметичні операції з попередньої сторінки працюють із значеннями пікселів – цілочисельними яскравостями або упакованими словами кольору. Побітові операції працюють на рівень нижче, з окремими бітами всередині цих значень. Для бінарних зображень, де кожен піксель – лише один біт, побітові операції є природною арифметикою.

5.10.1. Сімейство побітових операцій

Клас Image надає повний набір двовхідних побітових операцій:

Кожна операція виконується побітово над кожним байтом буферів обох зображень. На бінарному зображенні, де кожен байт містить вісім пікселів, операція обробляє вісім пікселів на байт. На зображеннях у відтінках сірого або кольорових вона виконується над кожним бітом кожного каналу.

Three truth tables for the AND, OR, and XOR operations side by side. Each table has four rows for the input combinations 0-0, 0-1, 1-0, 1-1 and columns labelled A, B, and result. Below the truth tables, two small binary images A and B are drawn as grids of black and white cells, with the result of ANDing them shown to the right as a grid that keeps only the cells that were white in both.

Верхня частина: таблиці істинності AND, OR та XOR – побітова семантика кожної операції. Нижня частина: два бінарних зображення A і B та результат A.b_and(B), де результат зберігає лише позиції, що були активними в обох вхідних даних.

5.10.2. Комбінування масок

Найпоширеніше застосування цих операцій – комбінування масок. Маска – це бінарне зображення, яке позиція за позицією вказує, чи виконується певна умова. Дві маски, що описують різні умови, комбінуються в єдину маску, що описує складену умову, за допомогою однієї з побітових операцій:

b_and() дає маску, чиї позиції активні лише тоді, коли обидві вхідні маски були активні на тій позиції – природне «і» двох умов. Комбінування маски переднього плану з виходом порогового проходу через b_and обмежує збіги порогу переднім планом.

b_or() дає маску, чиї позиції активні, коли будь-яка з вхідних масок була активна – природне «або». OR двох порогових виходів дає єдину маску, що охоплює все, що відповідало будь-якому з двох діапазонів кольорів.

b_xor() дає маску, чиї позиції активні, коли активна рівно одна вхідна маска. Корисно для виявлення позицій, де дві маски не збігаються – позиції, де пороговий вихід змінився між двома кадрами, симетрична різниця між двома еталонними масками, такого роду речі.

Заперечені варіанти – b_nand(), b_nor(), b_xnor() – дають доповнення своїх незаперечних аналогів. Вони корисні, коли природний спосіб описати умову – «жодне з цих» або «не обидва» – не часто, але варто знати, що вони існують, щоб не потрібно було складати заперечення за допомогою AND і окремого invert().

5.10.3. Побітові операції на небінарних зображеннях

Побітові операції також виконуються на зображеннях у відтінках сірого та кольорових. Там вони найкорисніші, коли зображення містить бінарно-подібний вміст – кадр у відтінках сірого, де пікселі – всі 0 або 255, кадр RGB565 лише з повністю чорними та повністю білими пікселями – де AND, OR і XOR дають ті самі комбінації, що й на справжньому бінарному зображенні. Для зображень, що охоплюють весь діапазон значень, арифметичні операції з попередньої сторінки зазвичай підходять краще.