1.基本介绍
逻辑运算是一种非常重要的运算方式,图像处理过程中经常要按照位进行逻辑运算,OpenCV中常见的按位逻辑运算函数如下表:
函数名 | 基本含义 |
---|---|
cv2.bitwise_and() | 按位与 |
cv2.bitwise_or() | 按位或 |
cv2.bitwise_xor() | 按位异或 |
cv2.bitwise_not() | 按位取反 |
2.按位与运算
在与运算中,当参与与运算的两个逻辑值均为真时,结果才为真。其逻辑关系可以类比如下的串联电路,只有当两个开关都闭合时,灯才会亮。
运算规则:0&0=0;0&1=0;1&0=0;1&1=1;
在 OpenCV 中,可以使用cv2.bitwise_and()
函数来实现按位与运算,其语法格式为:
dst = cv2.bitwise_and( src1, src2[, mask]] )
参数解析:
dst
表示与输入值具有同样大小的 array 输出值
src1,src2
表示第一和第二个 array 或 scalar 类型的输入值
mask
表示可选操作掩码,8 位单通道 array
按位与操作的特点:
任何数值 N 与数值 0 进行按位与操作,都会得到数值 0
任何数值 N(仅考虑 8 位值)与数值 255(8 位二进制数是 1111 1111)进行按位与操作,都会得到数值 N 本身。
可以通过生成一张灰度图进行测试2.1数组演示按位与运算
import cv2
import numpy as np
a=np.random.randint(0,255,(8,8),dtype=np.uint8)
b=np.zeros((8,8),dtype=np.uint8)
b[0:4,0:4]=255
b[5:,5:]=255
c=cv2.bitwise_and(a,b)
print("a=\n",a)
print("b=\n",b)
print("c=\n",c)
程序输出结果
a=
[[ 10 155 57 153 235 118 30 221]
[127 36 6 40 211 236 30 71]
[123 240 192 40 112 96 147 252]
[127 172 60 150 89 207 136 40]
[171 67 58 248 30 15 216 41]
[248 120 58 231 127 210 164 198]
[111 189 206 40 198 59 247 177]
[ 1 173 242 201 153 72 86 207]]
b=
[[255 255 255 255 0 0 0 0]
[255 255 255 255 0 0 0 0]
[255 255 255 255 0 0 0 0]
[255 255 255 255 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 255 255 255]
[ 0 0 0 0 0 255 255 255]
[ 0 0 0 0 0 255 255 255]]
c=
[[ 10 155 57 153 0 0 0 0]
[127 36 6 40 0 0 0 0]
[123 240 192 40 0 0 0 0]
[127 172 60 150 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 210 164 198]
[ 0 0 0 0 0 59 247 177]
[ 0 0 0 0 0 72 86 207]]
从输出结果可以看出,数组c是数组a与b的按位与操作的结果。对于数组c内的值,与数组b中数值255对应位置上的值来源于数组a;与数组b中数值0对应位置上的值为0。
2.2 掩膜图像演示按位与运算
import cv2
import numpy as np
a=cv2.imread("lena_color.jpg")
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("lena彩色原图",a)
cv2.imshow("掩膜图像",b)
cv2.imshow("按位与运算结果图像",c)
cv2.waitKey()
cv2.destroyAllWindows()
程序输出结果
从运行结果来看,我们构造一个掩模图像,保留图像 lena 的头部。3.按位或运算
按位或运算的规则是,当参与或运算的两个逻辑值中有一个为真时,结果就为真。其逻辑关系可以类比为如如下的并联电路,两个开关中只要有任意一个闭合时,灯就会亮。
运算规则:1|1=11|0=10|1=10|0=0;
在 OpenCV 中,可以使用cv2.bitwise_or()
函数来实现按位或运算,其语法格式为:dst =cv2.bitwise_or( src1, src2[, mask]] )
参数解析:
dst
表示与输入值具有同样大小的 array 输出值
src1,src2
表示第一和第二个 array 或 scalar 类型的输入值
mask
表示可选操作掩码,8 位单通道 array4.按位非运算
按位非运算是取反操作,满足如下逻辑:当运算数为真时,结果为假;当运算数为假时,结果为真。
运算规则:~1=0; ~0=1;
在 OpenCV 中,可以使用cv2.bitwise_not()
函数来实现按位或运算,其语法格式为:dst =cv2.bitwise_not( src1, src2[, mask]] )
参数解析:
dst
表示与输入值具有同样大小的 array 输出值
src1,src2
表示第一和第二个 array 或 scalar 类型的输入值
mask
表示可选操作掩码,8 位单通道 array5.按位异或运算
异或运算也叫半加运算,其运算法则与不带进位的二进制加法类似。
运算规则:0^ 0=0; 0^ 1=1; 1^ 0=1; 1^1=0;
在 OpenCV 中,可以使用cv2.bitwise_xor()
函数来实现按位或运算,其语法格式为:dst =cv2.bitwise_xor( src1, src2[, mask]] )
参数解析:
dst
表示与输入值具有同样大小的 array 输出值
src1,src2
表示第一和第二个 array 或 scalar 类型的输入值
mask
表示可选操作掩码,8 位单通道 array