opencv 實現圖像融合


圖像相加

要疊加兩張圖片,可以用cv.add()函數,相加兩幅圖片的形狀(高度/寬度/通道數)必須相同。numpy中可以直接用res = img + img1相加,但這兩者的結果並不相同:

import numpy as np
import cv2 as cv
x = np.uint8([250])
y = np.uint8([10])
print(cv.add(x, y))  # 250+10 = 260 => 255
print(x + y)  # 250+10 = 260 % 256 = 4

如果是二值化圖片(只有0和255兩種值),兩者結果是一樣的(用numpy的方式更簡便一些)。

圖像加權相加

圖像混合cv.addWeighted()是一種圖像加權相加的操作,兩幅圖像的權重可以不一樣,也可以一樣。γ相當於一個修正值:
圖像加權相加公式
α和β都等於1時,就相當於圖像相加。

img1 = cv2.imread('lena_small.jpg')
img2 = cv2.imread('opencv-logo-white.png')
res = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)

圖像加權混合結果

圖像按位操作

cv2.bitwise_and(),cv2.bitwise_or(), cv2.bitwise_not(), cv2.bitwise_xor() 分別是按位與/或/非/異或操作,有什么用途呢?比如說我們要實現下面 圖1 的效果:
圖1:圖像加權相加無法實現
如果將兩幅圖像直接加權相加,無法實現上圖的效果。所以我們需要用按位操作。首先來了解一下掩膜(mask)的概念:掩膜是用一副二值化圖片對另外一幅圖片進行局部的遮擋,看下圖就一目了然了:
掩膜圖解
所以我們要得到圖1的效果,思路就是把原圖中要放logo的區域摳出來,再把logo放進去就行了。

import numpy as np 
import cv2 as cv

img1 = cv.imread('lena.jpg')
img2 = cv.imread('opencv-logo-white.png')

# 把logo放在左上角,所以我們只關心這一塊區域
rows, cols = img2.shape[:2]
roi = img1[:rows, :cols]

# 創建掩膜
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)

# 保留除logo外的背景
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
dst = cv.add(img1_bg, img2)  # 進行融合
img1[:rows, :cols] = dst  # 融合后放在原圖上

上面代碼輸出結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM