【OpenCV】Python图像处理之图像加法运算

OpenCV-Python 中的图像加法运算包括算术加法加权加法(图像混合) ,常用于亮度调整、图像融合、特效叠加等场景。由于图像以uint8类型存储(像素值范围 0-255),加法运算需注意溢出处理,以下详细介绍具体方法及应用:

一、算术加法(cv2.add() vs 直接相加)

1. 直接相加(NumPy 加法)

直接对图像数组进行加法运算,遵循模运算(溢出时取模):

(a + b) % 256

python 复制代码
import cv2
import numpy as np

# 创建测试图像
img1 = np.ones((200, 200, 3), dtype=np.uint8) * 100  # 灰度值100的图像
img2 = np.ones((200, 200, 3), dtype=np.uint8) * 200  # 灰度值200的图像

# 直接相加(溢出取模)
img_direct = img1 + img2
print(f"直接相加结果(100+200): {img_direct[0, 0, 0]}")  # 输出44(300%256=44)
2. cv2.add()函数(饱和加法)

OpenCV 提供的加法函数,遵循饱和运算(溢出时截断为 255,不足时截断为 0):

min(a + b, 255)

python 复制代码
# cv2.add()相加(饱和截断)
img_cv_add = cv2.add(img1, img2)
print(f"cv2.add结果(100+200): {img_cv_add[0, 0, 0]}")  # 输出255(饱和)
cv2.add()函数详解:

OpenCV中‌cv2.add()函数用于执行图像或数组的像素级加法操作,支持图像叠加、噪声消除等场景。以下是核心功能和使用示例:

核心功能
  • 图像叠加‌:将两幅图像或图像与标量逐像素相加,结果溢出时自动截断为255(‌8位无符号整型上限) 。
  • 噪声消除‌:通过多次采集图像后叠加取平均,降低随机噪声 。
  • 掩码控制‌:通过‌mask参数指定局部区域进行加法,常用于ROI处理 。
与普通加法的区别
  • cv2.add():溢出时直接截断为255 。
  • +运算符:溢出后按模256计算(如260%256=4) 。
参数说明
  • src1/src2:输入图像或标量 。
  • mask:8位单通道二值掩码(可选) 。
  • dtype:指定输出数据类型(如‌CV_32F) 。
3. 亮度调整示例

通过加法提升图像亮度(推荐用cv2.add()避免溢出):

python 复制代码
img = cv2.imread('image.jpg')
brightness = 50  # 亮度增量
img_bright = cv2.add(img, np.ones_like(img) * brightness)  # 安全提升亮度
4.对比代码展示
python 复制代码
import cv2
import numpy as np

# 创建测试图像
img1 = np.ones((200, 200, 3), dtype=np.uint8) * 100  # 灰度值100的图像
img2 = np.ones((200, 200, 3), dtype=np.uint8) * 200  # 灰度值200的图像

# 直接相加(溢出取模)
img_direct = img1 + img2
print(f"直接相加结果(100+200): {img_direct[0, 0, 0]}")  # 输出44(300%256=44)

# cv2.add()相加(饱和截断)
img_cv_add = cv2.add(img1, img2)
print(f"cv2.add结果(100+200): {img_cv_add[0, 0, 0]}")  # 输出255(饱和)


cv2.imshow('1', img_direct)
cv2.imshow('2', img_cv_add)
cv2.waitKey(0)  # 按任意键关闭窗口(参数为0表示无限等待)
cv2.destroyAllWindows()  # 释放窗口资源
运行效果图:

二、加权加法(图像混合,cv2.addWeighted()

实现两幅图像的线性混合,公式:dst = α·img1 + β·img2 + γ其中α + β = 1(通常),γ为亮度补偿值。

1. 基本用法
python 复制代码
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))  # 统一尺寸

# 图像混合(α=0.6, β=0.4, γ=0)
alpha = 0.6
beta = 0.4
gamma = 0
blended = cv2.addWeighted(img1, alpha, img2, beta, gamma)
2. 参数说明
  • alpha:第一幅图像的权重;
  • beta:第二幅图像的权重;
  • gamma:亮度调整值(可正可负)。
3. 渐变混合示例

通过调整权重实现图像渐变过渡:

python 复制代码
rows, cols = img1.shape[:2]
blended_gradient = np.zeros_like(img1)

for i in range(cols):
    # 列方向权重从1→0渐变
    alpha = 1 - i / cols
    beta = i / cols
    blended_gradient[:, i, :] = cv2.addWeighted(img1[:, i, :], alpha, img2[:, i, :], beta, 0)

三、单通道加法

对图像的特定通道进行加法操作,实现颜色调整:

python 复制代码
# 提取红色通道
r_channel = img[:, :, 2]

# 增加红色通道亮度
r_channel_bright = cv2.add(r_channel, np.ones_like(r_channel) * 80)

# 合并通道
img_red_bright = img.copy()
img_red_bright[:, :, 2] = r_channel_bright

四、掩码加法(cv2.add()带掩码)

通过掩码控制加法区域,仅对掩码非零区域进行加法:

python 复制代码
# 创建掩码(仅中心区域为白色)
mask = np.zeros_like(img1[:, :, 0], dtype=np.uint8)
mask[50:150, 50:150] = 255

# 仅在掩码区域混合图像
masked_add = cv2.add(img1, img2, mask=mask)

五、注意事项

  1. 图像尺寸匹配:加法运算要求两幅图像尺寸(高度、宽度、通道数)完全一致,否则报错;
  2. 数据类型 :若图像为float32类型,加法结果需手动截断到 [0, 255] 并转回uint8
  3. 溢出处理
    • 直接相加(NumPy):溢出取模,可能导致颜色失真;
    • cv2.add():饱和截断,更适合图像处理;
  4. 加权加法权重α + β > 1会使图像整体偏亮,α + β < 1会使图像偏暗。

六、完整示例

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

# 读取图像并统一尺寸
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))

# 1. 算术加法
img_add = cv2.add(img1, img2)
img_direct = img1 + img2

# 2. 加权混合
blended = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)

# 3. 显示结果
plt.figure(figsize=(15, 5))
plt.subplot(131), plt.imshow(cv2.cvtColor(img_direct, cv2.COLOR_BGR2RGB)), plt.title('Direct Add (Mod)')
plt.subplot(132), plt.imshow(cv2.cvtColor(img_add, cv2.COLOR_BGR2RGB)), plt.title('cv2.add (Saturate)')
plt.subplot(133), plt.imshow(cv2.cvtColor(blended, cv2.COLOR_BGR2RGB)), plt.title('Weighted Add')
plt.axis('off')
plt.show()

总结

图像加法运算的核心是选择合适的方法:

  • 亮度调整 :用cv2.add()加常数,避免溢出;
  • 图像融合 :用cv2.addWeighted()实现平滑混合;
  • 局部加法:结合掩码实现特定区域的叠加。

根据场景选择算术加法或加权加法,并注意尺寸匹配和溢出处理,可实现丰富的图像效果。

相关推荐
熊文豪38 分钟前
使用Python快速开发一个MCP服务器
服务器·开发语言·python·mcp
高洁0141 分钟前
卷积神经网络(CNN)
人工智能·python·深度学习·神经网络·transformer
Y_Chime43 分钟前
卷积到底是什么?卷积的底层实现原理
计算机视觉
安然无虞1 小时前
LoadRunner性能测试详解·下
python·测试工具·压力测试
信看1 小时前
CM4树莓派开机功能-1️⃣固定网卡
开发语言·python
帮帮志1 小时前
Jupyter使用的快捷键大全
ide·python·jupyter
CoovallyAIHub1 小时前
2025年值得关注的5款数据标注工具
深度学习·算法·计算机视觉
qq_463944861 小时前
Jupyter中输入标题的方法
ide·python·jupyter
Blossom.1181 小时前
基于Qwen2-VL+LayoutLMv3的智能文档理解系统:从OCR到结构化知识图谱的落地实践
开发语言·人工智能·python·深度学习·机器学习·ocr·知识图谱