这篇博客将介绍如何使用opencv应用按位and、or、xor和not。上一篇学习了如何从图像中裁剪和提取感兴趣的区域(roi),截取的都是矩形。但是如果想裁剪一个非矩形区域呢?该怎么办?

答案是同时应用位运算和掩蔽。

  • and:当且仅当两个像素都大于零时,按位and为真。
  • or:如果两个像素中的任何一个大于零,则按位或为真。
  • xor:当且仅当两个像素中的一个大于零,而不是两个都大于零时,按位异或为真。
  • not:按位not反转图像中的“开”和“关”像素。

比较好记的是and交集、or并集、xor并集-交集、not——非取反;

1. 效果图

矩形 vs 圆形效果图如下:

and操作效果图如下,可以看到正方形的边缘丢失了,因为矩形没有圆形覆盖那么大的区域,因此两个像素都没有“开”。

or操作效果图如下,可以看到矩形和圆形被合并了。

xor操作效果图如下,可以看到正方形的中心被移走了,因为异或操作不能同时具有大于零的像素。

not操作效果图如下,可以看到圆由前景白色背景黑色变成了前景黑色背景白色。

2. 源码

# 对示例图像应用and、or、xor和not运算符。
# usage
# python opencv_bitwise.py

# 导入必要的包
import numpy as np
import cv2

# 绘制一个矩形
rectangle = np.zeros((300, 300), dtype="uint8")
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1)
cv2.imshow("rectangle", rectangle)

# 绘制一个圆
circle = np.zeros((300, 300), dtype = "uint8")
cv2.circle(circle, (150, 150), 150, 255, -1)
cv2.imshow("circle", circle)

# 'and'操作——当输入都是>0的像素时,则得到开操作像素为255白色,否则被设置为关闭,像素为0黑色
# 当且仅当两个像素都大于零时,按位and为真。
bitwiseand = cv2.bitwise_and(rectangle, circle)
cv2.imshow("and", bitwiseand)
cv2.waitkey(0)

# ‘or'操作得到矩形和圆形的并集,只要有一个>0,就得到255白色,否则为0
# 如果两个像素中的任何一个大于零,则按位“或”为真。
bitwiseor = cv2.bitwise_or(rectangle, circle)
cv2.imshow("or", bitwiseor)
cv2.waitkey(0)

# ‘xor'是or的补集,仅当俩个像素有一个>0时,为白色255
bitwisexor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow("xor", bitwisexor)
cv2.waitkey(0)

# ‘not'操作:0变成255,255变成0
bitwisenot = cv2.bitwise_not(circle)
cv2.imshow("not", bitwisenot)
cv2.waitkey(0)

参考 https://www.pyimagesearch.com/2021/01/19/opencv-bitwise-and-or-xor-and-not/

到此这篇关于超详细注释之opencv按位and or xor和not的文章就介绍到这了,更多相关opencv按位and or xor not内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!