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 會給出與在真正二值影像上相同的組合。對於跨越完整值域的影像,上一頁的算術運算通常更為合適。