5.10. 位元運算

上一頁的算術運算作用於像素——整數亮度或打包的色彩字。位元運算則作用於更低一層,即這些值內部的個別位元。對於每個像素僅為一個位元的二值影像而言,位元運算正是其天然的算術。

5.10.1. 位元運算系列

Image 類別公開了完整的雙輸入位元運算集:

每項運算皆對兩張影像緩衝區中每個位元組逐位元運作。在二值影像上,由於每個位元組存放八個像素,每處理一個位元組即對八個像素執行運算。在灰階或彩色影像上,則對每個通道的每個位元執行運算。

並排呈現 AND、OR 與 XOR 三項運算的真值表。每張 表有四列,對應輸入 組合 0-0、0-1、1-0、1-1, 欄位則標示為 A、B 與結果。 真值表下方為兩張小型 二值影像 A 與 B,繪製為 黑白方格網格,而 將其相 AND 的結果則顯示於 右側,呈現為僅保留兩者皆為白色 方格的網格。

上方: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. 對非二值影像的位元運算

位元運算亦可在灰階與彩色影像上執行。當影像存放類二值內容時——像素全為 0255 的灰階影格、僅含全黑與全白像素的 RGB565 影格——位元運算最為有用,因為 AND、OR 與 XOR 會給出與在真正二值影像上相同的組合。對於跨越完整值域的影像,上一頁的算術運算通常更為合適。