
導讀shell
OpenCV功能愈加強大,不學一下怎麼行?數組
今天要分享這篇文章帶咱們一塊兒瞭解圖像混合,並利用圖像混合完成一些有趣的功能。讓咱們走進這篇文章,一塊兒來了解一下吧!微信
若是你有什麼問題,或者有什麼想法,歡迎評論與我一塊兒溝通交流。若是你想了解更多有關於計算機視覺、OpenCV、機器學習、深度學習等相關技術的內容,想與更多大佬一塊兒溝通,那就加羣:326866692 或者掃描下方二維碼加入咱們吧!機器學習

往期回顧ide
【OpenCV-YOLO v4實戰】svg
1 | 嚐鮮!Windows下實現YOLOv4物體檢測學習
2 | 坐穩了,OpenCV老司機帶你用OpenCV4實現YOLO v4物體檢測區塊鏈
【OpenCV基礎教程】flex
1 | 01 OpenCV簡介與安裝
2 | 02 圖像的讀取與顯示
3 | 03 圖像的存儲與窗口操做
4 | 04 視頻的讀取和顯示
5 | 05 圖像的結構、屬性與座標
6 | 06 圖形與文字的繪製
7 | 07 鼠標控件基本操做
9 | 09 圖像像素基本操做
1 圖像混合
咱們有時候會將兩幅圖像混合到一塊兒,獲得一幅新的圖像,不一樣部分透明度不一樣,就會產生不同的美感!
OpenCV中提供了圖像混合的API,能夠按權重加和,計算原理以下:
若是應用到圖像中,咱們令輸出圖像爲dst,兩個輸入圖像分別爲img1,img2,權重分別爲α,β,咱們另外須要一個參數γ調整一下圖像的亮度,γ大於0,圖像變亮,圖像小於0,圖像變暗,後面咱們還會說明。
2 圖像混合API
圖像混合的API是 addWeighted ,該API實現的功能是:
計算兩個數組(圖像)的加權和。
API定義以下:
def addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
API參數含義以下:
(1)src1:第一個輸入圖像(2)alpha:第一個圖像的參數(3)src2:第二個輸入圖像,圖像的尺寸、深度必須和前一個輸入圖像一致(4)beta:第二個圖像的參數(5)gamma:每一個和相加的附加標量(6)dst:輸出圖像(7)dtype:輸出圖像類型,默認爲-1,即和兩個輸入圖像一致。
dst能夠不寫在參數中,當作API的返回值傳出,通常狀況下,咱們也採用第二種方式,當返回值傳出。
3 代碼示例
舉個例子:
# coding=utf-8
import cv.cv2 as cv
img1 = cv.imread('./image/YT_ZM.png')
img2 = cv.imread('./image/YT_ZWJ.png')
gamma = 0
dst = cv.addWeighted(img1, 0.5, img2, 0.5, gamma)
cv.imshow('new image',dst)
cv.waitKey(0)
cv.destroyAllWindows()
執行結果以下:
4 參數調整問題
調用OpenCV的API,其實就是調參的過程,在調整今天講的API的參數的時候,咱們就要來講明兩個問題:
權重問題:兩個圖像的權重和是否必須爲1?附加標量問題:附加標量是用來幹嗎的,不一樣的取值,有什麼不一樣?
對於第一個問題,兩幅圖像所佔權重之和不必定爲1,若是不是1,也能夠:
dst = cv.addWeighted(img1, 0.2, img2, 0.5, gamma)
執行結果以下:
可是通常來講,權重之和越接近1,獲得的圖像效果越好。
對於第二個問題,gamma這個參數用來對混合後的圖像明暗程度進行調整,有以下三種狀況:
0:調亮圖像,值越大,亮度越大;(2)gamma=0:不改變圖像;(3)gamma<0:調按圖像,值越小,亮度越小;
舉個例子,咱們分別讓gamma爲:-100,0,100,執行結果以下:
gamma = -100
gamma = 0
gamma = 100
2 部分混合
若是咱們想要混合的圖像大小不同,或者想要混合其中的某個部分,應該怎麼辦呢?
咱們能夠先選定ROI區域,而後對ROI區域混合。
# coding=utf-8
import cv.cv2 as cv
img3 = cv.imread('./image/sign.png')
img4 = cv.imread('./image/opencv.png')
ROI = img3[50:50 + img4.shape[0], 50:50 + img4.shape[1]] # 獲取ROI區域
dst = cv.addWeighted(ROI, 0.5, img4, 0.5, 0) # 圖像融合
img3[50:50 + img4.shape[0], 50:50 + img4.shape[1]] = dst #附加到原圖上
cv.imshow('new image',img3)
cv.waitKey(0)
cv.destroyAllWindows()
2 效果展現
執行結果以下:
3 模擬視頻淡入淡出切換
作視頻的時候,作兩個視頻或者圖片的轉換,須要經過淡入淡出轉換,或者作PPT的時候,須要使用淡入淡出進行切換。
接下來,讓咱們使用OpenCV實現下這個效果吧!
2 流程分析與代碼編寫
淡入淡出是一個動態效果,一幅圖像的透明度由0逐漸轉化爲1,即由不透明轉化爲百分百透明;一幅圖像的透明度由1逐漸轉化爲0,即由百分百透明轉化爲不透明。
咱們每進行一次調整透明度,就把圖像輸出一下。
# coding=utf-8
import cv.cv2 as cv
img5 = cv.imread('./image/YT_ZM1.png')
img6 = cv.imread('./image/YT_ZWJ1.png')
alpha = 0.0
while alpha <= 1:
dst = cv.addWeighted(img5, alpha, img6, 1-alpha, 0)
cv.imshow('new image', dst)
cv.waitKey(30)
alpha += 0.01
cv.destroyAllWindows()
3 效果展現
我把這個效果錄成了視頻:
你們也能夠調整不一樣的數值,看下效果。
說在後面的話
這篇文章到這裏就要結束啦,但願你們可以經過這篇文章,可以掌握圖像混合的功能,掌握addWeighted的基本用法,能用addWeighted完成有趣的功能!
讓咱們在後續的課程中,再接再礪,學習更多知識吧。
號外號外!
AI與區塊鏈技術交流羣
成立啦!
本羣用於分享交流機器學習、深度學習、計算機視覺、OpenCV、PCL、TensorFlow、Pytorch等內容。
想要加羣的朋友們掃描下方二維碼添加羣主微信,並備註【研究方向-地點-學校/公司-暱稱】,

AI與區塊鏈技術

長按二維碼關注
若是喜歡這篇文章
麻煩給我一個在看
本文分享自微信公衆號 - AI與區塊鏈技術(Math_AI_Blockchain)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。