OpenCV-python利用蒙版进行叠加(含alpha通道)

本文已知条件

  1. 前景图
  2. 前景蒙版
  3. 背景图

代码实现

# 读取图片,蒙版(黑色代表不选中,白色代表选中)
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
读取的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)  # 叠加两图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_29391809/article/details/117394512