掩碼操作
opencv 庫中包含很多運算函式,這裡著重介紹按位運算的基本原理並舉例說明。
【注】以上所有運算皆基於二進位制而來。
a = np.array([[
1],[
9],[
1],[
0],[
0]])
b = np.array([[
1],[
8],[
0],[
0],[
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 =
9b =
8print
(bin
(a))
print
(bin
(b))
print
(bin
(a & b)
)print
(a & b)
0b1001
0b1000
0b1000
8
由此可見,按位與操作分成三步:
與按位與操作相似,按位或操作也分為三步:
a = np.array([[
1],[
9],[
1],[
0],[
0]])
b = np.array([[
1],[
8],[
0],[
0],[
0]])
c = cv2.bitwise_and(a, b)
print
(c)
[[1
][9]
[1][
0][0
]]
這裡的 9 是因為:
a =
9b =
8print
(bin
(a))
print
(bin
(b))
print
(bin
(a | b)
)print
(a | b)
0b1001
0b1000
0b1001
9
同樣地,按位異或操作也是分為三步:
a = np.array([[
1],[
10],[
1],[
0],[
0]])
b = np.array([[
1],[
8],[
0],[
0],[
0]])
c = cv2.bitwise_xor(a, b)
print
(c)
[[0
][2]
[1][
0][0
]]
這裡的 2 是因為:
a =
10b =
8print
(bin
(a))
print
(bin
(b))
print
(bin
(a^b)
)print
(a^b)
0b1010
0b1000
0b10
2
a = np.array([[
9],[
4],[
1],[
0],[
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],[
10],[
1],[
0],[
5]])
mask = np.array([[
0],[
1],[
0],[
1],[
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 按位運算
1.按位與 cv.bitwise and dst cv.bitwise and scr1 scr2 dst mask scr1 輸入陣列1 scr2 輸入陣列2 dst 輸入陣列 與輸入陣列形狀和型別相同 mask 可選引數 8 位單通道陣列 用於指定要更改的元素位置 dst 目標影象 dst i ...
按位取反運算解析
今天我在看簡明python指南的時候,看到其中乙個計算機計算的問題,它是這樣描述的 x的按位取反結果為 x 1 5 輸出 6。有關本例的更多細節可以參閱 看到這兒我就疑惑了,之前在大學中學習的計算機基礎課程又還給教材了,hhh 無奈,我只好取網上搜尋解析的答案,而網上的解釋說得不太讓人明白,自己結合...
位運算 之(1) 按位與(AND) 操作
由於位運算直接對記憶體資料進行操作,不需要轉成十進位制,因此處理速度非常快。按位與 bitwise and 運算符號為 a b 的操作的結果 a b中對應位同時為1,則對應結果位也為1 例如 10010001101000101011001111000 10101100000000對101011000...