python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加
【1】引言
前序已经学习了直接在画布上使用掩模,会获得彩色图像的多种叠加效果,相关文章链接为:
python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖-CSDN博客
这时候如果更进一步,直接用两张图片互相叠加,是否会有新的图像出现?这就是本次文章想讨论的内容。
在更早的时候,我们已经掌握了对灰度图像的掩模操作:
python学opencv|读取图像(九)用numpy创建黑白相间灰度图_numpy生成全黑图片-CSDN博客
因此,这种图片叠加的操作,应该可以同时作用于灰度图像和彩色图像。
探索图像的叠加效果,需要使用的函数是cv2.add()。
【2】官网教程
点击下述链接,可以直达cv2.add()函数官网说明:
OpenCV: Operations on arrays
官网页面关于cv2.add()函数的说明为:

图1
具体的各个参数的意义为:
void cv::add ( InputArray src1, #输入图像1
InputArray src2, #输入图像2
OutputArray dst, #输出图像2
InputArray mask = noArray(), #掩模
int dtype = -1 ) #输出图像的深度,为默认值,暂无需关注
【3】代码测试
【3.1】灰度图像
首先是引入cv2等模块和原始图像:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcf.png',0) #读取图像
dst=src#输出图像
然后进行图形叠加操作:
#图像叠加
dst1=dst+dst #图像使用“+”叠加
dst2=cv.add(dst,dst) #图像使用“cv.add()函数”叠加
然后在屏幕上展示图像:
#在屏幕展示效果
cv.imshow('srcdst', dst) # 在屏幕展示效果
cv.imshow('srcdst1', dst1) # 在屏幕展示效果
cv.imshow('srcdst2', dst1) # 在屏幕展示效果
为探寻实际的叠加效果,读取了特定像素点的BGR值:
#显示BGR值
print("dst像素数为[258,258]位置处的BGR=", dst[258, 258]) # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[258,258]位置处的BGR=", dst1[258,258]) # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[258,258]位置处的BGR=", dst2[258,258]) # 获取像素数为[100,100]位置处的BGR
print("dst像素数为[100,100]位置处的BGR=", dst[100, 100]) # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[100,100]位置处的BGR=", dst1[100,100]) # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100,100]) # 获取像素数为[100,100]位置处的BGR
之后保存相关图像:
#保存图像
cv.imwrite('srcf-dst.png', dst) # 保存图像
cv.imwrite('srcf-dst1.png', dst1) # 保存图像
cv.imwrite('srcf-dst2.png', dst2) # 保存图像cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
本文使用的原始图像为:

图2 原始图像
叠加后的图像效果为:

图3 图像使用“+”叠加-灰度图像

图4 图像使用“cv.add()函数”叠加-灰度图像
由图3和图4对比可见:图4相对来说更亮。
这时候,再看特定点的BGR值:

图5 特定像素点BGR值-灰度图像
在像素点[258,258]获得的原始图像dst对应的BGR=71,dst1和dst2在该点对应的BGR=142=2*71,可以明显看到使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加。
在像素点[100,100]获得的原始图像dst对应的BGR=156,dst1在该点对应的BGR=56,dst2在该点对应的BGR=255。实际上,使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加,但对于使用“+”叠加,像素点BGR值超过255后会重新计数,57=156*2-255,但由于像素点是从0开始计算,所以第57个数对应的BGR值为56;使用和“cv.add()函数”叠加,像素点BGR值超过255后会直接截断为255。
【3.2】彩色图像
之后进行彩色图像的零值和反零值处理,这只需要改一行代码,将src = cv.imread('srcun.png',0)改为:
src = cv.imread('srcun.png') #读取图像
直接输出完整代码:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcf.png') #读取图像
dst=src#输出图像#图像叠加
dst1=dst+dst #图像使用“+”叠加
dst2=cv.add(dst,dst) #图像使用“cv.add()函数”叠加#在屏幕展示效果
cv.imshow('srcdst', dst) # 在屏幕展示效果
cv.imshow('srcdst1', dst1) # 在屏幕展示效果
cv.imshow('srcdst2', dst2) # 在屏幕展示效果#显示BGR值
print("dst像素数为[258,258]位置处的BGR=", dst[258, 258]) # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[258,258]位置处的BGR=", dst1[258,258]) # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[258,258]位置处的BGR=", dst2[258,258]) # 获取像素数为[100,100]位置处的BGR
print("dst像素数为[100,100]位置处的BGR=", dst[100, 100]) # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[100,100]位置处的BGR=", dst1[100,100]) # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100,100]) # 获取像素数为[100,100]位置处的BGR#保存图像
cv.imwrite('srcf-c-dst.png', dst) # 保存图像
cv.imwrite('srcf-c-dst1.png', dst1) # 保存图像
cv.imwrite('srcf-c-dst2.png', dst2) # 保存图像cv.waitKey() # 图像不会自动关闭
cv.destroyAllWindows() # 释放所有窗口
代码运行后获得的图像效果为:

图6 图像使用“+”叠加-灰度图像

图7 图像使用“cv.add()函数”叠加-彩色图像
此时的特定像素点BGR值为:

图8 特定像素点BGR值-彩色图像
对像素点[258,258]和像素点[100,100]获得的原始图像dst对应的BGR和叠加后的图像dst1、dst2在该点对应的BGR分析可知:使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加,但对于使用“+”叠加,像素点BGR值超过255后会重新计数;使用和“cv.add()函数”叠加,像素点BGR值超过255后会直接截断为255。

图9 对比效果
【4】细节说明
如果相互叠加的两个图像原本对应的BGR值分别为BGR1和BGR2,使用“+”叠加时,重新计数的BGR=BGR1+BGR2-255-1。
【5】总结
掌握了python+opencv实现各个像素点BGR叠加的技巧。
相关文章:
python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加
【1】引言 前序已经学习了直接在画布上使用掩模,会获得彩色图像的多种叠加效果,相关文章链接为: python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖-CSDN博客 这时候如果更进一步,直接…...
Spring MVC和Spring WebFlux的区别
目录 一、编程模型 二、IO处理方式 三、数据流处理 四、适用场景 五、生态系统 在当今的Web开发领域,Spring框架无疑占据着重要的地位。其中,Spring MVC和Spring WebFlux作为Spring框架中用于构建Web应用程序的两个重要模块,各自具有独特…...
Linux探秘坊-------4.进度条小程序
1.缓冲区 #include <stdio.h> int main() {printf("hello bite!");sleep(2);return 0; }执行此代码后,会 先停顿两秒,再打印出hello bite,但是明明打印在sleep前面,为什么会后打印呢? 因为ÿ…...
Llama 3:开源大模型的里程碑式突破
标题:Llama 3:开源大模型的里程碑式突破 文章信息摘要: Meta通过Llama 3展现了开源LLM的重大突破:采用超大规模训练数据和多阶段训练方法(SFT、rejection sampling、PPO和DPO),突破了传统的Chi…...
计算机网络 (56)交互式音频/视频
一、定义与特点 定义:交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术,包括语音、视频图像等多媒体实时通信。 特点: 实时性:音频和视频数据是实时传输和播放的,用户之间可以进行即时的交流。交互…...
STM32 GPIO工作模式
GPIO工作模式 1. GPIO简介2. GPIO工作模式2.1 输入浮空2.2 输入上拉2.3 输入下拉2.4 模拟2.5 开漏输出2.6 推挽输出2.7 开漏式复用功能2.8 推挽式复用功能 1. GPIO简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片的 GPI…...
自动化实现的思路变化
阶段一: 1、成功调用。第一步,一般是用现用的工具,或者脚本成功调用接口 2、解决关联接口的参数传递。有的接口直接,存在参数的传递,一般的思路,就是将这个参数设置为变量。 3、简化代码。总会有些东西是重…...
MongoDB的索引与聚合
一、实验目的 1. 理解索引的概念及其在MongoDB中的重要性和作用。 2. 学习如何选择适合建立索引的字段。 3. 掌握如何创建、删除索引以及如何强制使用索引。 4. 熟悉MongoDB的聚合框架和MapReduce工具,以及简单聚合命令的使用。 二、实验环境准备 1. JAV…...
Java菜鸟养成计划(java基础)--java运算符
java中的运算符 1、java中的运算符1.1 、 、-、 * 、/ 、 %1.2 、、-、 *、/、%1.3 、、--【自增\自减运算符】1.4、>、 <、 > 、< 、 、! 、! 1.5、&&、||、|、&1.6、&、|、~、^1.7、>> 、 <<、>>>位运算1.8、?:三目运算符…...
除了基本的事件绑定,鸿蒙的ArkUI
鸿蒙操作系统(HarmonyOS)是由华为技术有限公司开发的分布式操作系统,旨在为多种智能设备提供一个统一的操作平台。它不仅适用于智能手机,还适用于平板电脑、智能手表、智能电视等物联网设备。为了使开发者能够更加便捷地创建跨设备…...
0164__【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os
【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os_gcc -o0-CSDN博客...
vue3组件传值具体使用
问: left.vue文件调用接口获取了后端返回的urlLink字段,我该怎么传递给总的父组件index.vue中,我需要点击父组件的一个按钮来触发跳转? 回答: 在 Vue 3 中使用 TypeScript 和 setup 语法糖时,可以通过 e…...
Web 音视频(二)在浏览器中解析视频
前言 浏览器中已经能直接播放视频,为什么还需要手动写代码解析? 因为,某些场景需要对视频进行更细致的处理,比如截取关键帧、提取视频中的文字、人物打码、极低延时播放视频等等。 总之,除了最单纯的视频播放外&…...
江天科技主要产品销售单价下滑,应收账款、存货周转率大幅下降
《港湾商业观察》廖紫雯 日前,苏州江天包装科技股份有限公司(以下简称:江天科技)冲击北交所,保荐机构为国投证券。 江天科技主要从事标签印刷产品的研发、生产与销售,公司主要产品包括薄膜类和纸张类的不…...
我国的金融组织体系,还有各大金融机构的分类,金融行业的组织
中国金融组织体系介绍 中国金融组织体系是一个复杂而多层次的系统,涵盖了各种类型的金融机构和监管机构。以下是关于中国金融组织体系的详细介绍,包括一行三会等金融监管机构,各大金融机构的分类、涉及的银行以及行业组织。 (一…...
vue md5加密
在Vue中使用MD5加密,你可以使用第三方库如crypto-js。首先,你需要安装这个库: npm install crypto-js --save然后,在你的Vue组件中引入crypto-js并使用其MD5功能: <template><div><input v-model&quo…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证7)
本文验证基于请求头中传递token信息的认证方式,webapi项目的控制器类中新建如下函数,仅通过验证的客户端能调用,需要客户端请求在Header中添加’Authorization’: Bearer token’的键值对且通过token验证后才能调用。 [Authorize] [HttpGet]…...
Ubuntu16.04 安装OpenCV4.5.4 避坑
Ubuntu16.04 安装C版OpenCV4.5.4 Ubuntu16.04 VSCode下cmakeclanglldb调试c 文章目录 Ubuntu16.04 安装C版OpenCV4.5.41. 下载Opencv压缩包2. 安装Opencv-4.5.43. 配置OpenCV的编译环境4.测试是否安装成功 1. 下载Opencv压缩包 下载Opencv压缩包,选择source版本。…...
DDD - 整洁架构_解决技术设计困局
文章目录 Pre如何落地 DDD底层技术的更迭 整洁架构的设计主动适配器/北向适配器被动适配器/南向适配器 整洁架构的落地总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…...
Python自动化运维:一键掌控服务器的高效之道
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在互联网和云计算高速发展的今天,服务器数量的指数增长使得手动运维和管理变得异常繁琐。Python凭借其强大的可读性和丰富的生态系统,成为…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
LeetCode - 148. 排序链表
目录 题目 思路 基本情况检查 复杂度分析 执行示例 读者可能出的错误 正确的写法 题目 148. 排序链表 - 力扣(LeetCode) 思路 链表归并排序采用"分治"的策略,主要分为三个步骤: 分割:将链表从中间…...
