思路

百度接口的申请就不赘述了。
主要用到了百度人体分析api和PIL库,主要实现三个功能:

  • 人像背景消除
  • 生成证件照,并可随意设置底色
  • 证件照图片格式转换

具体方法

  1. get_portrait():利用百度提供的人体分析模块将人像部分分离出来,以png格式保存备用
  2. get_background():生成合适大小的底色图,一般为红、蓝、白。
  3. main():将人像覆盖粘贴在底色图上,得到所需证件照。
  4. resize():按需调整证件照大小和底色。
  5. conversion():统一转换为jpg格式并适当压缩。
  6. 批量操作需要注意的便是命名规则,常用方法是根据时间戳命名,既能保证有序,也能避免重复。

具体实现

python3.8以上

from aip import AipBodyAnalysis
from PIL import Image
import base64
import requests
import os
import timeAPP_ID = '****'
API_KEY = '****'
SECRET_KEY = '****'
client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)def create_dir(path):if not os.path.exists(path):os.mkdir(path)class Zjz:def __init__(self):self.prefix_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg?access_token="self.host = f'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={API_KEY}&client_secret={SECRET_KEY}'self.save_path = r'C:\Users\Administrator\Pictures\Camera Roll'self.pending_path = r'C:\Users\Administrator\Pictures\Temporary image'self.access_token = Noneself.original_image_path = Noneself.response = Noneself.foreground = Noneself.original_size = Noneself.bool_invalid = Noneself.images = []self.image_names = []self.background_colors = ['white', 'blue', 'red', 'green', 'pink', 'yellow', 'purple', 'black', 'snow']print('You must give the path of the image')def get_access_token(self):if response := requests.get(self.host):self.access_token = response.json()['access_token']def valid(self, image_path):try:(image := Image.open(image_path)).verify()self.bool_invalid = Falseif 0 in image.size:self.bool_invalid = Trueprint(image.size)except Exception as e:print(e)self.bool_invalid = Truedef get_portrait(self):with open(self.original_image_path, 'rb') as fp:img = base64.b64encode(fp.read())headers = {'content-type': 'application/x-www-form-urlencoded'}params = {"image": img}filename = f'{self.pending_path}/{os.path.basename(os.path.splitext(self.original_image_path)[0])}.png'print('portrait: ', filename)self.valid(filename)if not os.path.exists(filename) or self.bool_invalid is True:self.get_access_token()self.response = requests.post(self.prefix_url + self.access_token, data=params, headers=headers)if self.response:with open(filename, 'wb') as fp:fp.write(image_data := base64.b64decode(self.response.json()['foreground']))try:self.foreground = Image.open(image_data)except Exception as e:print(e)else:self.foreground = Image.open(filename)def get_background(self):self.original_size = Image.open(self.original_image_path).sizeprint(self.original_size)for color in self.background_colors[:3]:self.images.append(Image.new('RGBA', self.original_size, color))def main(self):create_dir(self.pending_path)self.get_portrait()self.get_background()r, g, b, a = self.foreground.split()for i, image in enumerate(self.images):image.paste(self.foreground, (0, 0), mask=a)image.save(temp := f'{self.save_path}/ZJZ_{self.background_colors[i][:2].upper()}_'f'{os.path.basename(os.path.splitext(self.original_image_path)[0])}_'f'{time.strftime("%Y%m%d", time.localtime())}.png')self.image_names.append(temp)def resize(self, width=250, color='white'):ratio = self.original_size[1] / self.original_size[0]height = int(width * ratio)fore = self.foreground.resize((width, height))image = Image.new('RGBA', (width, height), color)image.paste(fore, (0, 0), mask=fore.split()[-1])image.save(temp := f'{self.save_path}/ZJZ_RESIZE_{time.strftime("%Y%m%d", time.localtime())}.png')self.image_names.append(temp)def conversion(self):for filename in self.image_names:image = Image.open(filename)output_file = os.path.splitext(filename)[0] + '.jpg'try:r, g, b, a = image.split()image = Image.merge("RGB", (r, g, b))image.convert("RGB").save(output_file, quality=50)except Exception as e:print("Format conversion failed", e)def delete_invalid_image(self):for file in os.listdir(self.save_path):file = os.path.join(self.save_path, file)self.valid(file)if self.bool_invalid and 'jpg' in file:enter = input(f'you want to delete the file "{file}"?\n')if enter in ('y', 'Y', 'yes'):os.remove(file)if __name__ == "__main__":photo = Zjz()photo.original_image_path = r'C:\Users\Administrator\Pictures\Saved Pictures\psc2.webp'photo.main()# photo.resize()photo.conversion()# photo.delete_invalid_image()

运行效果


声明:图片为网上随便下载的,侵删。

python 证件照换底、抠像 百度人体分析相关推荐

  1. python证件照_python实现证件照换底功能

    本来是在找交通识别的程序,然后凑巧看见了证件照换底,于是学习了一下~一开始在网上找了一个很普遍写的程序,但是效果并不好,想要放弃了,然后看见了这个,参考:python opencv实现证件照换底功能 ...

  2. php-opencv身份证识别,python opencv实现证件照换底功能

    本文实例为大家分享了python opencv实现证件照换底功能的具体代码,供大家参考,具体内容如下 思路:先转到HSV空间,利用颜色提取背景制作掩模版mask,然后通过按位操作提取人像和制作新背景, ...

  3. python opencv pdf脚本之家_python opencv实现证件照换底功能

    本文实例为大家分享了python opencv实现证件照换底功能的具体代码,供大家参考,具体内容如下 思路:先转到HSV空间,利用颜色提取背景制作掩模版mask,然后通过按位操作提取人像和制作新背景, ...

  4. python 实现证件照换底

    本来是在找交通识别的程序,然后凑巧看见了证件照换底,于是学习了一下~一开始在网上找了一个很普遍写的程序,但是效果并不好,想要放弃了,然后看见了这个,参考:https://blog.csdn.net/w ...

  5. 利用Photoshop对证件照换底且抠出头发丝

    如何利用Photoshop对证件照换底,且抠出头发丝 关键在于利用好通道选取 详情参见: https://www.2014g.cn/hangye/1734.html

  6. OpenCV-python 证件照换底-利用函数inRange及滑动条creatTrackbar分割

    OpenCV-python 证件照换底 利用函数inRange及滑动条creatTrackbar分割 证件照换底HSV参考图片总是设定不准inRange的值.做一个利用滑条滑动直接看效果的吧 inRa ...

  7. 调用百度人体分析api 实现人体分析

    这个是调用百度ai平台的人体分析方法. 调用前需要在百度AI平台上注册账号,获得APP_ID,API_KEY ,SECRET_KEY这些. 下面这段代码的思路是,首先读取本地图片,之后将图片传入百度接 ...

  8. C#调用百度人体分析SDK进行人流量分析,计算图片的人数

    写在前面 本文默认已经注册了百度大脑(添加链接描述)账号, 以及创建了人体分析的应用获取了AppID,API Key,Secret Key 还没有上面操作的可以看我的这篇文章添加链接描述 安装sdk ...

  9. matlab实现证件照换底+美肤的功能

    f=imread('boy2.png');subplot(1,3,1);imshow(f);title('原图'); a=f(:,:,3); %确定图像的大小 [m,n]=size(a);  for ...

最新文章

  1. 剑指Offer_Python实现
  2. ( Android-大神博客)
  3. shiro进行散列算法操作
  4. Cocos2d-x项目移植到WP8小记
  5. 提高篇 第四部分 数据结构 第2章 RMQ问题
  6. Laravel教程 四:数据库和Eloquent
  7. 帆软单元格以HTML显示内容(点击更改herf值和onclik值)
  8. mysql timeout expired处理
  9. Eviews3种面板模型的选择-F检验操作详情
  10. 常用计算机操作技巧与方法ppt,相见恨晚的20个常用PPT小技巧
  11. 中国地震数据集-包含经纬度及深度(2000-2020年)
  12. 关于铭锐办公系统运行节资统计
  13. 基于Vue框架开发的页面加载二维地图以及交互
  14. 网络程序设计 Sockets
  15. 大话设计模式18----备忘录模式
  16. cad 中的计算机在哪里打开,CAD计算器如何使用?
  17. Vue.js快速入门之五:Mockjs的使用和语法详解
  18. ToolsOh第6批收录
  19. 【Python】初学者也可以实现的人脸识别系统-0x1
  20. Java汉字转汉语拼音工具类

热门文章

  1. 开启CSDN消息免打扰
  2. dbpedia知识图谱java_中文通用百科知识图谱(CN-DBpedia)
  3. 供应链安全这件事,早就被朱元璋玩明白了
  4. 手机怎么伪原创火山小视频 本地短视频去水印在线
  5. python3 爬取今日头条文章(巧妙避开as,cp,_signature)
  6. DBeaver设置Maven镜像仓库
  7. android 逆向so,逆向Android SO,以《遇见》App为例
  8. 某音App protobuf协议还原逆向分析
  9. 张小龙-年薪近3亿的微信之父,他是如何做到的?
  10. 三菱FX系列PLC简单总结