pip
pip install opencv-python
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip install -i https://mirror.baidu.com/pypi/simple paddlehub
前面扣的图背景是黑色,接下来我们尝试将背景改为白色。
这次我们只扣一张图
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import paddlehub as hub
import cv2
import numpy as np
#读取原始图
image=cv2.imread('3.jpg')
cv2.imshow('original',image)
#调用抠图模型
module = hub.Module(name="deeplabv3p_xception65_humanseg")
test_img_path = ["3.jpg"]#图片路径
input_dict = {"image": test_img_path}
#抠图
results = module.segmentation(data=input_dict)#抠图
#抠图结果
prediction = results[0]["data"]#抠图结果:数值为float
prediction= prediction.astype(np.uint8)#抠图结果转化格式,转为图片格式 得到是黑白图,其中人为白色,背景为黑色,
cv2.imshow('prediction',prediction)
#背景颜色替换
rows,cols,channels = image.shape
for i in range(rows):
for j in range(cols):
if prediction[i,j]==0: # 像素点为255表示的是白色,0为黑色,我们就是要将黑色处的像素点,替换为红白色
image[i,j]=(255,255,255) # 此处替换颜色,为BGR通道,不是RGB通道
cv2.imshow('result',image)
cv2.waitKey()
cv2.destroyAllWindows()
插图和修改背景
- 将一张图插入到另一张中
修改背景:把一张图插入到另一张图中
很简单的原理,将背景图的部分像素替换成另一张图就可以。
前提:图必须小于背景图
import cv2
image1=cv2.imread('3.jpg')
image1=cv2.resize(image1,None,fx=0.3,fy=0.3)
cv2.imshow('image1',image1)
bg=cv2.imread('bg.jpg')
cv2.imshow('original bg ',bg)
rows,cols,channels = image1.shape#rows,cols最后一定要是前景图片的,后面遍历图片需要用到
#遍历替换
center=[50,100]#在新背景图片中的位置
for i in range(rows):
for j in range(cols):
bg[center[0]+i,center[1]+j]=image1[i,j]#此处替换颜色,为BGR通道
cv2.imshow('res',bg)
#cv2.imwrite('bg.jpg',bg)
cv2.waitKey()
cv2.destroyAllWindows()
- 修改背景
带着女朋友去旅游,没有钱怎么办,直接把她的图移动到某一风景区,合成。
一张风景图就有啦。
import cv2
#读取人物图
image1=cv2.imread('3.jpg')
image1=cv2.resize(image1,None,fx=0.3,fy=0.3)
cv2.imshow('image1',image1)
#读取背景图
bg=cv2.imread('bg.jpg')
bg=cv2.resize(bg,None,fx=0.7,fy=0.7)
cv2.imshow('original bg ',bg)
rows,cols,channels = image1.shape#rows,cols最后一定要是前景图片的,后面遍历图片需要用到
#对人物图进行二值化处理,自己手动调二值化数据
gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY)#二值化
cv2.imshow('binary',binary)
#遍历替换
center=[200,350]#在新背景图片中的位置
for i in range(rows):
for j in range(cols):
if binary[i,j]!=255:
bg[center[0]+i,center[1]+j]=image1[i,j]#此处替换颜色,为BGR通道
cv2.imshow('res',bg)
#cv2.imwrite('bg.jpg',bg)
cv2.waitKey()
cv2.destroyAllWindows()
说明 人物图的尺寸必须小于背景图
对人物图进行二值化处理后,可以再加腐蚀膨胀操作,使图更好。
二值化选用人工调数值,自动二值化效果不好。