利用Python制作证件照

大家好!好久没见面了。今天和大家分享的是利用Python批处理随意拍的照片,生成证件照。有时候我们没空去拍证件照,又急着需要上传电子证件照,怎么办呢?PS又不是很熟。今天get这个技能的coder们,就可以方便自己生成证件照了。

上段时间因为工作需要,需要大量拍摄证件照。一个个处理比较麻烦,于是就想着直接收集生活照利用Python来帮忙解决一下这个问题。刚好上次参加百度的训练营有接触过PaddleHub,今天就借助PaddleHub来实现这个功能。

 

思路:

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

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

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

步骤1、准备工作

# 需要先升级到最新版本的paddlehub!pip install --upgrade paddlehub​​​​​​
# 查看我们上传的照片!ls photo/

#导入需要用的依赖库from PIL import Imageimport paddlehub as hubimport cv2import 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(413*w/295)    box=(cw-rate*w, ch-rate*h, cw+rate*w, 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]<thresh),dtype=np.uint8)            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. 第一个就是对照片的裁剪,这个裁剪必须保存1寸照片的比例,不然就会使得图像变形。

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

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

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

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值