概要: 眾嗦粥汁所周知,在如今計(jì)算機(jī)視覺(Computer Version?short for CV)是人工智能與機(jī)器人技術(shù)發(fā)展的一個(gè)重大研究方向,而opencv作為一個(gè)專門為計(jì)算機(jī)視覺編程提供技術(shù)與函數(shù)支持的第三方庫,自然是一個(gè)需要重點(diǎn)研究的內(nèi)容。
? ? ? ? ? ? 本期所要介紹的函數(shù)是opencv庫中的函數(shù)——addWeighted。
? ? ? ? ? ? addWeighted函數(shù)的主要作用是將兩張?jiān)磮D片以一定的權(quán)重進(jìn)行混合,以滿足日常生活中我們對(duì)于圖片混合的需要。就像《超級(jí)戰(zhàn)隊(duì)系列》中蘿卜(robot--即機(jī)器人)的合體一樣,混合之后的圖片將兼具不同圖片的特點(diǎn),從而可以多方面地滿足我們的需求。
? ? ? ? ? ? 從字面上看,“addWeighted”這個(gè)單詞的主體就是兩個(gè)單詞——“add”和“weight”,用中文翻譯一下就是“混合”與“權(quán)重”,加起來就是混合兩張圖片的權(quán)重,合成新圖片的意思;從效果上來看,addWeighted函數(shù)可以使得在圖片處理過程中得到類似于PS(Play StationPhotoShop)中圖層疊加,附加圖層透明化的效果,能夠滿足我們?cè)趫D片處理過程中的通常性需要。
? ? ? ? ? ?本期為了展示addWeighted函數(shù)的圖片混合效果要請(qǐng)出的是DC漫畫中的超人與蝙蝠俠,在電影《蝙蝠俠大戰(zhàn)超人:正義黎明》當(dāng)中這兩位超級(jí)英雄曾經(jīng)大打出手,但作為正義聯(lián)盟中的隊(duì)友,最后還是要互相和解,以應(yīng)對(duì)更大的外部威脅。而我們這期博客的展示部分也正是要通過超人的大“S”標(biāo)志與蝙蝠俠的蝙蝠標(biāo)志的融合來,展示這兩位對(duì)于DC漫畫具有代表性意義的超英的戰(zhàn)斗歷程。
? ? ? ? ? ??話不多說,我是Kamen Black君,馬上開始今天的學(xué)習(xí),我已經(jīng)等不及力。
?正文部分:
print("祝大家每天快樂,love and peace!")
①使用準(zhǔn)備:
與前幾期一樣,依舊是調(diào)用我們的工具人老伙伴----opencv,作為我們使用rectangle的大前提。
import cv2
②適用情況:?
addWeighted函數(shù)適用于在圖片處理的過程中,當(dāng)我們需要將兩張不同的圖片合成之時(shí)。要注意的是addWeighted所實(shí)現(xiàn)的圖片合成傾向于將兩張圖片的特征都體現(xiàn)出來,并不是簡單的圖層疊加。而正因如此,可以根據(jù)需要,調(diào)整圖片的權(quán)重,從而突出較為重要的圖片內(nèi)容,并得到令我們,滿意的結(jié)果。
③語法說明:
使用語法:dst = cv2.addWeighted(src1, alpha, src2, beta, gamma,dst,dtype)
參數(shù)說明:首個(gè)dst:通過addWeighted函數(shù)進(jìn)行圖像處理之后得到的目標(biāo)圖像,數(shù)據(jù)類型為(array)數(shù)組類型;
? ? ? ? ? ? ? ? ? src1、src2:使用addWeighted函數(shù)進(jìn)行處理的兩個(gè)源圖像,數(shù)據(jù)類型也是(array)數(shù)組類型;
? ? ? ? ? ? ? ? ? alpha、beta:兩幅源圖像在混合過程中的權(quán)重,前者為src1源圖像的權(quán)重,后者為src2源圖像的權(quán)重,兩者的大小并不限制在1以內(nèi),只要在不出現(xiàn)報(bào)錯(cuò)(可以試試取個(gè)12!)的范圍內(nèi),可以任意取值,數(shù)據(jù)類型為(double)雙精度類型;
? ? ? ? ? ? ? ? ? gamma:在兩個(gè)源圖像混合之后,如果對(duì)圖像的亮度有所要求,則可以通過對(duì)gamma的值進(jìn)行調(diào)整來進(jìn)行對(duì)圖片整體亮度的調(diào)節(jié),如果數(shù)值為正則是提高亮度,如果數(shù)值為負(fù)則是降低亮度,數(shù)據(jù)類型為(double)雙精度類型;
? ? ? ? ? ? ? ? ? 次個(gè)dst:與首個(gè)dst的說明相同,不再贅述,默認(rèn)為None;
? ? ? ? ? ? ? ? ? dtype:目標(biāo)圖像的數(shù)組深度,即單個(gè)像素值的位數(shù),默認(rèn)為None。
補(bǔ)充說明:1、addWeighted函數(shù)的原理可以簡單地用下面的公示來表示:
????????? ? ? ? ? ? ? ? dst = src1 * alpha + src2 * beta + gamma。
? ? ? ? ? ? ? ? ?2、 從參數(shù)名稱我們也可以看出來——alpha、beta、gamma對(duì)應(yīng)于希臘字母中的第一、二、三個(gè)字母阿爾法、貝塔以及伽馬,就像是一家的三兄弟,雖然名稱不同,但是它們所代表的意義是相同的,都是權(quán)重。只不過老大和老二都有了女朋友(對(duì)應(yīng)于src1與src2),屬于動(dòng)態(tài)權(quán)重,都要和對(duì)應(yīng)的目標(biāo)圖像數(shù)組相乘后再加入結(jié)果;而老三是個(gè)光棍,屬于靜態(tài)權(quán)重,直接加入結(jié)果。
? ? ? ? ? ? ? ? ?3、兩個(gè)源圖像的大小與通道數(shù)要相同,不然會(huì)出現(xiàn)報(bào)錯(cuò)。(什么事都要講究個(gè)門當(dāng)戶對(duì)??!)
下面另外附上addWeighted函數(shù)相關(guān)說明的原生文檔,以供參考:
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
④實(shí)例操作:
下面通過超人標(biāo)志與蝙蝠俠標(biāo)志的混合來演示一下addWeighted函數(shù)的使用方法(海超人與大洋游俠合為一體超人與蝙蝠俠不打不相識(shí)):
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、其后,超人在戰(zhàn)斗中更勝一籌(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、最后,出現(xiàn)更大的外部威脅,兩人和解,前途一片光明(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)
最后經(jīng)過激烈的戰(zhàn)斗,超人與蝙蝠俠經(jīng)過激烈的戰(zhàn)斗,發(fā)現(xiàn)世界中黑暗勢力的威脅的嚴(yán)重程度要遠(yuǎn)遠(yuǎn)大于他們兩人之間的矛盾與成見,之后他們加入正義聯(lián)盟,從此過上了幸福的生活從此開始作為戰(zhàn)友共同對(duì)抗對(duì)世界造成威脅的惡勢力。
?結(jié)語:本期中我們學(xué)習(xí)了addWeighted函數(shù),了解到opencv中如何使用addWeighted函數(shù)來進(jìn)行圖像的混合,使得我們可以得到更能夠符合操作需要的圖像,雖然只是簡單的操作,但是對(duì)于我們?cè)趫D像處理學(xué)習(xí)過程中對(duì)于處理原理的理解確實(shí)是饒有好處的。所謂,不積跬步,無以至千里;不積小流,無以成江海。路都是一個(gè)一個(gè)腳印實(shí)實(shí)在在地走出來的,希望看到這里的各位同好都能腳踏實(shí)地,翻過一座又一座人生的大山,想看的那片海就會(huì)離我們?cè)絹碓浇?/p>
好了以上就是所有的內(nèi)容,希望大家多多關(guān)注,點(diǎn)贊,收藏,這對(duì)我有很大的幫助。謝謝大家了!
好了,這里是Kamen Black君。祝國康家安,大家下次再見嘍?。?!溜溜球~~?
??
?文章來源地址http://www.zghlxwxcb.cn/news/detail-406783.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-406783.html
?
到了這里,關(guān)于python-opencv第六期:addWeighted函數(shù)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!