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,一经查实,立即删除!

相关文章

C# 委托(Delegate)的使用方法及使用场景

C# 委托的使用方法及使用场景 委托(Delegate)是 C# 中的一种类型,表示对方法的引用。通过委托,您可以将方法作为参数传递,或者将多个方法封装在一起进行调用。委托在 C# 中非常重要,广泛应用于事件驱动编程…

【面试总结】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…

linux环境变量配置文件区别 /etc/profile和~/.bash_profile

在 Linux 系统中,环境变量可以定义用户会话的行为,而这些变量的加载和配置通常涉及多个文件,如 ~/.bash_profile 和 /etc/profile。这些文件的作用和加载时机各有不同。以下是对它们的详细区别和用途的说明: 文章目录 1. 环境变量…

理解 Rust 的所有权:内存管理的独特之道

一、什么是所有权? 所有权是一种内存管理方式,它通过一套规则确保程序在运行时不会出现内存泄漏或其他内存问题。在不同编程语言中,内存管理通常有以下几种方式: 垃圾回收(Garbage Collection, GC)&#…

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

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

Windows 通过 openssh 连接 Ubuntu 24.04 LTS

Ubuntu 24.04 LTS Ubuntu 配置 sudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh sudo systemctl status ssh sudo ufw status sudo ufw allow ssh sudo ufw reload sudo ufw status安装 OpenSSH 服务器 首先&#xff…

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

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

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

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

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

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

Docker使用 使用Dockerfile来创建镜像

本篇文章主要介绍了Docker使用Dockerfile来创建镜像, 本文学习Dcokerfile的基本命令,并且创建一个支持ssh服务的镜像. 1.Dockerfile 1.1基本案例 基本案例 dockerfile可以说是docker的描述符,该文件定义了docker镜像的所能拥有哪些东西.基本格式如下: 第一行指定…

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

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

IJK播放器问题集

IJK播放器问题集 在使用ijkplayer进行播放时候,时常会遇到一些问题,故记录下: 1 ijkplayer出现小窗切换到大窗画面卡住问题 检查是否大小窗口切换时候,频繁设置了surface。某些底层api频繁设置会导致画面不动。 //holder判断是…

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

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

“推理”(Inference)在深度学习和机器学习的语境

“推理”(Inference)在深度学习和机器学习的语境中,是指使用经过训练的模型对新数据进行预测的过程。将其简单地理解为“模型的应用阶段”。在这一阶段,我们不再进行模型训练,而是利用已训练好且保存下来的模型来获取对…

简识JVM栈帧中的操作数栈

在JVM(Java虚拟机)中,栈帧(Stack Frame)是方法执行时的数据结构,用于存储局部变量、操作数栈、方法返回地址等信息。 其中,操作数栈(Operand Stack)是栈帧中的一个重要组…

我国的金融组织体系,还有各大金融机构的分类,金融行业的组织

中国金融组织体系介绍 中国金融组织体系是一个复杂而多层次的系统,涵盖了各种类型的金融机构和监管机构。以下是关于中国金融组织体系的详细介绍,包括一行三会等金融监管机构,各大金融机构的分类、涉及的银行以及行业组织。 (一…

OpenCV相机标定与3D重建(66)对立体匹配生成的视差图(disparity map)进行验证的函数validateDisparity()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用左右检查来验证视差。矩阵 “cost” 应该由立体对应算法计算。 cv::validateDisparity 函数是 OpenCV 库中用于对立体匹配生成的视差图&…