5.10. Побітові операції¶
Арифметичні операції з попередньої сторінки працюють із значеннями пікселів – цілочисельними яскравостями або упакованими словами кольору. Побітові операції працюють на рівень нижче, з окремими бітами всередині цих значень. Для бінарних зображень, де кожен піксель – лише один біт, побітові операції є природною арифметикою.
5.10.1. Сімейство побітових операцій¶
Клас Image надає повний набір двовхідних побітових операцій:
b_and()– побітове AND.b_or()– побітове OR.b_xor()– побітове виключне OR.b_nand()– NOT-AND.b_nor()– NOT-OR.b_xnor()– NOT-XOR.
Кожна операція виконується побітово над кожним байтом буферів обох зображень. На бінарному зображенні, де кожен байт містить вісім пікселів, операція обробляє вісім пікселів на байт. На зображеннях у відтінках сірого або кольорових вона виконується над кожним бітом кожного каналу.
Верхня частина: таблиці істинності 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 дають ті самі комбінації, що й на справжньому бінарному зображенні. Для зображень, що охоплюють весь діапазон значень, арифметичні операції з попередньої сторінки зазвичай підходять краще.