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叠加的技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试总结】FFN(前馈神经网络)在Transformer模型中先升维再降维的原因

FFN(前馈神经网络)在Transformer模型中先升维再降维的设计具有多方面的重要原因,以下是对这些原因的总结: 1.目标与动机 高维映射空间:FFN的设计目的是通过一系列线性变换来拟合一个高维的映射空间,而不仅…

生成模型:生成对抗网络-GAN

1.原理 1.1 博弈关系 1.1.1 对抗训练 GAN的生成原理依赖于生成器和判别器的博弈 生成器试图生成以假乱真的样本。判别器试图区分真假样本。 这种独特的机制使GAN在图像生成、文本生成等领域表现出色。 具有表现为: 生成器 (Generator, G) 生成器的目标是从一个随机噪声&…

MongoDB基本操作

一、实验目的 1. 熟悉MongoDB的基本操作,包括CRUD(增加、读取、更新、删除)。 2. 理解MongoDB的文档型数据库特性和Shell的使用。 3. 培养学生通过命令行操作数据库的能力。 4. 强化数据库操作的实际应用能力。 二、实验环境准备 1.…

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件,通过设计微透镜,可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制,进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列(Microlens Array&#x…

AIGC视频生成模型:ByteDance的PixelDance模型

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍ByteDance的视频生成模型PixelDance,论文于2023年11月发布,模型上线于2024年9月,同时期上线的模型还有Seaweed&…

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍,Logstash进行自动采集服务器日志文件,并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式,可以在kibana中看到采集到的日志 日志流程 logfile-> l…

从入门到精通:RabbitMQ的深度探索与实战应用

目录 一、RabbitMQ 初相识 二、基础概念速览 (一)消息队列是什么 (二)RabbitMQ 核心组件 三、RabbitMQ 基本使用 (一)安装与环境搭建 (二)简单示例 (三)…

[苍穹外卖] 1-项目介绍及环境搭建

项目介绍 定位:专门为餐饮企业(餐厅、饭店)定制的一款软件产品 功能架构: 管理端 - 外卖商家使用 用户端 - 点餐用户使用 技术栈: 开发环境的搭建 整体结构: 前端环境 前端工程基于 nginx 运行 - Ngi…

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的,有利于深入理解串口通讯底层原理,但其开发效率较低;对此,我们这里再讲基于HAL库实现的串口通讯轮询案例,实现高效开发。当然,本次案例需求仍然和前面寄…

后端面试题分享第一弹(状态码、进程线程、TCPUDP)

后端面试题分享第一弹 1. 如何查看状态码,状态码含义 在Web开发和调试过程中,HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具: 在大多数浏览器中,您可以通过按下 F12 键或右键单击页面并选择“检查…

Apache Hive3定位表并更改其位置

Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…

OpenEuler学习笔记(九):安装 OpenEuler后配置和优化

安装OpenEuler后,可以从系统基础设置、网络配置、性能优化等方面进行配置和优化,以下是具体内容: 系统基础设置 更新系统:以root用户登录系统后,在终端中执行sudo yum update命令,对系统进行更新&#x…

Vue | 搭建第一个Vue项目(安装node,vue-cli)

一.环境搭建: 1.安装node: 进入网站,下载对应版本的node.js Index of /dist/ (nodejs.org) 我这里下载的是: 解压到对应的目录下: 并新建两个文件夹node_cache和node_global: 2.配置环境: …

日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件

日历热力图,月度数据可视化图表,vue组件 先看效果👇 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间,开始时间是 上一年的今天,例如2024/01/01 —— 2025/01/01,跨度刚…

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往: 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找,题…

[Computer Vision]实验三:图像拼接

目录 一、实验内容 二、实验过程及结果 2.1 单应性变换 2.2 RANSAC算法 三、实验小结 一、实验内容 理解单应性变换中各种变换的原理(自由度),并实现图像平移、旋转、仿射变换等操作,输出对应的单应性矩阵。利用RANSAC算法优…

FPGA自分频产生的时钟如何使用?

对于频率比较小的时钟,使用clocking wizard IP往往不能产生,此时就需要我们使用代码进行自分频,自分频产生的时钟首先应该经过BUFG处理,然后还需要进行时钟约束,处理之后才能使用。

【喜讯】海云安荣获“数字安全产业贡献奖”

近日,国内领先的数字化领域独立第三方调研咨询机构数世咨询主办的“2025数字安全市场年度大会”在北京成功举办。在此次大会上,海云安的高敏捷信创白盒产品凭借其在AI大模型技术方面的卓越贡献和突出的技术创新能力,荣获了“数字安全产业贡献…

ceph基本概念,架构,部署(一)

一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储,而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS),而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…

Markdown Viewer 浏览器, vscode

使用VS Code插件打造完美的MarkDown编辑器(插件安装、插件配置、markdown语法)_vscode markdown-CSDN博客 右键 .md 文件,选择打开 方式 (安装一些markdown的插件) vscode如何预览markdown文件 | Fromidea GitCode - 全球开发者…