计算机视觉(opencv)实战三——图像运算、cv2.add()、cv2.addWeighted()
图像运算详解:加法运算与加权运算
在数字图像处理中,图像运算是基础且常用的操作之一。它能够对两幅图像或图像与常数进行加减乘除,从而实现亮度调整、融合叠加、特效制作等功能。本文将重点介绍 OpenCV 中的图像加法运算与加权运算,包括它们的底层规则与区别。
先准备两张图片:
1. 图像加法运算
图像加法运算可以用两种方式实现:
直接使用
+
号运算符使用
cv2.add()
函数
虽然它们的写法类似,但处理结果有差异。
+
号运算规则(NumPy 方式)
当使用 +
对两个图像的像素进行加法时,遵循 取模(mod 256)规则:
如果某个像素位置的两个值相加后 小于 255,则结果等于它们的和;
如果某个像素位置的两个值相加后 大于 255,结果会被截断,并对 256 取模,例如:
250 + 10 = 260 → 260 - 256 = 4即:260 → 4
代码示例:
import cv2a = cv2.imread('penguin.jpg')
c = a + 10 # 整体亮度+10
cv2.imshow('a+10', c)
cv2.waitKey(0)
特点:
会产生“回绕”现象(高亮区域变暗)。
结果:
2 cv2.add()运算
原理:
cv2.add()
是 OpenCV 提供的逐像素加法运算函数,用于将两幅图像或图像与常数进行加法处理。
在数学上,它实现的是:
当使用 cv2.add()
时,规则不同:
如果相加结果 小于 255,则直接为相加之和;
如果相加结果 大于 255,则直接 饱和为 255(不会回绕)。
主要特性
逐像素加法
对图像中每个像素点分别计算
src1_pixel + src2_pixel
。适用于单通道(灰度)和多通道(BGR、RGBA)图像。
饱和运算(Saturation Arithmetic)
如果加法结果大于 255,则直接设为 255。
不会出现
+
号运算那种 取模回绕 现象。这保证了图像亮度不会出现意外变暗。
支持图像与常数相加
如果要整体调亮,可以加上一个常数矩阵,常数会广播到每个像素。
基本语法
dst = cv2.add(src1, src2, dtype=None, mask=None)
参数说明:
src1, src2
输入的两幅图像(大小、通道数必须一致),也可以是常数矩阵。dtype
可选,输出图像的数据类型;若为None
则和输入相同。mask
可选掩膜,只在掩膜为非零的区域执行加法,其余区域保持原值。
代码示例:
d = a[0:500,500:1000]+b[0:500,0:500]
e = cv2.add(a[0:500,500:1000],b[0:500,0:500]) # 使用 cv2.add()
cv2.imshow('a+b',d)
cv2.imshow('add(a,b)',e)
cv2.waitKey(0)
切割:
[0:500, 500:1000]表示数组切片,选取图像的某个矩形区域。
0:500
→ 高度方向(y 轴):从第 0 行到第 499 行(共 500 行)500:1000
→ 宽度方向(x 轴):从第 500 列到第 999 列(共 500 列)
结果:
解析:([255,255,255]为白色)
a+b的结果图片像素数值会回绕
add(a,b)则会饱和到255
2. cv2.addWeighted()图像加权运算
有时我们需要将两幅图像按比例融合,而不是简单相加。这时就可以使用 加权和 公式:
α(alpha):第一幅图像的权重
β(beta):第二幅图像的权重
γ(gamma):亮度偏移值(常数)
基本语法
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
参数说明
参数 | 说明 |
---|---|
src1 | 第一张输入图像(矩阵) |
alpha | 第一张图像的权重系数 |
src2 | 第二张输入图像(矩阵),大小、通道必须与 src1 相同 |
beta | 第二张图像的权重系数 |
gamma | 亮度调整常数,直接加到最终结果上 |
代码示例:
a = cv2.resize(a, (800, 600))
b = cv2.resize(b, (800, 600))# α = 0.6, β = 0.4, γ = 10
f = cv2.addWeighted(a, 0.6, b, 0.4, 10)
cv2.imshow('addWeighted', f)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:
0.6 和 0.4 表示 a 图像占 60%,b 图像占 40%。
γ = 10 表示整体亮度提升 10。
3. 三种方式对比
方法 | 溢出处理方式 | 应用场景 |
---|---|---|
+ (NumPy) | 取模(回绕) | 特殊视觉效果、循环色彩变换 |
cv2.add() | 饱和到 255 | 普通加法、避免溢出 |
cv2.addWeighted() | 饱和到 255(带权重和亮度调节) | 图像融合、透明度调整 |
4. 注意事项
两幅图像必须 大小相同、通道数一致,否则需先使用
cv2.resize()
统一尺寸。如果仅调整亮度,
cv2.convertScaleAbs()
也可以实现,更快更安全。加权运算的 α 与 β 不一定要加起来等于 1,但一般这样可以避免过度曝光。
5. 应用实例
图像融合:将两张风景图柔和地合成一张。
特效制作:用 NumPy 加法制造像素回绕的炫彩效果。
亮度调节:用
cv2.addWeighted()
调节透明度和亮度。