OpenCV位运算详解:AND、OR、XOR与NOT在图像掩膜中的应用

洛溪
洛溪
发布时间:2026-10-14 | 2人浏览过
原创

本文深入解析OpenCV中的按位AND、OR、XOR和NOT运算,展示如何通过位运算与掩膜技术实现非矩形区域(如圆形)的图像裁剪。详细对比四种运算对矩形与圆形叠加区域的视觉效果,并提供完整Python源码示例,帮助开发者掌握ROI提取的高级技巧。

本文将详细讲解如何在OpenCV中应用按位AND、OR、XOR和NOT运算。在前一篇文章中,我们学习了如何从图像中裁剪和提取感兴趣区域(ROI),但仅限于矩形区域。那么,如果需要裁剪非矩形区域,该如何操作呢?

解决这一问题的关键在于结合使用位运算与掩膜技术。

  • AND运算:仅当两个对应像素值均大于零时,结果像素才为真(非零)。
  • OR运算:只要两个对应像素中任意一个大于零,结果像素即为真。
  • XOR运算:仅当两个对应像素中恰好有一个大于零(即不同时为真)时,结果像素才为真。
  • NOT运算:按位取反,将图像中的“开”像素(高亮部分)与“关”像素(背景部分)进行反转。

为了方便记忆,可以这样理解:AND对应交集,OR对应并集,XOR对应并集减去交集,NOT则是非取反操作。

1. 效果展示

以下是矩形与圆形叠加后的效果对比图:

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按位运算内容,请搜索本站往期文章或继续阅读后续相关文章。感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表