本文將簡單示範如何使用 OpenCV 透過遮罩(Mask)將去背圖片嵌入其他圖片,達成影像合成的效果。
如下圖所示:
範例圖片:

程式碼(Python):
import cv2
import numpy as np
import matplotlib.pyplot as plt
dog_pic = '../images/dog.png' # 圖片位址
your_pic = '../images/yourpic.jpg' # 圖片位址
try:
# 讀取圖片
dog_img = cv2.imread(dog_pic)
your_pic_img = cv2.imread(your_pic)
your_pic_img = cv2.resize(your_pic_img, (dog_img.shape[1], dog_img.shape[0])) # resize 圖片,確保兩張圖片同樣大小
# 將圖片轉成灰階圖片
dog_img_gray = cv2.cvtColor(dog_img, cv2.COLOR_BGR2GRAY)
# 取得 mask
ret, mask = cv2.threshold(dog_img_gray, 220, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# 透過 mask 取得背景圖片和將去背圖圖片的背景反黑
your_pic_background = cv2.bitwise_and(your_pic_img, your_pic_img,mask = mask)
dog = cv2.bitwise_and(dog_img, dog_img, mask = mask_inv)
# 將兩張圖片的像素值一一疊加,Note: 黑色像素值是 [0, 0, 0],所以任一像素疊加 [0,0,0] 等於自己本身
# 因此兩張圖片會各自保留其不是黑色色塊的部分後疊再一起
result = cv2.add(dog, your_pic_background)
# 將過程中產生的圖片畫出來
pic_titles = ['dog_img_gray', 'mask', 'mask_inv', 'your_pic_background', 'dog', 'result']
bgr_images= [dog_img_gray, mask, mask_inv, your_pic_background, dog, result]
rgb_images = [cv2.cvtColor(img, cv2.COLOR_BGR2RGB) for img in bgr_images]
for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(rgb_images[i])
plt.title(pic_titles[i])
plt.xticks([]),plt.yticks([]) # 拿掉 X座標軸 和 y座標軸 刻度文字
plt.show()
except Exception as ex:
print(f"An unexpected error occurred: {ex}")

Note:
CV2.threshold 方法的 thresh 輸入不同的閥值可以擷取到不同的特徵和輪廓,詳見
官網說明文件。
將程式內的 threshold 方法的 type 改成 THRESH_BINARY_INV,則可得到剪影。
以上就是關於去背圖片合成的示範,希望對看到這篇文章的讀者有幫助,謝謝~~~