像素逻辑运算,一般用来进行遮罩层控制。
假如我们有一个遮罩层图像,只想要遮罩图的白色区域显示原图,就可以用到与运算(AND);因为这时候白色区域的像素运算结果取决于原图,而黑色区域的运算结果一定是黑色。
或运算(OR)能够得到一个区域上互补性地更加接近上边界值的图像,也即局部亮度提升。
非运算(NOT)和被减数是最大像素值时的减法算术运算结果相同,比如NOT 100(十进制,对应的二进制是01100100) = 155(十进制,对应的二进制是 10011011),也就是说100的非值就等于255-100。
非运算(NOT)就是反相操作,白的变成黑的,黑的变成白的。
异或运算(XOR)一般用来判断两个图像是否相同,如果相同最后生成纯黑色图像,如果不同就会有白色块,并且使用sum()函数把所有元素加起来会发现不为0。
二、遮罩层控制(bitwise_and和参数mask)各个运算的API
- cv2.bitwise_and(src1, src2)
- cv2.bitwise_or(src1, src2)
- cv2.bitwise_not(src1, src2)
- cv2.bitwise_nor(src1, src2)
遮罩层控制指用上面提到的与运算API(bitwise_and),设置参数mask,实现只显示遮罩图像的透光(白色)区域。
三、像素算术运算(add、subtract、divide、multiply)cv.bitwise_and(src, src, mask)
像素算术运算,可以改变图像的亮度(暗度)。
各个运算的API
- cv2.add(src1, src2, dst, mask, dtype)
- cv2.subtract(src1, src2, dst, mask, dtype)
- cv2.multiply(src1, src2, dst, mask, dtype)
- cv2.divide(src1, src2, dst, mask, dtype)
src1和src2既可以都是单个数值,也可以都是图像数组,也可以是一个图像数组搭配一个单个数值,总之只要能满足Broadcast机制,就允许。
dst在Python语言中,可以省略不写,因为函数返回值就是dst
mask代表改变的范围。
注意上面四大API,都是饱和运算;也即如果实际结果数值小于下边界,就等于下边界,如果大于上边界,就等于上边界。典型的容器类型是CV_8U,下边界是0,上边界是255,如果计算结果小于0就返回0,如果计算结果大于255就返回255。
四、图像融合(addweighted)
图像融合属于图像加法运算的特例,图像加法运算是两个图像的权值都为1,而图像融合是两图权值和为1。
add()和addweighted()都是饱和运算。
语法格式如下
cv.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) ->dst
alpha是src1的权重
beta是src2的权重
gamma是结果偏移值



