当前位置: 首页 > news >正文

计算机视觉(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)

特点:

  • 会产生“回绕”现象(高亮区域变暗)。

结果:


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 列)

结果:

解析:([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. 注意事项

  1. 两幅图像必须 大小相同、通道数一致,否则需先使用 cv2.resize() 统一尺寸。

  2. 如果仅调整亮度,cv2.convertScaleAbs() 也可以实现,更快更安全。

  3. 加权运算的 α 与 β 不一定要加起来等于 1,但一般这样可以避免过度曝光。


5. 应用实例

  • 图像融合:将两张风景图柔和地合成一张。

  • 特效制作:用 NumPy 加法制造像素回绕的炫彩效果。

  • 亮度调节:用 cv2.addWeighted() 调节透明度和亮度。

http://www.dtcms.com/a/330576.html

相关文章:

  • 设计模式笔记_行为型_责任链模式
  • 【论文阅读 | CVPR 2024 | UniRGB-IR:通过适配器调优实现可见光-红外语义任务的统一框架】
  • linux 内核 - 内存管理的层次化结构
  • UE5配置MRQ编解码器输出MP4视频
  • Linux网络编程:应用层自定义协议与序列化
  • 《量子雷达》第5章 量子雷达发射机 预习2025.8.14
  • 人工智能——卷积神经网络自定义模型全流程初识
  • .NET 的 WebApi 项目必要可配置项都有哪些?
  • CPUcores-【硬核优化】CPU增强解锁全部内核!可优化游戏性能、提升帧数!启用CPU全内核+超线程,以更高优先级运行游戏!支持各种游戏和应用优化~
  • Mybatis学习笔记(四)
  • 【论文阅读】基于卷积神经网络和预提取特征的肌电信号分类
  • CSS isolation属性
  • NVIDIA Nsight Deep Learning Designer使用
  • 第3节 深度学习避坑指南:从过拟合到玄学优化
  • toRefs、storeToRefs实际应用
  • 分布式系统架构设计模式:从微服务到云原生
  • Flutter sqflite插件
  • Day57--图论--53. 寻宝(卡码网)
  • Nacos-4--Nacos1.x长轮询的理解
  • PiscTrace基于YOLO追踪算法的物体速度检测系统详解
  • 【软考中级网络工程师】知识点之入侵防御系统:筑牢网络安全防线
  • 【入门级-算法-2、入门算法:模拟法】
  • 解决“Win7共享文件夹其他电脑网络无法发现共享电脑名称”的问题
  • 融合服务器助力下的电视信息发布直播点播系统革新
  • 服务器装两个cpu
  • 1780. 判断一个数字是否可以表示成三的幂的和
  • MongoDB 从入门到生产:建模、索引、聚合、事务、分片与运维实战(含 Node.js/Python 示例)
  • 基于现代 C++ 的湍流直接数值模拟 (DNS) 并行算法优化与实现
  • 9.【C++进阶】继承
  • 河南萌新联赛2025第(五)场:信息工程大学”(补题)