OpenCV_Python官方文件7——影象融合
OpenCV-Python Tutorials
影象疊加(融合)
主要函式
被疊加的兩張圖片的大小、型別(高度/寬度/通道數)必須相同。
cv2.add(img1,img2)
:直接對兩張圖片作加法運算
Numpy中可以直接用res = img1 + img2
相加,但這兩者的結果並不相同,因為OpenCV中的加法運算是飽和運算(就是當運算結果大於一個上限或小於一個下限時,結果就等於上限或是下限。),而Numpy中的加法運算是取模運算。
如下面程式碼中cv2.add(x,y)
執行結果為[[255]],是因為250+10 = 260 >= 255
,所以結果就等於上限255,x+y
執行結果為[4],是因為250+10 = 260 mod 255 = 4
OpenCV的結果會更好,所以最好使用OpenCV中的函式
from imutils import *
import os
os.chdir('D:/BaiduYunDownload/')
img1 = imread('image1.jpg')
img2 = imread('image2.jpg')
show(img1)
show(img2)
x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x,y)) #執行結果為[[255]]
print(x+y) #執行結果為[4]
res = img1 + img2
show(res)#顯示使用陣列加法後的圖片
add = cv2.add(img1,img2)
show(add)#顯示使用OpenCV中add函式的圖片
想了解上面程式碼中的
from imutils import *
點選此處
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
:也是一種圖片相加的操作,可以實現兩張圖片的線性融合。
- src1 – 輸入圖片1
- alpha – 影象1的加權係數(融合比例)
- src2 – 輸入影象2,必須與圖片1的大小、型別(高度/寬度/通道數)相同
- beta – 影象2的加權係數(融合比例),
beta = 1.0 - alpha
- dst – 兩個影象加權和後的影象,即輸出的影象
- gamma – 加權和後的影象的偏移量
- dtype – 輸出陣列的可選深度;當兩個輸入陣列具有相同的深度時,dtype可以設定為-1(預設值),這將相當於src1.depth().
當α=β=1時,就相當於兩張圖片直接相加
與cv2.add()
不同的是,cv2.addWeighted()
中兩張圖片的融合比例不同,這會給人一種混合或者透明的感覺。
影象混合的計算公式如下:
表示兩種圖片的融合比例,表示融合圖片中的畫素點, 和分別表示背景和前景圖片中的畫素點。通過修改的值(0–>1),可以實現不同的影象融合。
也可以按下面的公式對圖片進行混合:
將沙漠和老虎的圖片融合,沙漠的權重為0.6,老虎的權重為0.4
from imutils import *
import os
os.chdir('C:/Users/lenovo/Pictures/')
img1 = imread('desert.jpg')
img2 = imread('tiger.jpg')
dst = cv2.addWeighted(img1,0.6,img2,0.4,0)#γ的取值為0
show(dst)
執行結果:
如果想不斷調節alpha的值,檢視不同情況下的融合影象。(可以增加一個滑動條)
import cv2
import numpy as np
import os
os.chdir('C:/Users/lenovo/Pictures/')
img1 = cv2.imread('desert.jpg')
img2 = cv2.imread('tiger.jpg')
cv2.namedWindow('addImage')
#回撥函式
def nothing(x):
pass
#新增一個調節alpha值得滑動條
alpha = 0 #初始化
cv2.createTrackbar('alpha','addImage',0,10,nothing)
while(1):
cv2.imshow('addImage',dst)
k = cv2.waitKey(1) & 0xFF
if k == ord('q'): #按q鍵退出
break
#獲得滑動條的value值
alpha = cv2.getTrackbarPos('alpha','addImage')
alpha = alpha/10
beta = 1.0 - alpha
dst = cv2.addWeighted(img1,alpha,img2,beta,0)#γ的取值為0
cv2.destroyAllWindows()
執行結果:(由於放的圖片太大,只能擷取一部分展示一下滑動條) 3. 按位運算:按位與(AND)、按位或(OR)、按位非(NOT)、按位異或(XOR)等運算。
按位運算的用途:比如要得到一個加logo的影象。如果將兩幅圖片直接相加會改變圖片的顏色,如果用影象混合,則會改變圖片的透明度,所以我們需要用按位操作。
例項:將OpenCV的logo加到圖片為沙漠的左上角
具體會在下次的文章中寫出來,寫完會加連結
在影象融合時,必須要求兩幅影象大小、型別相同。但是如果遇到兩幅影象大小不相同時,應該怎麼處理呢? 這個後面會寫到,寫完會加連結