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 = 9
b = 8
print(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 = 9
b = 8
print(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 = 10
b = 8
print(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 中保持不变。