计算机视觉(opencv)实战三——图像运算、cv2.add()、cv2.addWeighted()


图像运算详解:加法运算与加权运算

在数字图像处理中,图像运算 是基础且常用的操作之一。它能够对两幅图像或图像与常数进行加减乘除,从而实现亮度调整、融合叠加、特效制作等功能。本文将重点介绍 OpenCV 中的图像加法运算与加权运算,包括它们的底层规则与区别。

先准备两张图片:


1. 图像加法运算

图像加法运算可以用两种方式实现:

  • 直接使用 + 号运算符

  • 使用 cv2.add() 函数

虽然它们的写法类似,但处理结果有差异

+ 号运算规则(NumPy 方式)

当使用 + 对两个图像的像素进行加法时,遵循 取模(mod 256)规则

  • 如果某个像素位置的两个值相加后 小于 255,则结果等于它们的和;

  • 如果某个像素位置的两个值相加后 大于 255,结果会被截断,并对 256 取模,例如:

    复制代码
    250 + 10 = 260   →   260 - 256 = 4
            即:260   →   4

代码示例:

复制代码
import cv2

a = 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(不会回绕)。


主要特性

  1. 逐像素加法

    • 对图像中每个像素点分别计算 src1_pixel + src2_pixel

    • 适用于单通道(灰度)和多通道(BGR、RGBA)图像。

  2. 饱和运算(Saturation Arithmetic)

    • 如果加法结果大于 255,则直接设为 255。

    • 不会出现 + 号运算那种 取模回绕 现象。

    • 这保证了图像亮度不会出现意外变暗。

  3. 支持图像与常数相加

    • 如果要整体调亮,可以加上一个常数矩阵,常数会广播到每个像素。

基本语法

复制代码
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 列) **结果:** ![](https://i-blog.csdnimg.cn/direct/bd0e5ec4d8d740c1b4e182d41df0c47f.png) **解析:(\[255,255,255\]为白色)** **a+b的结果图片像素数值会回绕** **add(a,b)则会饱和到255** *** ** * ** *** ### 2. cv2.addWeighted()图像加权运算 有时我们需要将两幅图像**按比例融合** ,而不是简单相加。这时就可以使用 **加权和** 公式: ![](https://i-blog.csdnimg.cn/direct/f9580bcbefa74522ac77a3d8f9ba58d1.png) * **α(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。 ![](https://i-blog.csdnimg.cn/direct/85be67b63ba349b3b511ce7e8080d8af.png) *** ** * ** *** ### 3. 三种方式对比 | 方法 | 溢出处理方式 | 应用场景 | |---------------------|-------------------|---------------| | `+`(NumPy) | 取模(回绕) | 特殊视觉效果、循环色彩变换 | | `cv2.add()` | 饱和到 255 | 普通加法、避免溢出 | | `cv2.addWeighted()` | 饱和到 255(带权重和亮度调节) | 图像融合、透明度调整 | *** ** * ** *** ### 4. 注意事项 1. 两幅图像必须 **大小相同、通道数一致** ,否则需先使用 `cv2.resize()` 统一尺寸。 2. 如果仅调整亮度,`cv2.convertScaleAbs()` 也可以实现,更快更安全。 3. 加权运算的 α 与 β 不一定要加起来等于 1,但一般这样可以避免过度曝光。 *** ** * ** *** ### 5. 应用实例 * **图像融合**:将两张风景图柔和地合成一张。 * **特效制作**:用 NumPy 加法制造像素回绕的炫彩效果。 * **亮度调节** :用 `cv2.addWeighted()` 调节透明度和亮度。

相关推荐
独行soc7 分钟前
2025年大模型安全岗的面试汇总(题目+回答)
android·人工智能·安全·面试·职场和发展·渗透测试
CONDIMENTTTT12 分钟前
[机器学习]07-基于多层感知机的鸢尾花数据集分类
人工智能·机器学习
数据知道18 分钟前
机器翻译:Hugging Face库详解
人工智能·自然语言处理·机器翻译
Blossom.11837 分钟前
把大模型当“温度计”——基于 LLM 的分布式系统异常根因定位实战
人工智能·python·深度学习·机器学习·自然语言处理·分类·bert
adminwolf41 分钟前
支持小语种的在线客服系统,自动翻译双方语言,适合对接跨境海外客户
人工智能·自然语言处理·机器翻译
guidovans41 分钟前
基于大语言模型的爬虫数据清洗与结构化
人工智能·爬虫·语言模型·自然语言处理
金智维科技官方43 分钟前
财务自动化软件敏感数据泄露风险评估与防护措施
人工智能·安全·自动化·rpa
m0_6038887144 分钟前
Stable Diffusion Models are Secretly Good at Visual In-Context Learning
人工智能·ai·stable diffusion·论文速览
CV实验室1 小时前
ICCV 2025 | 4相机干掉480机位?CMU MonoFusion高斯泼溅重构4D人体!
人工智能·数码相机·计算机视觉·论文
Learn Forever2 小时前
【AI-ModelScope/bert-base-uncase】模型训练及使用
人工智能·深度学习·bert