Python调用接口实现抠图并改底色
有时候我们的证件照需要换底色,又来不及去照相馆拍照,用ps也不好抠图,所以今天给你们分享一下如何用python来抠图,并换底色
一、注册百度AI账号,创建人像分割应用
-
百度人像分割主页:按步骤注册,登录,实名认证即可。
-
在控制台主页找到人体分析
创建应用
里面的需要填写的内容可以随便写,新用户要去领取免费资源,不然使用不了。
创建完成在应用列表记录 API Key、Secret Key的值 ,稍后要用。
至此,注册账号和创建应用的任务就完成了。
二、代码实现
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
核心代码
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. 将程序复制到和待处理的照片同目录下,双击程序即可运行
最终效果图
原图:
效果图
总结
代码不算难,就是中途有许多小问题,比如图片大小不能超过4MB,就得压缩照片,路径之类的问题,总之实现了这个功能很开心!
好啦,今天的分享到这里就结束了 ~
本文出至:学新通
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通
- 本文地址: https://www.swvq.com/boutique/detail/1771
- 联系方式: luke.wu@swvq.com
- 来源链接: www.php.cn/python-tutorials-496819.html
系列文章
更多
同类精品
更多
精彩评论
-
windows上查看nginx是否启动
PHP中文网 04-19 -
2023年最新的28道PHP面试题附答案
PHP中文网 03-27 -
docker hub 进不去怎么办
PHP中文网 03-15 -
推荐五款xml编辑工具
PHP中文网 03-04 -
navicat怎样清除注册表
PHP中文网 04-05 -
强力推荐10款好看使用的Bootstrap后台管理系统模板
PHP中文网 03-09 -
ChatGPT应用通过Axios+EventSource使用GPT3.5 API
uWydnA 03-13 -
vscode怎么调整代码大小两种方法
PHP中文网 03-11 -
navicat删除的数据能还原吗
PHP中文网 04-09 -
mysql,navicat怎么设置主键自增
PHP中文网 04-08