本文已知条件
- 前景图
- 前景蒙版
- 背景图
代码实现
# 读取图片,蒙版(黑色代表不选中,白色代表选中)
img = cv2.imread(img_item)
img = cv2.resize(img, (960, 1280), interpolation=cv2.INTER_LINEAR)
mask = cv2.imread(os.path.join(mask_file, mask_item), cv2.IMREAD_UNCHANGED)
bg = cv2.imread(bg_path)
bg = cv2.resize(bg, (img.shape[1], img.shape[0]), interpolation=cv2.INTER_LINEAR)
bg_mask = (np.ones(img.shape, dtype='uint8') * 255) - mask # mask求反,用一个255的矩阵减mask
mask = mask.astype("float") # 类型转化:uint8->float
mask = mask / 255 # 求透明度
img = img * mask # 用透明度乘图片
bg = bg * (bg_mask/255) # 背景同样
img = img.astype("uint8")
bg = bg.astype("uint8")
stacked = cv2.addWeighted(img, 1, bg, 1, 0) # 叠加两图
cv2.imshow('r1', stacked)
cv2.waitKey(0)
中间结果解释
读取的img
读取的mask
读取的mask
mask翻转后的结果
对应代码:
bg_mask = (np.ones(img.shape, dtype='uint8') * 255) - mask # mask求反,用一个255的矩阵减mask
img裁剪后的结果
对应代码:
mask = mask / 255 # 求透明度
img = img * mask # 用透明度乘图片
背景图扣掉人像的结果
对应代码:
bg_mask = (np.ones(img.shape, dtype='uint8') * 255) - mask # mask求反,用一个255的矩阵减mask
bg = bg * (bg_mask/255) # 背景同样
背景图扣掉人像的结果
和img裁剪后的结果
相叠加
对应的代码
stacked = cv2.addWeighted(img, 1, bg, 1, 0) # 叠加两图