本文已知条件
- 前景图
- 前景蒙版
- 背景图
代码实现
# 读取图片,蒙版(黑色代表不选中,白色代表选中)
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) # 叠加两图

该篇博客介绍了如何利用OpenCV库进行图像处理,包括读取前景图、背景图和前景蒙版,通过计算透明度并进行图像相乘与叠加操作,实现将人像融合到背景图中的效果。
226

被折叠的 条评论
为什么被折叠?



