win10+Python3.7.3+OpenCV3.4.1入门学习(三)————3.3按位逻辑运算

Python版本是Python3.7.3,OpenCV版本OpenCV.3.4.1,开发环境为PyCharm
逻辑运算是一种非常重要的运算方式,图像处理过程中经常要按照位进行逻辑运算,本节介绍OpenCV中的按位逻辑运算,简称位运算。
在OpenCV内,常见的位运算函数如下表所示。

函数名基本含义
cv2.bitwise_and()按位与
cv2.bitwise_or()按位或
cv2.bitwise_xor()按位异或
cv2.bitwise_not()按位取反

3.3.1 按位与运算
在与运算中,当参与与运算的两个逻辑值都是真时,结果才为真。
在下表中对与运算算子的不同情况进行了说明,表中使用“and”表示与运算。

算子1算子2结果规则
000and(0,0)=0
010and(0,1)=0
100and(1,0)=0
111and(1,1)=0

按位与运算是指将数值转换为二进制值后,在对应的位置上进行与运算。例如,下表展示了两个数值进行按位与运算的示例。

数值十进制数二进制值
数值11981100 0110
数值2219110 11011
按位与运算结果1941100 0010

在OpenCV中,可以使用cv2.bitwise_and()函数来实现按位与运算,其语法格式为:

dst = cv2.bitwise_and( src1, src2[, mask]] )

式中:
● dst表示与输入值具有同样大小的array输出值。
● src1表示第一个array或scalar类型的输入值。
● src2表示第二个array或scalar类型的输入值。
● mask表示可选操作掩码,8位单通道array。
按位与操作有如下特点:
● 将任何数值N与数值0进行按位与操作,都会得到数值0。
● 将任何数值N(这里仅考虑8位值)与数值255(8位二进制数是11111111)进行按位与操作,都会得到数值N本身。
可以通过下表观察数值N(表中是219)与特殊值0和255进行按位与运算的结果。

按位与运算二进制数十进制值二进制值十进制值
数值N1101 10112191101 1011219
特殊值(0 及 255)0000 000001111 1111255
运算结果0000 000001101 1011219
说明数值219与数值0按位与得到0数值219与数值255按位与,结果保持自身值219不变

根据上述特点,可以构造一幅掩模图像M,掩模图像M中只有两种值:一种是数值0,另外一种是数值255。将该掩模图像M与一幅灰度图像G进行按位与操作,在得到的结果图像R中:
● 与掩模图像M中的数值255对应位置上的值,来源于灰度图像G。
● 与掩模图像M中的数值0对应位置上的值为零(黑色)。

eg1:构造一个掩模图像,使用按位与操作保留图像内被掩模所指定的部分。
代码如下:

import cv2
import numpy  as np
a=cv2.imread("lena.bmp", 0)
b=np.zeros(a.shape,dtype=np.uint8)
b[100:400,200:400]=255
b[100:500,100:200]=255
c=cv2.bitwise_and(a,b)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()

运行上述程序,输出结果如下图所示,其中左图是原始图像,中间的图是掩模图像,右图是原始图像和掩模图像按位与后提取的图像。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

3.3.2 按位或运算
或运算的规则是,当参与或运算的两个逻辑值中有一个为真时,结果就为真。
在下表中对或运算算子的不同情况进行了说明,表中使用“or”表示与运算。

算子1算子2结果规则
000or(0,0)=0
010or(0,1)=1
100or(1,0)=1
111or(1,1)=1

按位或运算是指将数值转换为二进制值后,在对应的位置上进行或运算。例如,下表展示了两个数值进行按位或运算的示例。

数值十进制数二进制值
数值11981100 0110
数值2219110 11011
按位或运算结果2231101 1111

在OpenCV中,可以使用cv2.bitwise_or()函数来实现按位或运算,其语法格式为:

dst = cv2.bitwise_or( src1, src2[, mask]] )

式中:
● dst表示与输入值具有同样大小的array输出值。
● src1表示第一个array或scalar类型的输入值。
● src2表示第二个array或scalar类型的输入值。
● mask表示可选操作掩码,8位单通道array值。

3.3.3 按位非运算
非运算是取反操作,满足如下逻辑:
● 当运算数为真时,结果为假。
● 当运算数为假时,结果为真。
下表对参与非运算算子的不同情况进行了说明,表中使用“not”表示非运算。

算子结果规则
01not(0)=1
10not(1)=0

按位非运算是指将数值转换为二进制值后,在对应的位置上进行非运算。例如,下表展示了两个数值进行按位非运算的示例。

说明十进制数二进制值
原始数值1981100 0110
按位非运算结果570011 1001

在OpenCV中,可以使用函数cv2.bitwise_not()来实现按位取反操作,其语法格式为:

数值十进制数二进制值
数值11981100 0110
数值2219110 11011
按非运算结果2231101 1111
dst = cv2.bitwise_not( src[, mask]] )

式中:
● dst表示与输入值具有同样大小的array输出值。
● src表示array类型的输入值。
● mask表示可选操作掩码,8位单通道array值。

3.3.4 按位异或运算
异或运算也叫半加运算,其运算法则与不带进位的二进制加法类似,其英文为“exclusive OR”,因此其函数通常表示为xor。
下表对参与异或运算的算子的不同情况进行了说明,其中“xor”表示异或运算。

算子1算子2结果规则
000xor(0,0)=0
011xor(0,1)=1
100xor(1,0)=1
111xor(1,1)=0

相同为0,不同为1

按位异或运算是指将数值转换为二进制值后,在对应的位置上进行异或运算。例如,表3-10展示了两个数值进行按位异或运算的示例。

数值十进制数二进制值
数值11981100 0110
数值2219110 11011
按位异或运算结果290001 1101

在OpenCV中,可以使用函数cv2.bitwise_xor()来实现按位异或运算,其语法格式为:

dst = cv2.bitwise_xor( src1, src2[, mask]] )

式中:
● dst表示与输入值具有同样大小的array输出值。
● src1表示第一个array或scalar类型的输入值。
● src2表示第二个array或scalar类型的输入值。
● mask表示可选操作掩码,8位单通道array值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值