此功能类似P图,将固定颜色的背景通过HSV阈值调节,扣出人物的区域(mask),并通过位操作实现风景照与mask的融合,最后经过同样的操作将人物图像扣除,通过cv2.add()或cv2.addWeighted()实现图片的叠加,当然要注意图片的尺寸问题哦~
在这个过程中,感谢锟琨的帮助!

文章目录

  • ​​功能介绍​​
  • ​​实现过程​​
  • ​​1.读取两张图片并建立显示窗口​​
  • ​​2.通过HSV调节,提取出背景颜色的阈值范围并记录在color_dist里​​
  • ​​使用HSV阈值调节器实现阈值调节​​
  • ​​3.提取背景和人物的二值化区域​​
  • ​​4.通过位操作实现掩膜处理​​
  • ​​5.叠加两张照片​​
  • ​​如何将人像放在白色或其他颜色的背景上?​​
  • ​​1.创建白色的背景图片​​
  • ​​2.采用人像mask对白色背景进行掩膜处理​​

功能介绍

  • 将​​img1​​中的人物和​​img2​​的背景进行叠加,实现融合P图的效果:
  • opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_位操作

    opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_计算机视觉_02

  • 实现效果:
  • opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_二值化_03

实现过程

1.读取两张图片并建立显示窗口

注意,此处需要将两张照片的​​size​​调成相同的

#照片读取
img1 = cv2.imread("opencv/task/greenScreen01.jpg")
img2 = cv2.imread("opencv/task/scenic01.jpg")
img2 = cv2.resize(img2,dsize=(755,359))
#建立窗口
cv2.namedWindow("task")

2.通过HSV调节,提取出背景颜色的阈值范围并记录在color_dist里

#设置颜色提取阈值,绿色
color_dist = {'green': {'Lower': np.array([26, 104, 85]), 'Upper': np.array([100, 255, 255])}}
使用HSV阈值调节器实现阈值调节

​​HSV高低阈值分析器​

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_cv_04

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_位操作_05

3.提取背景和人物的二值化区域

将人物的调节后的二值化图片和原图进行掩膜处理,分别提取出人物和背景的画面

  • 将背景的​​mask​​提取出来
#将RGB图片转换为HSV图像
hsv = cv2.cvtColor(img1, cv2.COLOR_RGB2HSV)
background_mask = cv2.inRange(hsv, color_dist['green']['Lower'], color_dist['green']['Upper'])

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_计算机视觉_06

  • 将像素反转,得到人物的mask
person_mask = ~background_mask

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_计算机视觉_07

4.通过位操作实现掩膜处理

  • 将背景和人物分别进行掩膜处理,实现人物和背景的单独显示
#将人像进行mask处理,得到需要添加的背景
scenic_img = cv2.bitwise_and(img2, img2, mask = background_mask)

#mask只有0和1,得到去除绿色背景后的人像
person_img = cv2.bitwise_and(img1, img1, mask = person_mask)

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_二值化_08

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_二值化_09

5.叠加两张照片

  • 通过cv2.add()实现照片的叠加
result = cv2.add(scenic_img,person_img)

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_二值化_10

  • 通过cv2.addWeighted()实现可调节透明度的叠加
#通过调节alpha实现背景透明度的调节
alpha_img = cv2.addWeighted(scenic_img, 0.7, person_img,1, 0)

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_位操作_11

如何将人像放在白色或其他颜色的背景上?

紧跟着上述的操作:

1.创建白色的背景图片

#创建一个三通道的白色照片,刚创建的矩阵照片为黑色
black_img = np.zeros([359, 755,3],np.uint8)
#反转为黑色照片
white_img = ~black_img

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_二值化_12

2.采用人像mask对白色背景进行掩膜处理

  • 使用人像mask对白底照片进行掩膜处理
white_img2 = cv2.bitwise_and(white_img, white_img, mask=person_mask)
white_img3 = ~white_img2

注意:黑色区域为此二值化照片可以使用其他照片进行覆盖的区域!!

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_opencv_13

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_opencv_14

  • 将人像与经过掩膜处理的白底照片进行融合
person_white = cv2.add(white_img3, person_img)

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_二值化_09

opencv-python——将单一的图片背景颜色换成其他照片并实现照片融合_位操作_16

如果读者跟着博主实现了功能,那就给个赞再走吧~