OpenCV按位运算详解:bitwise_and、or、xor与not函数解析
本文深入解析OpenCV中的按位运算函数,包括bitwise_and、bitwise_or、bitwise_xor和bitwise_not。通过二进制转换原理与具体代码示例,详细演示各函数的计算逻辑及在图像掩码操作中的应用,帮助开发者掌握底层位操作技巧。
OpenCV按位运算概述
文章介绍
OpenCV库提供了丰富的图像处理函数,本节将重点讲解按位运算的核心原理,并通过具体案例进行说明。
本文主要涉及以下四个核心函数:
- 按位与运算:bitwise_and()
- 按位或运算:bitwise_or()
- 按位异或运算:bitwise_xor()
- 按位非(反转)运算:bitwise_not()
需要注意的是,上述所有按位运算均基于数据的二进制表示形式进行计算。
按位运算函数详解
具体示例分析
1. bitwise_and() 函数解析
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?这需要通过二进制层面来理解。
按位运算的本质是基于二进制位进行计算。我们可以利用Python内置的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. 对二进制位进行逐位与(&)运算,规则为:1&1=1,1&0=0,0&0=0; 3. 将运算后的二进制结果转换回十进制并输出。
2. bitwise_or() 函数解析
按位或运算的逻辑与按位与类似,同样分为三个步骤:
1. 将参与运算的数字转换为二进制形式; 2. 对二进制位进行逐位或(|)运算,规则为:1|1=1,1|0=1,0|0=0; 3. 将运算后的二进制结果转换回十进制并输出。
bitwise_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. 对二进制位进行逐位异或(^)运算,规则为:1^1=0,1^0=1,0^0=0; 3. 将运算后的二进制结果转换回十进制并输出。
bitwise_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() 函数解析
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。这符合计算机中补码表示法的特性。
掩码操作应用
掩码操作应用
按位与运算常与掩码(mask)结合使用,以实现局部图像处理。具体示例如下:
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中值为0的位置,在结果数组a中对应位置也会被置为0;而mask中值为1的位置,在结果数组a中保持不变。
本文介绍了OpenCV中按位运算的基本原理及代码实现,更多相关OpenCV按位运算内容可参考本站历史文章或继续浏览后续教程,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









