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)
五、注意事项
- 图像尺寸匹配:加法运算要求两幅图像尺寸(高度、宽度、通道数)完全一致,否则报错;
- 数据类型 :若图像为
float32类型,加法结果需手动截断到 [0, 255] 并转回uint8; - 溢出处理 :
- 直接相加(NumPy):溢出取模,可能导致颜色失真;
cv2.add():饱和截断,更适合图像处理;
- 加权加法权重 :
α + β > 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()实现平滑混合; - 局部加法:结合掩码实现特定区域的叠加。
根据场景选择算术加法或加权加法,并注意尺寸匹配和溢出处理,可实现丰富的图像效果。