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凭借其强大的可读性和丰富的生态系统,成为…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
