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

相关推荐
ThsPool3 小时前
【遥感学习整理 02】ENVI遥感图像处理基础:从数据读取到遥感信息产品
图像处理·人工智能·学习
卷无止境3 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境3 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1234 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
江畔柳前堤4 小时前
系统的本质——从LTI系统到神经网络
人工智能·深度学习·神经网络·机器学习·计算机视觉·数据挖掘·语音识别
Dxy12393102164 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb005 小时前
一个项目带你入门AI应用开发01
python
0566465 小时前
Python康复训练——常用标准库
开发语言·python·学习
昆曲之源_娄江河畔5 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql
0566465 小时前
Python康复训练——控制流与函数
开发语言·python·学习