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 结果 规则
0 0 0 and(0,0)=0
0 1 0 and(0,1)=0
1 0 0 and(1,0)=0
1 1 1 and(1,1)=0

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

数值 十进制数 二进制值
数值1 198 1100 0110
数值2 219 110 11011
按位与运算结果 194 1100 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进行按位与运算的结果。

按位与运算 二进制数 十进制值 二进制值 十进制值
数值N 1101 1011 219 1101 1011 219
特殊值(0 及 255) 0000 0000 0 1111 1111 255
运算结果 0000 0000 0 1101 1011 219
说明 数值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()

运行上述程序,输出结果如下图所示,其中左图是原始图像,中间的图是掩模图像,右图是原始图像和掩模图像按位与后提取的图像。
win10+Python3.7.3+OpenCV3.4.1入门学习(三)————3.3按位逻辑运算_第1张图片win10+Python3.7.3+OpenCV3.4.1入门学习(三)————3.3按位逻辑运算_第2张图片win10+Python3.7.3+OpenCV3.4.1入门学习(三)————3.3按位逻辑运算_第3张图片

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

算子1 算子2 结果 规则
0 0 0 or(0,0)=0
0 1 0 or(0,1)=1
1 0 0 or(1,0)=1
1 1 1 or(1,1)=1

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

数值 十进制数 二进制值
数值1 198 1100 0110
数值2 219 110 11011
按位或运算结果 223 1101 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”表示非运算。

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

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

说明 十进制数 二进制值
原始数值 198 1100 0110
按位非运算结果 57 0011 1001

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

数值 十进制数 二进制值
数值1 198 1100 0110
数值2 219 110 11011
按非运算结果 223 1101 1111
dst = cv2.bitwise_not( src[, mask]] )

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

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

算子1 算子2 结果 规则
0 0 0 xor(0,0)=0
0 1 1 xor(0,1)=1
1 0 0 xor(1,0)=1
1 1 1 xor(1,1)=0

相同为0,不同为1

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

数值 十进制数 二进制值
数值1 198 1100 0110
数值2 219 110 11011
按位异或运算结果 29 0001 1101

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

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

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

你可能感兴趣的:(Python-OpenCV,python-opencv,图像处理,按位逻辑运算)