python-opencv第六期:addWeighted函数详解

news2024/11/18 5:56:15

概要: 众嗦粥汁所周知,在如今计算机视觉(Computer Version short for CV)是人工智能与机器人技术发展的一个重大研究方向,而opencv作为一个专门为机器视觉编程提供技术与函数支持的第三方库,自然是一个需要重点研究的内容。

            本期所要介绍的函数是opencv库中的函数——addWeighted

            addWeighted函数的主要作用是将两张源图片以一定的权重进行混合,以满足日常生活中我们对于图片混合的需要。就像《超级战队系列》中萝卜(robot--即机器人)的合体一样,混合之后的图片将兼具不同图片的特点,从而可以多方面地满足我们的需求。

            从字面上看,“addWeighted”这个单词的主体就是两个单词——“add”和“weight”,用中文翻译一下就是“混合”与“权重”,加起来就是混合两张图片的权重,合成新图片的意思;从效果上来看,addWeighted函数可以使得在图片处理过程中得到类似于PS(Play StationPhotoShop)中图层叠加,附加图层透明化的效果,能够满足我们在图片处理过程中的通常性需要。

           本期为了展示addWeighted函数的图片混合效果要请出的是DC漫画中的超人与蝙蝠侠,在电影《蝙蝠侠大战超人:正义黎明》当中这两位超级英雄曾经大打出手,但作为正义联盟中的队友,最后还是要互相和解,以应对更大的外部威胁。而我们这期博客的展示部分也正是要通过超人的大“S”标志与蝙蝠侠的蝙蝠标志的融合来,展示这两位对于DC漫画具有代表性意义的超英的战斗历程。

            话不多说,我是Kamen Black君,马上开始今天的学习,我已经等不及力

 正文部分

print("祝大家每天快乐,love and peace!")

①使用准备:

与前几期一样,依旧是调用我们的工具人老伙伴----opencv,作为我们使用rectangle的大前提。

import cv2

②适用情况: 

addWeighted函数适用于在图片处理的过程中,当我们需要将两张不同的图片合成之时。要注意的是addWeighted所实现的图片合成倾向于将两张图片的特征都体现出来,并不是简单的图层叠加。而正因如此,可以根据需要,调整图片的权重,从而突出较为重要的图片内容,并得到令我们,满意的结果。

③语法说明:

使用语法:dst = cv2.addWeighted(src1, alpha, src2, beta, gamma,dst,dtype)

参数说明:首个dst:通过addWeighted函数进行图像处理之后得到的目标图像,数据类型为(array)数组类型;

                  src1、src2:使用addWeighted函数进行处理的两个源图像,数据类型也是(array)数组类型;

                  alpha、beta:两幅源图像在混合过程中的权重,前者为src1源图像的权重,后者为src2源图像的权重,两者的大小并不限制在1以内,只要在不出现报错(可以试试取个12!)的范围内,可以任意取值,数据类型为(double)双精度类型;

                  gamma:在两个源图像混合之后,如果对图像的亮度有所要求,则可以通过对gamma的值进行调整来进行对图片整体亮度的调节,如果数值为正则是提高亮度,如果数值为负则是降低亮度,数据类型为(double)双精度类型;

                  次个dst:与首个dst的说明相同,不再赘述(懒得ctrl+c了),默认为None;

                  dtype:目标图像的数组深度,即单个像素值的位数,默认为None。

补充说明:1、addWeighted函数的原理可以简单地用下面的公示来表示:

                        dst = src1 * alpha + src2 * beta + gamma。

                 2、 从参数名称我们也可以看出来——alpha、beta、gamma对应于希腊字母中的第一、二、三个字母阿尔法、贝塔以及伽马,就像是一家的三兄弟,虽然名称不同,但是它们所代表的意义是相同的,都是权重。只不过老大和老二都有了女朋友(对应于src1与src2),属于动态权重,都要和对应的目标图像数组相乘后再加入结果;而老三是个光棍,属于静态权重,直接加入结果。

                 3、两个源图像的大小与通道数要相同,不然会出现报错。(什么事都要讲究个门当户对啊!

下面另外附上addWeighted函数相关说明的原生文档,以供参考:

def addWeighted(src1: Mat, alpha, src2: Mat, beta, gamma, dts: Mat = ..., dtype=...) 
from __doc__
    """
    'addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst  
    . @brief Calculates the weighted sum of two arrays.   

    . The function addWeighted calculates the weighted sum of two arrays as follows:                          
    . \\f[\\texttt{dst} (I)= \\texttt{saturate} ( \\texttt{src1} (I)* \\texttt{alpha} +  \\texttt{src2} (I)* \\texttt{beta} +  \\texttt{gamma} )\\f] 
    . where I is a multi-dimensional index of array elements. In case of multi-channel arrays, each
    . channel is processed independently.   
    . The function can be replaced with a matrix expression:   
    . @code{.cpp}       
    . dst = src1*alpha + src2*beta + gamma;   
    . @endcode   
    . @note Saturation is not applied when the output array has the depth CV_32S. You may even get   
    . result of an incorrect sign in the case of overflow.   
    . @param src1 first input array.   
    . @param alpha weight of the first array elements.  
    . @param src2 second input array of the same size and channel number as src1.               
    . @param beta weight of the second array elements.  
    . @param gamma scalar added to each sum.   
    . @param dst output array that has the same size and number of channels as the input arrays.  
    . @param dtype optional depth of the output array; when both input arrays have the same depth, dtype   
    . can be set to -1, which will be equivalent to src1.depth().   
    . @sa  add, subtract, scaleAdd, Mat::convertTo'
    """
    pass

④实例操作:

下面通过超人标志与蝙蝠侠标志的混合来演示一下addWeighted函数的使用方法(海超人与大洋游侠合为一体超人与蝙蝠侠不打不相识):

1、首先,超人与蝙蝠侠平分秋色(alpha:0.5,beta:0.5,gamma:0):

import cv2

superman = cv2.imread("f:/superman.jpg")
h,w,c = superman.shape
batman = cv2.imread("f:/batman.jpg")
batman = cv2.resize(batman,(w,h))
batman_superman = cv2.addWeighted(superman,0.5,batman,0.5,gamma=0)
cv2.imshow("batman&superman",batman_superman)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("f:/batman&superman1.png",batman_superman)

2、其后,超人在战斗中更胜一筹(alpha:0.8,beta:0.2,gamma:0):

import cv2

superman = cv2.imread("f:/superman.jpg")
h,w,c = superman.shape
batman = cv2.imread("f:/batman.jpg")
batman = cv2.resize(batman,(w,h))
batman_superman = cv2.addWeighted(superman,0.8,batman,0.2,gamma=0)
cv2.imshow("batman&superman",batman_superman)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("f:/batman&superman2.png",batman_superman)

 

3、接着,蝙蝠侠扳回一局(alpha:0.2,beta:0.8,gamma:0):

import cv2

superman = cv2.imread("f:/superman.jpg")
h,w,c = superman.shape
batman = cv2.imread("f:/batman.jpg")
batman = cv2.resize(batman,(w,h))
batman_superman = cv2.addWeighted(superman,0.2,batman,0.8,gamma=0)
cv2.imshow("batman&superman",batman_superman)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("f:/batman&superman3.png",batman_superman)

 

4、似乎,只能两败俱伤,前途一片灰暗(alpha:0.5,beta:0.5,gamma:-150):

import cv2

superman = cv2.imread("f:/superman.jpg")
h,w,c = superman.shape
batman = cv2.imread("f:/batman.jpg")
batman = cv2.resize(batman,(w,h))
batman_superman = cv2.addWeighted(superman,0.5,batman,0.5,gamma=-150)
cv2.imshow("batman&superman",batman_superman)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("f:/batman&superman4.png",batman_superman)

 

5、最后,出现更大的外部威胁,两人和解,前途一片光明(alpha:0.5,beta:0.5,gamma:90)

import cv2

superman = cv2.imread("f:/superman.jpg")
h,w,c = superman.shape
batman = cv2.imread("f:/batman.jpg")
batman = cv2.resize(batman,(w,h))
batman_superman = cv2.addWeighted(superman,0.5,batman,0.5,gamma=90)
cv2.imshow("batman&superman",batman_superman)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("f:/batman&superman5.png",batman_superman)

 

最后经过激烈的战斗,超人与蝙蝠侠经过激烈的战斗,发现世界中黑暗势力的威胁的严重程度要远远大于他们两人之间的矛盾与成见,之后他们加入正义联盟,从此过上了幸福的生活从此开始作为战友共同对抗对世界造成威胁的恶势力,真是可喜可贺,可喜可贺啊,欧迈带托!EVA厨又发病了

 结语:本期中我们学习了addWeighted函数,了解到opencv中如何使用addWeighted函数来进行图像的混合,使得我们可以得到更能够符合操作需要的图像,虽然只是简单的操作,但是对于我们在图像处理学习过程中对于处理原理的理解确实是饶有好处的。所谓,不积跬步,无以至千里;不积小流,无以成江海。路都是一个一个脚印实实在在地走出来的,希望看到这里的各位同好都能脚踏实地,翻过一座又一座人生的大山,想看的那片海就会离我们越来越近。

好了以上就是所有的内容,希望大家多多关注点赞收藏,这对我有很大的帮助。谢谢大家了!

 

好了,这里是Kamen Black君。祝国康家安,大家下次再见喽!!!溜溜球~~ 

  

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

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

相关文章

Devops简介

Devops DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和**质量保障(QA)**部门之间的沟通、协作与整合。 其目的就是让开发人员和运维人员更好的沟通合作的文化、运动或惯例,通过自动化交付流程来使软件开发&#x…

牛客网C基础题目练习1

目录题目1:竞选社长题目2:最高分数题目3:判断是元音还是辅音题目4:判断是不是字母题目5:字母大小写转换题目1:竞选社长💭法1:使用字符串数组代码实现:int main() {char a…

【按位考虑DP】代码源每日一题div1 2023.02.02 与

与 - 题目 - Daimayuan Online Judge这太酷了,很符合我对DP的想象这DP太妙了,我还没做过这种按位考虑DP的题题意:思路:首先看第二个条件,一个数与后面的那个数与了之后还是后面那个数,这说明什么我们按位考…

快速入门KMM和Compose Multiplatform

一、前言 最近才有空,想起来Compose-jb和kmm这2个框架,就来个快速入门指南吧。 什么是KMM (Kotlin Multiplatform Mobile) KMM用于简化跨平台开发,可以在Android和IOS之间共享通用的代码。 仅在使用各自平台能力的时候,才会去编…

解决前端组件渲染没更新数据问题

问题: 使用前端日期控件时 - 数据联动时数据绑定无效问题 现象: 选择A日期,想动态改变B日期数据,只有第一次选择时会动态改变B日期数据,第二次选择A日期时,B日期数据虽已改变,但是页面数据未改变…

电子邮件备份软件:Email Backup Wizard Crack

适用于所有用户的电子邮件备份软件 在您的计算机、台式机或硬盘驱动器上本地创建您的电子邮件帐户的备份。 下载并保存电子邮件以备后用。 如果您想备份和移动服务器电子邮件,请尽快获取备份工具。 通过简单直观的功能获得强大的结果 苹果系统邮箱备份向导 - 批量下…

C++ · 类和对象 · 03 | 深化理解

啊我摔倒了..有没有人扶我起来学习.... 👱个人主页:《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ 💒个人社区:《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

Python tkinter -- 第18章 画布控件之椭圆

**18.2.18 create_oval(bbox, options) 根据限定矩形 bbox 在画布上创建一个椭圆。 (1)bbox:定义要创建对象的边界(x1, y1, x2, y2) (2)options:创建椭圆的选项。选项的具体含义: 选项含义activedash当鼠标…

微信小程序+前端+天行数据垃圾图像识别接口API

文章目录 前言 步骤 1. 去到天行数据官网注册账号,去到接口的介绍网站 2. 去测试网站,先看看请求的格式 3. 小程序端我采用的是把网站上的url链接的网络图片转成base64编码后的形式作为传入参数,这里需要有点基础,因为只给上了…

JVM基础 - 类加载的过程

类加载的过程加载验证准备解析初始化使用卸载其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的。而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始&…

RFID技术在生产企业的集成应用分析

RFID技术在生产企业的集成应用分析1.RFID的主要功能RFID自动识别功能RFID标签的主要核心部件是一个电子芯片,芯片中存储着能够识别目标的信息。RFID标签具有持久性、信息接收传播穿透性强、存储信息容量大、种类多等特点。有些RFID标签支持读写功能,目标…

CHAPTER 15 Mesos(一)

Mesos-优秀的集群资源调度平台15.1 Mesos简介15.2 Mesos安装与使用1. 安装1. 源码编译2. 软件源安装3. Docker方式安装2. 配置说明1. ZooKeepr2. Mesos3. Marathon3.访问Mesos图形界面4.访问Marathon图形界面1. 通过界面方式2. REST API方式15.3 原理与架构1. 架构2. 基本单元3…

CentOS7中安装Hadoop3详细步骤

目录 (一)新建一个虚拟机 (二)配置网络 (三)安装vim工具 (四)设置ssh免密登录 (五)设置时间同步 (六)修改主机名 1.方法一 2.方法二 (七)给主机文件添加IP名称映射 (八)安装JDK8 (九)安装Hadoop 1.打开Xftp,连接虚拟机,在/opt目录下新建两个…

[引擎开发] 现代图形API - metal篇

Metal是苹果开发的图形计算接口,它是在移动端出现的比较早的现代图形API。本文将更侧重于移动端(IOS),对metal的API做一个大致的引入介绍。 Apple GPU概述 在我们对Metal进行介绍前,先来了解一下Apple GPU。 Apple GP…

Linux常用命令——printf命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) printf 格式化并输出结果 补充说明 printf命令格式化并输出结果到标准输出。 语法 printf(选项)(参数) --help:在线帮助; --version:显示版本信息。参数 输出格式&#x…

第1讲 谈谈你对Java平台的理解?

第1讲 | 谈谈你对Java平台的理解? 从你接触 Java 开发到现在,你对 Java 最直观的印象是什么呢?是它宣传的 “Write once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度…

《你不会还没入门jvm调优吧》之前置知识

该文章为科普文,所以很多细节涉及不到,旨在指引入门,同事在聊的时候不至于插不上话,顺带回顾部分JVM相关知识。准备好了吗,开始发车。如有不正确的地方,欢迎批评指正。 目录 JVM调优调的到底是什么 回顾…

Linux(CentOS 7)--gdb的基本调试指令

一下面的代码为例介绍一下linux中&#xff0c;gdb调试的基本指令 创建一个文件myfile.c&#xff0c;文件代码内容如下 1 #include <stdio.h>2 3 int Add(int x, int y)4 {5 6 return xy; …

高性能消息队列中间件MQ_part2

接上一篇part1的内容 RabbitMQ通配符模式_编写消费者 接下来我们编写通配符模式的消费者&#xff1a; // 站内信消费者 public class Customer_Station {public static void main(String[] args) throws IOException, TimeoutException {// 1.创建连接工厂ConnectionFactory…

springboot引入flink,maven打包插件需替换

目录说明说明 springboot引入flink后&#xff0c;如果要打包&#xff0c;传统的maven不行&#xff0c;要更换指定插件 <build><finalName>flink</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><art…