站长资讯网
最全最丰富的资讯网站

手把手带你通过Python调用接口实现抠图并改底色

手把手带你通过Python调用接口实现抠图并改底色

程序员必备接口测试调试工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api设计、调试、文档、自动化测试工具
后端、前端、测试,同时在线协作,内容实时同步

有时候我们的证件照需要换底色,又来不及去照相馆拍照,用ps也不好抠图,所以今天给你们分享一下如何用python来抠图,并换底色

一、注册百度AI账号,创建人像分割应用

  • 百度人像分割主页:按步骤注册,登录,实名认证即可。

  • 在控制台主页找到人体分析

手把手带你通过Python调用接口实现抠图并改底色

创建应用

手把手带你通过Python调用接口实现抠图并改底色

里面的需要填写的内容可以随便写,新用户要去领取免费资源,不然使用不了。

手把手带你通过Python调用接口实现抠图并改底色

创建完成在应用列表记录 API Key、Secret Key的值 ,稍后要用。

手把手带你通过Python调用接口实现抠图并改底色

至此,注册账号和创建应用的任务就完成了。

手把手带你通过Python调用接口实现抠图并改底色

二、代码实现

1.引入库

import os import requests import base64 import cv2 import numpy as np from PIL import Image from pathlib import Path  path = os.getcwd() paths = list(Path(path).glob('*'))
登录后复制

2.获取Access Token

def get_access_token():     url = 'https://aip.baidubce.com/oauth/2.0/token'     data = {         'grant_type': 'client_credentials',  # 固定值         'client_id': '替换成你的API Key',  # 在开放平台注册后所建应用的API Key         'client_secret': '替换成你的Secret Key'  # 所建应用的Secret Key     }     res = requests.post(url, data=data)     res = res.json()     access_token = res['access_token']     return access_token
登录后复制

核心代码

对文章有问题可以私信我或者来这里哦 https://jq.qq.com/?_wv=1027&k=s5bZE0K3

def removebg():     try:         request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg"         # 二进制方式打开图片文件         f = open(name, 'rb')         img = base64.b64encode(f.read())         params = {"image":img}         access_token = get_access_token()         request_url = request_url + "?access_token=" + access_token         headers = {'content-type': 'application/x-www-form-urlencoded'}         response = requests.post(request_url, data=params, headers=headers)         if response:             res = response.json()["foreground"]             png_name=name.split('.')[0]+".png"             with open(png_name,"wb") as f:                 data = base64.b64decode(res)                 f.write(data)             fullwhite(png_name) #png图片底色填充,视情况舍去             png_jpg(png_name) #png格式转jpg,视情况舍去             os.remove(png_name) #删除原png图片,视情况舍去             print(name+"t处理成功!")     except Exception as e:         pass
登录后复制

4.图片底色填充

def fullwhite(png_name):     im = Image.open(png_name)     x,y = im.size     try:         p = Image.new('RGBA', im.size, (255,255,255))        # 使用白色来填充背景,视情况更改         p.paste(im, (0, 0, x, y), im)         p.save(png_name)     except:         pass
登录后复制

5.图片压缩

#compress_rate:数值越小照片越模糊 def resize(compress_rate = 0.5):     im = Image.open(name)     w, h = im.size     im_resize = im.resize((int(w*compress_rate), int(h*compress_rate)))     resize_w, resieze_h = im_resize.size     #quality 代表图片质量,值越低越模糊     im_resize.save(name)     im.close()
登录后复制

6.获取图图片大小

def get_size():     size = os.path.getsize(name)     return size / 1024
登录后复制

7.png格式转jpg

def png_jpg(png_name):     im = Image.open(png_name)     bg=Image.new('RGB',im.size,(255,255,255))     bg.paste(im)     jpg_name = png_name.split('.')[0]+".jpg"     #quality 代表图片质量,值越低越模糊     bg.save(jpg_name,quality=70)     im.close()
登录后复制

8.主函数

if __name__ == '__main__':     for i in paths:         name = os.path.basename(i.name)         if(name==os.path.basename(__file__)):             continue         size = get_size()         ##照片压缩         while size >=900:             size = get_size()             resize()            removebg()         print(" ")
登录后复制

9.完整代码

对文章有问题可以私信我或者来这里哦 https://jq.qq.com/?_wv=1027&k=s5bZE0K3

#人像分割 import os import requests import base64 import cv2 import numpy as np from PIL import Image from pathlib import Path  path = os.getcwd() paths = list(Path(path).glob('*'))  def get_access_token():     url = 'https://aip.baidubce.com/oauth/2.0/token'     data = {         'grant_type': 'client_credentials',  # 固定值         'client_id': '替换成你的API Key',  # 在开放平台注册后所建应用的API Key         'client_secret': '替换成你的Secret Key'  # 所建应用的Secret Key     }     res = requests.post(url, data=data)     res = res.json()     access_token = res['access_token']     return access_token def png_jpg(png_name):     im = Image.open(png_name)     bg=Image.new('RGB',im.size,(255,255,255))     bg.paste(im)     jpg_name = png_name.split('.')[0]+".jpg"     #quality 代表图片质量,值越低越模糊     bg.save(jpg_name,quality=70)     im.close()  #compress_rate:数值越小照片越模糊 def resize(compress_rate = 0.5):     im = Image.open(name)     w, h = im.size     im_resize = im.resize((int(w*compress_rate), int(h*compress_rate)))     resize_w, resieze_h = im_resize.size     #quality 代表图片质量,值越低越模糊     im_resize.save(name)     im.close()      def get_size():     size = os.path.getsize(name)     return size / 1024      def fullwhite(png_name):     im = Image.open(png_name)     x,y = im.size     try:         # 使用白色来填充背景         # (alpha band as paste mask).         p = Image.new('RGBA', im.size, (255,255,255))         p.paste(im, (0, 0, x, y), im)         p.save(png_name)     except:         pass  def removebg():     try:         request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg"         # 二进制方式打开图片文件         f = open(name, 'rb')         img = base64.b64encode(f.read())         params = {"image":img}         access_token = get_access_token()         request_url = request_url + "?access_token=" + access_token         headers = {'content-type': 'application/x-www-form-urlencoded'}         response = requests.post(request_url, data=params, headers=headers)         if response:             res = response.json()["foreground"]             png_name=name.split('.')[0]+".png"             with open(png_name,"wb") as f:                 data = base64.b64decode(res)                 f.write(data)             fullwhite(png_name)             png_jpg(png_name)             os.remove(png_name)             print(name+"t处理成功!")     except Exception as e:         pass  if __name__ == '__main__':     for i in paths:         name = os.path.basename(i.name)         if(name==os.path.basename(__file__)):             continue         size = get_size()         ##照片压缩         while size >=900:             size = get_size()             resize()            removebg()         print(" ")
登录后复制

[重要]使用前注意事项

1. 该程序会覆盖原文件,使用前请备份文件,以免造成数据丢失
2. 将程序复制到和待处理的照片同目录下,双击程序即可运行

手把手带你通过Python调用接口实现抠图并改底色

最终效果图

原图:

手把手带你通过Python调用接口实现抠图并改底色
效果图

手把手带你通过Python调用接口实现抠图并改底色

总结

代码不算难,就是中途有许多小问题,比如图片大小不能超过4MB,就得压缩照片,路径之类的问题,总之实现了这个功能很开心!

好啦,今天的分享到这里就结束了 ~

赞(0)
分享到: 更多 (0)