[百度飞浆]paddleHub--抠图修改背景色

642 阅读2分钟

blog.csdn.net/kobeyu65245…

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()

说明 人物图的尺寸必须小于背景图

对人物图进行二值化处理后,可以再加腐蚀膨胀操作,使图更好。
二值化选用人工调数值,自动二值化效果不好。