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 按位运算内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python OpenCV处理图像之滤镜和图像运算

    本文实例为大家分享了Python OpenCV处理图像之滤镜和图像运算的具体代码,供大家参考,具体内容如下 0x01. 滤镜 喜欢自拍的人肯定都知道滤镜了,下面代码尝试使用一些简单的滤镜,包括图片的平滑处理.灰度化.二值化等: import cv2.cv as cv image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the image cv.ShowImage("Original", image) grey

  • 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]

  • JavaScript常用进制转换及位运算实例解析

    前言 在一般的代码中很少会接触到进制和位运算,但这不代表我们可以不去学习它.作为一位编程人员,这些都是基础知识.如果你没有学过这方面的知识,也不要慌,接下来的知识并不会很难.本文你将会学习到: 进制转换 按位操作符 JavaScript进制转换 手动实现进制转换 进制转换 以下使用常见的十进制和二进制转换作为例子,其他进制的转换也是大同小异,感兴趣可以自己琢磨下. 十进制转二进制 根据 "逢十进一" 的法则进行计数时,每十个相同的单位组成一个和它相邻的较高的单位,这种计数法叫做十进制计

  • C++中的位运算和位图bitmap解析

    目录 位运算总结 移位运算 位运算应用举例 位图 位运算总结 移位运算 移位运算是双目运算符,两个运算分量都是整形,结果也是整形. “<<” 左移:右边空出的位上补0,左边的位将从首位挤掉,其值相当于乘2. ">>"右移:右边的位被挤掉.对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统. 二进制补码运算公式: -x = ~x + 1 = ~(x-1) -(~x) = x+1 ~(-x) = x-1 x+y = x -

  • python Opencv计算图像相似度过程解析

    这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.相关概念 一般我们人区分谁是谁,给物品分类,都是通过各种特征去辨别的,比如黑长直.大白腿.樱桃唇.瓜子脸.王麻子脸上有麻子,隔壁老王和儿子很像,但是儿子下巴涨了一颗痣和他妈一模一样,让你确定这是你儿子. 还有其他物品.什么桌子带腿.镜子反光能在里面倒影出东西,各种各样的特征,我们通过学习.归纳,自然而然能够很快识别分类出新物品.

  • python+opencv边缘提取与各函数参数解析

    前情提要:作为刚入门机器视觉的小伙伴,第一节课学到机器视觉语法时觉得很难理解, 很多人家的经验,我发现都千篇一律,功能函数没解析,参数不讲解,就一个代码,所以在此将搜集的解析和案例拿出来汇总!!! 一.opencv+python环境搭建 其实能写python的就能写opencv,但是工具很总要,代码提示也很重要,你可能会用submit     vs等工具,submit编码个人觉得不够智能,vs的话过完年我学的方向不一致,所以没用 推荐 pycharm ,在项目setting中的项目解释器中安装

  • 详谈Java中的二进制及基本的位运算

    二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 那么Java中的二进制又是怎么样的呢?让我们一起来揭开它神秘的面纱吧. 一.Java内置的进

  • 老生常谈PHP位运算的用途

    在实际应用中可以做用户权限的应用 我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到"位运行符"操作,& 位与运算符.| 位或运行符.参与运算的如果是10进制数,则会被转换至2进制数参与运算,然后计算结果会再转换为10进制数输出. 它的权限值是这样的 2^0=1,相应2进数为"0001″(在这里^我表示成"次方",即:2的0次方,下同) 2^1=2,相应2进数为"0010″ 2^2=4,相应2进数为"0100″ 2^3=

  • 基础的十进制按位运算总结与在Python中的计算示例

    与运算 & 举例: 3&5                        解法:3的二进制补码是 11,  5的是101, 3&5也就是011&101,先看百位(其实不是百位,这样做只是便于理解) 一个0一个1,根据(1&1=1,1&0=0,0&0=0,0&1=0)可知百位应该是1,同样十位上的数字1&0=0,个位上的数字1&1=1,因此最后的结果是1.(这之后本来应该还有一步,因为我们现在得到的数值只是所求答案的补码,但是因

  • 通过SQL Server的位运算功能巧妙解决多选查询方法

    无论使用int还是varchar,对于Status的多选查询都是不易应对的.举例,常规思维下对CustomerStatus的Enum设置如下: 复制代码 代码如下: [Serializable] public enum CustomerStatus { New = 0, Active = 1, Overdue = 2, Suspended = 3, Closing = 4, Closed = 5 } 在数据库中以int形式存储了Status值. 如果我在页面中想一次搜索状态为Active,Ove

  • Kotlin基础学习之位运算

    什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算.举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理): 110 AND 1011 ---- 0010 –> 2 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度

随机推荐