概要: 众嗦粥汁所周知,在如今计算机视觉(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君。祝国康家安,大家下次再见喽!!!溜溜球~~