为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 openCV python 用另一个图像替换图像的蒙版部分?

如何使用 openCV python 用另一个图像替换图像的蒙版部分?

斯蒂芬大帝 2021-11-23 18:02:27
目标是用另一个图像替换图像的一部分。我打算做的是获取原始照片的片段图,并将原始照片的选定部分替换为另一张图像。例如,这是原始照片的分段图的照片:我想用另一个人模型(不同的人)替换那个粉红色段面具:我该怎么做?我正在考虑根据粉红色(RGB 值为 192,128,128)和bitwise_and两个图像选择一个 ROI ?但我不太确定如何做到这一点,或者这是否是最好的方法。我知道粉红色的面具和样品人不是完全合适的,但我只想先将模型拟合到粉红色的部分,然后再缩放或变换它。任何建议都会很棒!谢谢!
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

加载库并读取图像


from __future__ import division

import cv2

import numpy as np


guy_img = cv2.imread('path')

target_img = cv2.imread('path')

获取男人(每个非零像素)和目标蒙版(粉红色区域)的边界框。


a = np.where(guy_img > 0)

b = np.where(target_img == 129)  # picked one of the channels in your image

bbox_guy = np.min(a[0]), np.max(a[0]), np.min(a[1]), np.max(a[1])

bbox_mask = np.min(b[0]), np.max(b[0]), np.min(b[1]), np.max(b[1])

请注意,当我加载目标图像时,值与您提供的值不同。图像边缘也有一些白色像素。这可能只是因为图像被上传到 imgur 并被下载。如果您的值是正确的,并且除了粉红色区域之外,您的图像的其余部分都是完全黑色的,您可以像使用np.where(target_img > 0).


现在只获取 Guy 和 mask 区域的值


guy = guy_img[bbox_guy[0]:bbox_guy[1], bbox_guy[2]:bbox_guy[3],:]

target = target_img[bbox_mask[0]:bbox_mask[1], bbox_mask[2]:bbox_mask[3],:]

将人调整为与面具相同的比例/形状


guy_h, guy_w, _ = guy.shape

mask_h, mask_w, _ = target.shape

fy = mask_h / guy_h

fx = mask_w / guy_w

scaled_guy = cv2.resize(guy, (0,0), fx=fx,fy=fy)

使用男人图像值重新分配目标图像的遮罩区域


for i, row in enumerate(range(bbox_mask[0], bbox_mask[1])):

    for j, col in enumerate(range(bbox_mask[2], bbox_mask[3])):

        target_img[row,col,:] = scaled_guy[i,j,:]


cv2.imshow('', target_img)

cv2.waitKey(0)


查看完整回答
反对 回复 2021-11-23
?
守候你守候我

TA贡献1802条经验 获得超10个赞

首先,在继续实施之前,您需要考虑几件事。

  • 蒙版图像的背景一致吗?蒙面斑点的颜色一致?

  • 蒙版的大小和要添加图像的对象。

我建议您首先在粉红色分割图像上找到 ROI 的大小、颜色和位置。根据遮罩图像缩放对象(男孩图像)的尺寸,因此更容易将对象图像遮罩到粉红色部分。

然后,您可以创建一个尺寸类似于蒙版图像的图像(我们称之为第一步图像)。将缩放的对象图像添加到从粉红色斑点分析获得的位置。这样,您将拥有两个具有相似尺寸和相似比例的图像。

使用第一步图像和粉红色 ROI 应该很容易在视觉上重叠。

如果您想要精确的粉红色,那么如果蒙版图像上的相同位置像素为黑色,则将第一步图像上的所有像素替换为黑色像素。否则就让它成为它本来的样子。

if(mask[i][j] == black){ step_one[i][j] = black }

这使得粉红色部分被对象图像掩盖了。


查看完整回答
反对 回复 2021-11-23
  • 2 回答
  • 0 关注
  • 432 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信