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
    评论
cv.bitwise_and 是 OpenCV 中的一个函数,用于对两个图像进行按位与操作。它需要两个参数,即要进行按位与操作的两个图像,以及一个可选的输出图像,用于存储结果。具体使用方法如下: ```python cv.bitwise_and(src1, src2, dst=None, mask=None) ``` 其中,src1 和 src2 是要进行按位与操作的两个图像,dst 是可选的输出图像,mask 是可选的掩膜图像,用于在某些位置上选择性地进行按位与操作。 注意,src1、src2 和 dst 的大小和类型必须相同,否则会出现错误。按位与操作的规则是,对于每个像素,将它们的二进制表示中的每一位进行与操作,得到的结果再转换为十进制数作为输出图像中相应像素的值。 下面是一个简单的例子,演示了如何使用 cv.bitwise_and 对两个灰度图像进行按位与操作: ```python import cv2 as cv import numpy as np # 读入两个灰度图像 img1 = cv.imread('image1.png', 0) img2 = cv.imread('image2.png', 0) # 对两个图像进行按位与操作 result = cv.bitwise_and(img1, img2) # 显示结果图像 cv.imshow('Result', result) cv.waitKey(0) cv.destroyAllWindows() ``` 在这个例子中,我们首先读入了两个灰度图像,并将它们分别存储在 img1 和 img2 中。然后,我们使用 cv.bitwise_and 对它们进行按位与操作,将结果存储在 result 中。最后,我们使用 cv.imshow 显示结果图像,并等待用户按下任意键关闭窗口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

源源佩奇

一起进步,提高自己。

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

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

打赏作者

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

抵扣说明:

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

余额充值