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

相关推荐
拾贰_C1 小时前
【ML|DL |python|pytorch|】基础学习
pytorch·python·学习
橘子编程1 小时前
仓颉语言变量与表达式解析
java·linux·服务器·开发语言·数据库·python·mysql
老鱼说AI1 小时前
算法初级教学第四步:栈与队列
网络·数据结构·python·算法·链表
wxl7812271 小时前
从图片PDF到结构化文本:基于Python+Dify的批量OCR自动化解决方案
python·pdf·ocr
ReinaXue1 小时前
快速认识图像生成算法:VAE、GAN 和 Diffusion Models
图像处理·人工智能·神经网络·算法·生成对抗网络·计算机视觉·语言模型
呆萌很1 小时前
文件读写和异常处理练习题
python
杨超越luckly2 小时前
HTML应用指南:利用POST请求获取全国极氪门店位置信息
python·arcgis·html·数据可视化·门店数据
青春不败 177-3266-05202 小时前
最新AI-Python机器学习与深度学习实践技术应用
人工智能·python·深度学习·机器学习·卷积神经网络·语义分割·自编码
三维鱼2 小时前
Python组合数据类型----5.2列表( 5.2.4 )
python