1. 程式人生 > >OpenCV_Python官方文件7——影象融合

OpenCV_Python官方文件7——影象融合

OpenCV-Python Tutorials

影象疊加(融合)

主要函式

被疊加的兩張圖片的大小、型別(高度/寬度/通道數)必須相同。

  1. 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 *點選此處

  1. 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()中兩張圖片的融合比例不同,這會給人一種混合或者透明的感覺。 影象混合的計算公式如下: g(x)=(1α)f0(x)+αf1(x)g(x) = (1−α)f_0 (x)+αf_1 (x)αα表示兩種圖片的融合比例,g(x)g(x)表示融合圖片中的畫素點,f0(x)f_0(x)f1(x)f_1(x)分別表示背景和前景圖片中的畫素點。通過修改αα的值(0–>1),可以實現不同的影象融合。

也可以按下面的公式對圖片進行混合: dst=αimg1+βimg2+γdst = α*img1 + β*img2 + γ

將沙漠和老虎的圖片融合,沙漠的權重為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加到圖片為沙漠的左上角 在這裡插入圖片描述

具體會在下次的文章中寫出來,寫完會加連結

在影象融合時,必須要求兩幅影象大小、型別相同。但是如果遇到兩幅影象大小不相同時,應該怎麼處理呢? 這個後面會寫到,寫完會加連結