【OpenCV教程】10 圖像混合

戳一戳!和我一塊兒走進opencv的世界css

導讀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 鼠標控件基本操做

8   |   08 trackbar操做及實例詳解

9   |   09 圖像像素基本操做

1 圖像混合

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這個參數用來對混合後的圖像明暗程度進行調整,有以下三種狀況:


(1)gamma>0:調亮圖像,值越大,亮度越大;(2)gamma=0:不改變圖像;(3)gamma<0:調按圖像,值越小,亮度越小;

舉個例子,咱們分別讓gamma爲:-100,0,100,執行結果以下:


gamma = -100


gamma = 0


gamma = 100


2 部分混合

1 代碼分析與編寫

若是咱們想要混合的圖像大小不同,或者想要混合其中的某個部分,應該怎麼辦呢?


咱們能夠先選定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 模擬視頻淡入淡出切換

1 效果介紹

作視頻的時候,作兩個視頻或者圖片的轉換,須要經過淡入淡出轉換,或者作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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索