OpenCV 之按位运算举例解析

所属分类: 脚本专栏 / python 阅读数: 1990
收藏 0 赞 0 分享

文章介绍

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 中保持不变。

更多精彩内容其他人还在看

Python调用C/C++的方法解析

这篇文章主要介绍了Python调用C/C++的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

学习Python爬虫的几点建议

这篇文章主要介绍了学习Python爬虫的几点建议,对新手学习爬虫有很大的帮助,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

Python创建临时文件和文件夹

这篇文章主要介绍了Python如何创建临时文件和文件夹,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

浅析Python 序列化与反序列化

这篇文章主要介绍了Python 序列化与反序列化的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

8种常用的Python工具

这篇文章主要介绍了8种常用的Python工具,帮助大家更好的学习Python,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

python爬虫使用requests发送post请求示例详解

这篇文章主要介绍了python爬虫使用requests发送post请求示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Python结合Window计划任务监测邮件的示例代码

这篇文章主要介绍了Python结合Window计划任务监测邮件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Python用来做Web开发的优势有哪些

这篇文章主要介绍了Python用来做Web开发的优势有哪些,文中讲解非常细致,帮助大家更好的理解和学习Python,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

如何解决pycharm调试报错的问题

在本篇内容里小编给大家整理的是一篇关于如何解决pycharm调试报错的问题文章,需要的朋友们可以学习参考下。
收藏 0 赞 0 分享

基于logstash实现日志文件同步elasticsearch

这篇文章主要介绍了基于logstash实现日志文件同步elasticsearch,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多