最近在做一个人像分割的项目,来实现人像抠图和背景替换等功能 实例分割阶段,可以使用u2net来输出mask图,代码地址。 下边为原图以及产生的mask图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201112172554352.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTEyMjA4OA==,size_16,color_FFFFFF,t_70#pic_center)
然后我们找一张想要替换的背景图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201112172652482.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTEyMjA4OA==,size_16,color_FFFFFF,t_70#pic_center)
import cv2
person = cv2.imread("原图")
back = cv2.imread("背景图")
#这里将mask图转化为灰度图
mask = cv2.imread("mask图",cv2.IMREAD_GRAYSCALE)
#将背景图resize到和原图一样的尺寸
back = cv2.resize(back,(person.shape[1],person.shape[0]))
#这一步是将背景图中的人像部分抠出来,也就是人像部分的像素值为0
scenic_mask =~mask
scenic_mask = scenic_mask / 255.0
back[:,:,0] = back[:,:,0] * scenic_mask
back[:,:,1] = back[:,:,1] * scenic_mask
back[:,:,2] = back[:,:,2] * scenic_mask
#这部分是将我们的人像抠出来,也就是背景部分的像素值为0
mask = mask / 255.0
person[:,:,0] = person[:,:,0] * mask
person[:,:,1] = person[:,:,1] * mask
person[:,:,2] = person[:,:,2] * mask
#这里做个相加就可以实现合并
result = cv2.add(back,person)
cv2.imwrite("3.jpg",result)
下边为效果图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201112173007893.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTEyMjA4OA==,size_16,color_FFFFFF,t_70#pic_center)
|