图像处理过程中,经常需要按照位进行运算。位运算,主要有与、或、异或、按位取反

OpenCV中,常见的位运算如下所示:

函数名 基本含义
cv2.bitwise_and()
cv2.bitwise_or()
cv2.bitwise_xor() 异或
cv2.bitwise_not() 非/按位取反

按位“与”运算

“与”:就一个口诀,同时为真才是真

与运算,需要将数值转换为二进制,在对应的位置上进行与运算。二进制,满二进一。这里不过多介绍。

dst = cv2.bitwise_and(src1,src2 [,mask])
  • dst表示与输入值具有同样大小的array输出值
  • src1表示第一个array或scalar类型的输入值
  • src2表示第二个array或scalar类型的输入值
  • mask表示可选操作掩码,8位通道array

与运算有两个特殊值

  • 任何数值与0进行“与”运算,结果都是0
  • 任何数值与255运算,结果都是本身

需要知道的是,图像与自身进行与操作时,得到的结果仍然是自身

例1:构造一个掩模图像(一个覆盖图像),使用“与”操作保留图像内被掩模所指定的部分。

import cv2
import numpy as np
a = cv2.imread('hongmao.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('a', a)
cv2.imshow('b', b)
cv2.imshow('c', c)
cv2.waitKey()

运算结果

第一个图是原图,第二个图是掩模,第三个是按“与”操作的图。

体现了和0“与”运算,就会变成0(即黑色),与255(白色)“与”运算,就是还是自身。

按位“或”操作

“或”:就一个口诀,有真就为真

dst = cv2.bitwise_or(src1,src2 [,mask])
  • dst表示与输入值具有同样大小的array输出值
  • src1表示第一个array或scalar类型的输入值
  • src2表示第二个array或scalar类型的输入值
  • mask表示可选操作掩码,8位通道array

在上面的案例的cv2.bitwise_and(a, b)换成cv2.bitwise_or(a, b),查看效果:

运算

总结出一个规律:和0与,结果是本身,和1与,结果必然是1

按位“非”运算

“非”:就一个口诀,按位取反,0变1,1变0

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

按位“异或”运算

异或运算是一种半加运算。只加不进。

例如1+1 = 0, 11+ 11 = 00

掩模

当使用掩模参数之后,操作只会在掩模值非空的像素点执行。其他位置上的点都为0。

图像与数值的运算

在上述加法运算以及按位运算中,算子既可以是两幅图像,也可以是一幅图像和一个数值。

例如,想要增加图像的整体亮度,可以在每一个像素值都加上一个特定值。

import cv2
import numpy as np
img = np.zeros((200, 200), dtype=np.uint8)
img2 = cv2.add(50, img)
img3 = cv2.add(150, img)
img4 = cv2.add(255, img)
cv2.imshow('a', img)
cv2.imshow('b', img2)
cv2.imshow('c', img3)
cv2.imshow('d', img4)
cv2.waitKey()

运行效果


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2021/OpenCV8.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 24 日
如果觉得我的文章对你有用,请随意赞赏