Python利用paddlehub实现批量抠图和更换证件照背景底色

        Python利用paddlehub实现批量抠图和更换证件照背景底色,图片使用卓别林的个人肖像,代码来源抠图功能实现的博客。代码做了一些更改已实现蓝底背景功能,并实现边界框图提取。

import os
from tkinter import Image
import paddlehub as hub
import numpy as np
import cv2
import matplotlib.pyplot as plt
 
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
 
# 获取需要抠图的图像文件地址
# 图像文件目录地址
path = r"D:\\demo_works\\Python\\0827\\picture1\\"
# 遍历获取每张图像的地址
files = [path + i for i in os.listdir(path)]
 
# 显示所有原图像
# 保存图像数据列表
img = []
# 创建画布  定义大小
plt.figure(figsize=(8, 6))
# 遍历获取每张图像数据
for i, img_fine in enumerate(files):
    # 通过opencv获取图像数据并添加到列表
    img.append(cv2.imread(img_fine))
    # 由于opencv打开的图像格式为BGR 所以需要转换为RGB格式
    img[i] = cv2.cvtColor(img[i], cv2.COLOR_BGR2RGB)
    # 显示图像大小
    # print(img[i].shape)
    # 创建子视图
    #plt.subplot(2, len(files), i + 1)
    # 显示图像
    #plt.imshow(img[i])
    #plt.title("原图")
 
 
# 调用飞浆的deeplabv3p_xception65_humanseg模型 该模型能够用于人像抠图
#module = hub.Module(name="deeplabv3p_xception65_humanseg")
module = hub.Module(name="deeplabv3p_xception65_humanseg")
# 图像地址 (固定格式,不要更改)
input_dict = {"image": files}
# 训练模型并预测模型,打印结果(获取到抠图人像)
results = module.segmentation(data=input_dict)
 
i_image = 0
 
# 列表存储抠图人像(方便保存数据,也可下载图像)
newimgs = []
for i in range(len(files)):
    # 提取抠图人像数据
    prediction = results[i]["data"]
    # 显示抠图后的轮廓图像
    #plt.imshow(prediction)
    # 根据图像成像还原数据(具体原理我也不知道)
    newimg = np.zeros(img[i].shape)
    shape_i = img[i].shape
    print(newimg.shape)
    #print(np.ndarray.size())
    print(prediction[:,:])
    print(prediction.shape)
    print(type(prediction))
    #break
 
    newimg[:, :, 0] = img[i][:, :, 0] * (prediction <= 0)*0
    newimg[:, :, 1] = img[i][:, :, 1] * (prediction <= 0)*0
    newimg[:, :, 2] = img[i][:, :, 2] / img[i][:, :, 2]*(prediction <= 0)*236
 
    newimg[:, :, 0] =  newimg[:, :, 0]+img[i][:, :, 0] * (prediction > 0)
    newimg[:, :, 1] =  newimg[:, :, 1]+img[i][:, :, 1] * (prediction > 0)
    newimg[:, :, 2] =  newimg[:, :, 2]+img[i][:, :, 2] * (prediction > 0) #+ 236 * (prediction > 0)
 
    #newimg2 = np.zeros(prediction.shape)
    newimg2 = prediction
    for ii in range(shape_i[1]):
        for jj in range(shape_i[2]):
            #flag = 0
            #for kk in range(3):
    
            if(prediction[ii,jj]!=0.0):
                newimg2[ii,jj] = 125.0
            else:
                newimg2[ii,jj] = 220.0
    
            #if(flag == 1):
                #print("\n here ha \n")
            #    newimg2[ii,jj, 0] = 0
            #    newimg2[ii,jj, 1] = 0
            #    newimg2[ii,jj, 2] = 236 
 
    i_image = i_image + 1
    print(i_image)
    plt.figure(i_image)
    plt.xlabel("图像1") 
 
    plt.imsave(path+str(i_image+8)+".jpg",newimg.astype(np.uint8))
 
    plt.imshow(newimg.astype(np.uint8)) 
     
 
    i_image = i_image + 1
    print(i_image)
    plt.figure(i_image)
    plt.xlabel("图像2") 
    plt.imshow(newimg2)              
 
    # 添加到列表 newimg.astype(np.uint8)修改数据类型为uint8
    newimgs.append(newimg.astype(np.uint8))
    # 显示图像
    #plt.subplot(2, len(files), i + 1 + len(files))
    #plt.imshow(newimgs[i])
    #plt.xlabel("抠图后图像")
 
 
# 总图像显示(少了这个就没图像了,千万别少了)
plt.show()

Python利用paddlehub实现批量抠图和更换证件照背景底色_第1张图片

Python利用paddlehub实现批量抠图和更换证件照背景底色_第2张图片

你可能感兴趣的:(Python,编程和应用实现,python,opencv,计算机视觉)