1. 程式人生 > 程式設計 >OpenCV 之按位運算舉例解析

OpenCV 之按位運算舉例解析

文章介紹

OpenCV 庫中包含很多運算函式,這裡著重介紹按位運算的基本原理並舉例說明。

本篇文章中主要涉及到的函式有:

  • 按位與:bitwise_and();
  • 按位或:bitwise_or();
  • 按位異或:bitwise_xor()。
  • 按位反轉:bitwise_not();

【注】以上所有運算皆基於二進位制而來。

舉例說明

1、bitwise_and()

a = np.array([[1],[9],[1],[0],[0]])
b = np.array([[1],[8],[0]])
c = cv2.bitwise_and(a,b)
print(c)

[[1]
[8]

[0]
[0]
[0]]

這裡的 1&1=1,1&0=0,0&0=0 還好理解,但是 8&9=8 是怎麼回事嘞?

在介紹中我們說,按位運算都是基於二進位制來的,我們可以使用 bin() 函式來將數字轉換為二進位制形式,如 9 的二進位制形式為 1001,8 的二進位制形式為 1000。

a = 9
b = 8
print(bin(a))
print(bin(b))
print(bin(a & b))
print(a & b)

0b1001
0b1000
0b1000
8

由此可見,按位與操作分成三步:

1、將數字轉換成二進位制形式;
2、對同一位上的數字(0 或 1)進行 & (and) 操作,即 1&1=1;1&0=0;0&0=0。

3、將 and 操作後的二進位制轉換回十進位制並輸出。

2、bitwise_or()

與按位與操作相似,按位或操作也分為三步:

1、將數字轉換成二進位制形式;
2、對同一位上的數字(0 或 1)進行 | (or) 操作,即 1|1=1;1|0=1;0|0=0。
3、將 or 操作後的二進位制轉換回十進位制並輸出。

a = np.array([[1],b)
print(c)

[[1]
[9]
[1]
[0]
[0]]

這裡的 9 是因為:

a = 9
b = 8
print(bin(a))
print(bin(b))
print(bin(a | b))
print(a | b)

0b1001

0b1000
0b1001
9

3、bitwise_xor()

同樣地,按位異或操作也是分為三步:

1、將數字轉換成二進位制形式;
2、對同一位上的數字(0 或 1)進行 ^ (xor) 操作,即 1^1=0;1^0=1;0^0=0。
3、將 xor 操作後的二進位制轉換回十進位制並輸出。

a = np.array([[1],[10],[0]])
c = cv2.bitwise_xor(a,b)
print(c)

[[0]
[2]
[1]
[0]
[0]]

這裡的 2 是因為:

a = 10
b = 8
print(bin(a))
print(bin(b))
print(bin(a^b))
print(a^b)

0b1010
0b1000
0b10
2

4、bitwise_not()

a = np.array([[9],[4],[0]])
b = cv2.bitwise_not(a)
print(b)
print(a+b)

[[-10]
[ -5]
[ -2]
[ -1]
[ -1]]
[[-1]
[-1]
[-1]
[-1]
[-1]]

由此可見按位反轉前後的陣列相加為 -1。

掩碼操作

按位與操作和掩碼操作通常一起使用:

a = np.array([[1],[5]])
mask = np.array([[0],[0]],dtype='uint8')
c = cv2.bitwise_and(a,a)
c_mask = cv2.bitwise_and(a,a,mask=mask)
print(c)
print(c_mask)
 

[[ 1]
[10]
[ 1]
[ 0]
[ 5]]
[[ 0]
[10]
[ 0]
[ 0]
[ 0]]

經過掩碼操作,mask 置零的位置在 a 中也會被置零,mask 置一的位置在 a 中保持不變。

到此這篇關於OpenCV 之按位運算舉例解析的文章就介紹到這了,更多相關OpenCV 按位運算內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!