本文將簡單介紹 OpenCV 中的 Bitwise Operation,首先讓我們聚焦在計算機概論的Bitwise Operation吧。
Bitwise Operation,顧名思義,就是對 Bit 二位元做類似 "pairwise" 之類的運算(Operation),但這樣講還是太籠統了,不過既然是跟二位元 bit有關的運算,所以我們可以想像應該和OR、AND、NOT 和 XOR 邏輯閘的概念相關,也就是說,應該會有 "bitwise_and"、"bitwise_or"、"bitwise_not" 和 "bitwise_xor" 等運算 XD
而實際上,他的定義真的就是如此字面上的意思,例如 bitwise_and 就是去對兩個同樣長度的二進制編碼,逐一對同樣位置的 bit 做 AND 運算,如下圖所示:
其他如 bitwise_or,bitwise_not,bitwise_xor,bitwise_shift 也是類似概念,筆者就不在此多做解釋了,底下就使用 numpy 為其概念做相關示範,有興趣的讀者可以自行 Google 或參考 Wiki。
範例程式1(Python):
import numpy as np
x = 123
y = 45
x_binary = format(x, 'b')
y_binary = format(y, 'b')
bitwise_and_result = np.bitwise_and(x, y)
bitwise_and_binary = format(bitwise_and_result, 'b')
bitwise_or_result = np.bitwise_or(x, y)
bitwise_or_binary = format(bitwise_or_result, 'b')
bitwise_xor_result = np.bitwise_xor(x, y)
bitwise_xor_binary = format(bitwise_xor_result, 'b')
print(f'{x:<5}: {x_binary:>10}')
print(f'{y:<5}: {y_binary:>10}')
print('----------------------------')
print(f'{bitwise_and_result:<5}: {bitwise_and_binary:>10}')
print(f'{bitwise_or_result:<5}: {bitwise_or_binary:>10}')
print(f'{bitwise_xor_result:<5}: {bitwise_xor_binary:>10}')
運行結果如下:
同理,今天如果有個兩個同樣 Shape 的 np array,則 bitwise_and 則是逐一對 array 內的元素做 bitwise_and 運算
alpha = np.array([123,5,255])
beta = np.array([45,14,15])
print(f'{alpha} & {beta} = {np.bitwise_and(alpha, beta)}')

範例程式2(Python):
import cv2
import numpy as np
# 產生黑色圖片
black_img = np.zeros((256,256,3), dtype=np.uint8)
x_img = (black_img.copy())
x_img[:,0:127] = [30,115,123] # 將黑色圖片的 所有 row, 0 到 126 column 改成 BGR value 為 [30,115,123] 的顏色
y_img = (black_img.copy())
y_img[:,0:127] = [110,100,115] # 將黑色圖片的 所有 row, 0 到 126 column 改成 BGR value 為 [110,100,115] 的顏色
print(f'{[30,115,123] }&{[110,100,115]}={np.bitwise_and([30,115,123],[110,100,115])}')
x_img_bitwise_and_y_img = cv2.bitwise_and(x_img, y_img)
#print(x_bitwise_and_y)
cv2.imshow('x_img', x_img)
cv2.imshow('y_img', y_img)
cv2.imshow('x_img_bitwise_and_y_img', x_img_bitwise_and_y_img)
if cv2.waitKey(0):
print(f'監聽到用戶按下按下鍵盤')
cv2.destroyAllWindows() # 關閉所有 OpenCV 建立的視窗
執行結果:

=> OpenCV Channel 預設為 BGR,如果將其轉成 RGB 比對色碼,可以發現兩圖片做 bitwise 之間的關聯
Note:
希望有幫助到閱讀這篇的讀者理解 Bitwise Operation :))