当前位置: 首页 > news >正文

完整教程:【OpenCV】Python图像处理之按位逻辑运算

完整教程:【OpenCV】Python图像处理之按位逻辑运算

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

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

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

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

二、基本运算示例

1. 创建测试图像(掩码与原图)
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)

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

and_result = cv2.bitwise_and(rect, circle)
3. 按位或(OR)

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

or_result = cv2.bitwise_or(rect, circle)
4. 按位非(NOT)

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

not_rect = cv2.bitwise_not(rect)
5. 按位异或(XOR)

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

xor_result = cv2.bitwise_xor(rect, circle)
6. 结果可视化
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. 图像掩码提取(保留指定区域)

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

# 读取彩色图像
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 叠加到图像的指定位置,结合掩码避免背景干扰:

# 读取背景图像和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)

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

# 读取两幅相似图像(略有差异)
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. 多通道运算:对彩色图像的每个通道分别进行位运算,结果仍为彩色图像。

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

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 图像处理的基础技能之一。

http://www.jsqmd.com/news/374198/

相关文章:

  • 《构建之法》阅读笔记(1)
  • JSP网页断点续传文件夹有哪些方法?
  • 奥特莱斯礼品卡怎么回收?教你省钱又高效的回收方式 - 团团收购物卡回收
  • 从新手到高手,2026年GEO服务商我只服DeepSeek GEO,长尾词布局全解析 - 品牌2025
  • 从策划到落地:2026年值得关注的会展服务公司实测,展会搭建/展厅设计/会场布置/展厅装修/展位搭建,会展服务企业找哪家 - 品牌推荐师
  • JSP上传文件夹时,如何进行分段处理?
  • MongoDB(6)什么是BSON?
  • 掌握武商一卡通回收流程,用这些技巧享受便捷服务 - 团团收购物卡回收
  • 军工领域CMS平台导入Excel数据如何避免乱码?
  • 斯玛特卡怎么用最省钱?回收流程和使用技巧大揭密 - 团团收购物卡回收
  • 2026PAC厂家哪家好?行业与区域双维度优质解析 - 深度智识库
  • 从T类型变量创造一个新的T类型变量就是玩转Rust高级应用. ToOwned trait 给出的是一种更“泛化”的Clone 的特性,Clone一般
  • 解决LLM推理“脑裂”难题:Kubernetes LeaderWorkerSet(LWS)组件在大模型推理部署中的应用
  • 盘点2026年郑州荷花国际月子中心,服务性价比高值得选 - 工业推荐榜
  • 基于深度学习的遥感地面物体检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Django+web+训练代码+数据集)
  • 深度解析:Binpack调度策略在智算场景中的优势与作用
  • 2026年全国别墅电梯品牌哪家有实力?靠谱耐用 适配高端住宅与旧楼加装 多场景个性化需求 - 深度智识库
  • 2026年股票配资平台选择标准:安全、正规、实盘三大核心 - 资讯焦点
  • 总结浙江比较好的女士西装专业公司,哪家服务更好 - 工业品网
  • 宏邦机械转台费用多少钱,性价比品牌排名 - 工业品牌热点
  • 续传文件夹在JSP中怎么操作?
  • 评价高的装修装饰服务公司,上海地区选购时要注意什么 - mypinpai
  • 盒马鲜生卡回收攻略,秒变现金! - 团团收购物卡回收
  • 2026年高口碑股票配资平台有哪些?安全实盘用户推荐榜 - 资讯焦点
  • JSP如何实现文件夹的分片上传功能?
  • 2026年衡水口碑好的AI搜索推广公司排名,靠谱机构哪家值得选 - myqiye
  • 探讨福斯曼与同行业优势,售后保障及产品耐用性靠谱吗 - 工业品网
  • 2026年实盘股票配资平台排名深度解析:安全合规与实力并重 - 资讯焦点
  • ServiceNow 国产替代深度分析:从功能覆盖到价值落地
  • 2026年CE认证靠谱服务商排名,说说服务不错的CE认证机构哪家性价比高 - 工业设备