【OpenCV】Python图像处理之按位逻辑运算

OpenCV-Python 中的按位逻辑运算包括与(AND)、或(OR)、非(NOT)、异或(XOR),基于像素的二进制位运算,常用于图像掩码、区域提取、图像合成、特征分离等场景。由于运算针对每个像素的二进制值进行,需保证图像尺寸一致(非运算除外),以下详细介绍具体方法及应用:

一、按位逻辑运算的基本概念

运算类型 作用 公式(像素值 a、b)
与(AND) 仅当 a 和 b 对应位均为 1 时结果为 1,否则为 0(保留共同区域) a & b
或(OR) 只要 a 或 b 对应位有一个为 1 则结果为 1(合并区域) `a b`
非(NOT) 对 a 的每一位取反(反转像素值) ~a
异或(XOR) a 和 b 对应位不同时结果为 1,相同时为 0(提取差异区域) a ^ b

OpenCV 中通过cv2.bitwise_and()cv2.bitwise_or()cv2.bitwise_not()cv2.bitwise_xor()实现,输入图像需为单通道或相同通道数的多通道图像。

二、基本运算示例

1. 创建测试图像(掩码与原图)
python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 创建黑色背景图像
img = np.zeros((300, 300), dtype=np.uint8)
# 创建白色矩形和圆形
rect = cv2.rectangle(img.copy(), (50, 50), (200, 200), 255, -1)  # 矩形
circle = cv2.circle(img.copy(), (200, 200), 100, 255, -1)        # 圆形
2. 按位与(AND)

保留两个图像的重叠区域:

python 复制代码
and_result = cv2.bitwise_and(rect, circle)
3. 按位或(OR)

合并两个图像的所有区域:

python 复制代码
or_result = cv2.bitwise_or(rect, circle)
4. 按位非(NOT)

反转图像像素值(黑变白,白变黑):

python 复制代码
not_rect = cv2.bitwise_not(rect)
5. 按位异或(XOR)

提取两个图像的非重叠区域:

python 复制代码
xor_result = cv2.bitwise_xor(rect, circle)
6. 结果可视化
python 复制代码
plt.figure(figsize=(12, 8))
plt.subplot(231), plt.imshow(rect, cmap='gray'), plt.title('Rectangle')
plt.subplot(232), plt.imshow(circle, cmap='gray'), plt.title('Circle')
plt.subplot(233), plt.imshow(and_result, cmap='gray'), plt.title('AND')
plt.subplot(234), plt.imshow(or_result, cmap='gray'), plt.title('OR')
plt.subplot(235), plt.imshow(not_rect, cmap='gray'), plt.title('NOT (Rect)')
plt.subplot(236), plt.imshow(xor_result, cmap='gray'), plt.title('XOR')
plt.axis('off')
plt.show()
7.效果展示

三、实际应用场景

1. 图像掩码提取(保留指定区域)

通过掩码提取图像的特定区域,是逻辑运算最常用的场景:

python 复制代码
# 读取彩色图像
img = cv2.imread('image.jpg')
# 创建掩码(与图像尺寸相同,中心圆形为白色)
mask = np.zeros(img.shape[:2], dtype=np.uint8)
mask = cv2.circle(mask, (img.shape[1]//2, img.shape[0]//2), 100, 255, -1)

# 用掩码提取图像区域
masked_img = cv2.bitwise_and(img, img, mask=mask)  # 第三个参数为掩码

# 显示结果
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original')
plt.subplot(122), plt.imshow(cv2.cvtColor(masked_img, cv2.COLOR_BGR2RGB)), plt.title('Masked Image')
plt.show()
2. 图像合成(叠加 logo)

将 logo 叠加到图像的指定位置,结合掩码避免背景干扰:

python 复制代码
# 读取背景图像和logo
bg = cv2.imread('background.jpg')
logo = cv2.imread('logo.png', cv2.IMREAD_UNCHANGED)  # 带Alpha通道的logo

# 调整logo尺寸并分离Alpha通道
logo = cv2.resize(logo, (100, 100))
logo_rgb = logo[:, :, :3]
logo_alpha = logo[:, :, 3]

# 定义logo位置
rows, cols = logo_rgb.shape[:2]
roi = bg[0:rows, 0:cols]

# 创建logo掩码和反掩码
logo_mask = logo_alpha
logo_mask_inv = cv2.bitwise_not(logo_mask)

# 隐藏roi区域的logo背景
bg_bg = cv2.bitwise_and(roi, roi, mask=logo_mask_inv)
# 提取logo前景
logo_fg = cv2.bitwise_and(logo_rgb, logo_rgb, mask=logo_mask)

# 合成logo与roi
dst = cv2.add(bg_bg, logo_fg)
bg[0:rows, 0:cols] = dst

# 显示结果
plt.imshow(cv2.cvtColor(bg, cv2.COLOR_BGR2RGB)), plt.title('Logo Added'), plt.axis('off')
plt.show()
3. 图像差异检测(XOR)

通过异或运算检测两幅图像的差异区域:

python 复制代码
# 读取两幅相似图像(略有差异)
img1 = cv2.imread('img1.jpg', 0)
img2 = cv2.imread('img2.jpg', 0)

# 异或运算获取差异
diff = cv2.bitwise_xor(img1, img2)
# 阈值处理突出差异
_, diff_thresh = cv2.threshold(diff, 10, 255, cv2.THRESH_BINARY)

# 显示结果
plt.subplot(131), plt.imshow(img1, cmap='gray'), plt.title('Image 1')
plt.subplot(132), plt.imshow(img2, cmap='gray'), plt.title('Image 2')
plt.subplot(133), plt.imshow(diff_thresh, cmap='gray'), plt.title('Difference')
plt.show()

四、注意事项

  1. 尺寸匹配 :除cv2.bitwise_not()外,其他运算要求输入图像尺寸(高度、宽度)和通道数完全一致;
  2. 掩码使用cv2.bitwise_and()/or()/xor()支持第三个参数mask(单通道),仅对掩码非零区域进行运算;
  3. 数据类型 :输入图像通常为uint8类型,运算结果保持原类型;
  4. 多通道运算:对彩色图像的每个通道分别进行位运算,结果仍为彩色图像。

五、完整示例:掩码提取与图像合成

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 1. 掩码提取区域
img = cv2.imread('flower.jpg')
mask = np.zeros(img.shape[:2], dtype=np.uint8)
mask = cv2.rectangle(mask, (100, 50), (300, 250), 255, -1)
masked = cv2.bitwise_and(img, img, mask=mask)

# 2. 图像反转(NOT)
inverted = cv2.bitwise_not(img)

# 3. 显示结果
plt.figure(figsize=(15, 5))
plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original')
plt.subplot(132), plt.imshow(cv2.cvtColor(masked, cv2.COLOR_BGR2RGB)), plt.title('Masked Region')
plt.subplot(133), plt.imshow(cv2.cvtColor(inverted, cv2.COLOR_BGR2RGB)), plt.title('Inverted Image')
plt.axis('off')
plt.show()
效果图:

总结

按位逻辑运算的核心价值在于区域控制与像素级操作

  • 掩码提取:通过 AND 运算保留指定区域;
  • 图像合成:结合掩码实现无背景叠加;
  • 差异检测:通过 XOR 运算识别图像变化;
  • 像素反转:通过 NOT 运算实现图像反色。

掌握逻辑运算的组合使用,可高效实现图像分割、合成、增强等复杂任务,是 OpenCV 图像处理的基础技能之一。

相关推荐
兔子小灰灰4 小时前
jetson安装pytorch
人工智能·pytorch·python
Swizard5 小时前
拒绝“裸奔”上线:FastAPI + Pytest 自动化测试实战指南
python
Coding茶水间5 小时前
基于深度学习的学生上课行为检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·深度学习·yolo·目标检测·机器学习·计算机视觉
Ven%6 小时前
从单轮问答到连贯对话:RAG多轮对话技术详解
人工智能·python·深度学习·神经网络·算法
谈笑也风生6 小时前
经典算法题型之复数乘法(二)
开发语言·python·算法
AI小怪兽6 小时前
YOLO11-4K:面向4K全景图像实时小目标检测的高效架构
人工智能·目标检测·计算机视觉·目标跟踪·架构
先知后行。7 小时前
python的类
开发语言·python
dyxal7 小时前
Python包导入终极指南:子文件如何成功调用父目录模块
开发语言·python
nnerddboy7 小时前
解决传统特征波段选择的不可解释性:2. SHAP和LIME
python·机器学习
电商API&Tina7 小时前
【电商API接口】关于电商数据采集相关行业
java·python·oracle·django·sqlite·json·php