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],[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
由此可见,按位与操作分成三步:
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],[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
3、bitwise_xor()
同样地,按位异或操作也是分为三步:
1、将数字转换成二进制形式;
2、对同一位上的数字(0或1)进行^(xor)操作,即1^1=0;1^0=1;0^0=0。
3、将xor操作后的二进制转换回十进制并输出。
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
4、bitwise_not()
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之按位运算举例解析的文章就介绍到这了,更多相关OpenCV按位运算内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!