opencv-python cv2.bitwise()与运算 函数详解

介绍

是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0

源码:

bitwise_and(src1, src2, dst=None, mask=None)

参数:

  • src1、src2:为输入图像或标量,标量可以为单个数值或一个四元组

  • dst:可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同

  • mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像

代码实列讲解:

import cv2 as cv
import numpy as np


# 创建两个三位数组,为了方便观看,数值已经是最小的了,在小一点就体现不出来效果了
a = np.random.randint(0, 10, size=(2, 2, 2))
b = np.random.randint(0, 10, size=(2, 2, 2))
print('---------- a ---------')
print(a)
print(a[0][1])
print(a.shape)
print('---------- b ---------')
print(b)
print(b.shape)

# 创建掩膜 也是最小的,记住最后转换数据类型,np.uint8,不然会报错
# error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'cv::binary_op'
# 数组中的 1 就是对应在 inRange() 方法中,满足颜色条件的 255,而不满足颜色条件的则是 0 。
# 这个方法就不具体细讲了,可以理解为 ---> 1 为 True,0 为 False
# 其实改成其他值也一样,在python当中,只要不为0的数值都是True, 0则是False
mask = np.array([[1,0], [0, 0]], dtype=np.uint8) # mask = np.array([[True,False], [False, False]], dtype=np.uint8)
print('---------- mask ---------')
print(mask)
print(mask.shape)
print(mask[0][1])
# 进行与运算

c = cv.bitwise_and(a, b, mask=mask)  # 添加掩膜
d = cv.bitwise_and(a, b)  # 不加掩膜

print('---------- c ---------')
print(c)
print(c.shape)

print('---------- d ---------')
print(d)
print(d.shape)

"""
a:  1   1   1

b:  1   0   1

"""

结果如下

途中标注了编号及画框的位置就是接下来要讲的和注意的地方

 

 首先讲一下,在没有添加掩膜的情况与运算结果,也就是

没有掩膜的编号6:

a 与 b:

 结果:

 

运算的具体过程:

a的每一位数与b中的每一位数进行二进制的与运算。

原数二进制过程(相同的为True,不相同的为False)结果

a:5   

b:6

a:101

b:110

二进制:100

十进制:4

a:7

b:5

a:111

b:101

二进制:101

十进制:5

总结:

在没有添加掩膜的情况下,就是指单纯的把两个数组中的每一位元素对应进行与运算

 以此类推

有掩膜的编号5:

结果:

步骤基本与上面相同,唯一的区别在于添加掩膜后的作用是什么?

从结果上来看:

把上面的图取下来

 掩膜数组中第一个元素为255,其余位置是 0。mask[0][0]的元素位置为255,所以只会对 a[0][0] 与b[0][0],进行运算,也就是说只有满足掩膜元素为True的a,b对应位置上元素才会进行与运算,不满足的都为 0

(其实改成其他值也一样,在python当中,只要不为0的数值都是True, 0则是False。mask = np.array([[True, False], [False, False]], dtype=np.uint8) 把掩膜换成这样也是可以的)

总结

添加掩膜后:

        mask[ i ][ j ] = True

        a[ i ][ j ] 与 b[ i ][ j ] 进行与运算

        mask[ m ][ n ]  = False

        a[ m ][ n ]  与 b[ m ][ n ] 不进行与运算,直接为 0 

 

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源源佩奇

一起进步,提高自己。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值