利用Python制作证件照

利用Python制作证件照
大家好!好久没见面了。今天和大家分享的是利用Python批处理随意拍的照片,生成证件照。有时候我们没空去拍证件照,又急着需要上传电子证件照,怎么办呢?PS又不是很熟。今天get这个技能的coder们,就可以方便自己生成证件照了。
上段时间因为工作需要,需要大量拍摄证件照。一个个处理比较麻烦,于是就想着直接收集生活照利用Python来帮忙解决一下这个问题。刚好上次参加百度的训练营有接触过PaddleHub,今天就借助PaddleHub来实现这个功能。

思路:

首先,根据PaddleHub人脸定位,找到图片中人脸的位置。

由于一寸照片的宽度295,高度是413,用这个比例框选出含有人脸的图片,并且进行缩放到尺寸(295,413)。

用PaddleHub的人像分割,分离人物和背景,对背景分别填充白色,红色,蓝色,得到三种颜色的登记照片。

步骤1、准备工作

需要先升级到最新版本的paddlehub

!pip install --upgrade paddlehub

查看我们上传的照片

!ls photo/

#导入需要用的依赖库
from PIL import Image
import paddlehub as hub
import cv2
import numpy as np

定义人脸识别和人物识别的paddlehub函数

face_landmark = hub.Module(name=“face_landmark_localization”)
human_seg = hub.Module(name=“deeplabv3p_xception65_humanseg”)
步骤二、定义功能函数

裁剪成为1寸大小的图片

def crop_face(pic_path,rate=1.3):
# 人脸识别
result = face_landmark.keypoint_detection(paths=[pic_path])
face=np.array(result[0][‘data’][0],dtype=np.int64)
# 剪裁
left = face[:,0].min()
right= face[:,0].max()
w = right-left
cw=int((right+left)/2)
upper = face[:,1].min()
lower = face[:,1].max()
h= lower-upper
ch=int((lower+upper)/2)
h = int(413w/295)
box=(cw-rate
w, ch-rateh, cw+ratew, ch+rate*h)
img=Image.open(pic_path)
img=img.crop(box)
img=img.resize((295, 413),Image.ANTIALIAS)
# display(img)
return img

进行人物抠图

def seg_face(img):
result = human_seg.segmentation(images=[cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)],
use_gpu=False,
visualization=True,
output_dir=‘humanseg_output’)
print(“抠图输出文件:”,result[0][“save_path”])
# display(Image.open(result[0][“save_path”]))
return result[0][“save_path”]

改变颜色

def change_color(pic_path,thresh=100):
def cut_person(img,num=[255,255,255]):
img=np.array(img).transpose((2,0,1))
person=[]
for i in range(3):
a=img[i]
mask=np.array((img[3] mask=cv2.erode(mask,None,iterations=1)
mask=cv2.dilate(mask,None,iterations=3)
mask=np.array(mask,dtype=np.bool)
a[mask]=num[i]
person.append(a)

    img=np.array(person).transpose((1,2,0))

    im=Image.fromarray(img)
    display(im)
    return im
#cut=cut_person(Image.open(pic_path),num=[255,255,255])#白底
cut=cut_person(Image.open(pic_path),num=[255,0,0])#红底
cut=cut_person(Image.open(pic_path),num=[0,0,255])#蓝底

生成三种底色的登记照片

def id_photo(pic_path,rate=1.3,thresh=2):
img=crop_face(pic_path,rate)
pic_path=seg_face(img)
change_color(pic_path,thresh)
步骤三、迭代数据,批量抠图换底

for pic in ["./photo/mayun2.jpg","./photo/liuyifei4.jpg"]:
display(Image.open(pic).resize((295, 413),Image.ANTIALIAS))
id_photo(pic,rate=1.5,thresh=50)
效果:先PO出大佬来镇场

原图:

生成红底证件照:

生成蓝底证件照:

再来一张仙女姐姐的

原图:

生成红底证件照:

生成蓝底证件照:

做这个案例的时候为了达到较好的效果,需要留意下面的几个点:

第一个就是对照片的裁剪,这个裁剪必须保存1寸照片的比例,不然就会使得图像变形。

第二个是在做人物和背景分离的时候,不同的照片,分离的阈值是需要有一定调整的,这样才能达到很好的效果。

第三是在改变背景颜色的时候,人物边缘会有一些色块、噪点出现,这就需要用到图像处理里面的腐蚀、膨胀了,我们对mask进行膨胀,使得人物和背景融合得更好。

看完案例的小伙伴们点个在看,顺便扫码帮忙关注一下呗,你的支持是我继续推新案例的动力。

你可能感兴趣的:(python,图像识别)