目录
💴哈喽,大家好丫,国庆节快乐丫,你们的小郭子又来啦 ~
今天给朋友们介绍一个小技巧,就是用Python实现【抠图+改底色】功能。
你会发现,有时候我们的证件照需要换底色,又来不及去照相馆拍照,用ps也不好抠图。 那么今天这个小技巧就用得上了。
话不多说,直接开干,嘿嘿嘿
一、注册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
3. 核心代码
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.获取图图片大小
def get_size():
size = os.path.getsize(name)
return size / 1024
6.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.完整代码
#人像分割
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. 将程序复制到和待处理的照片同目录下,双击程序即可运行
好啦,今天的分享到这里就结束啦 ~
觉得我分享的文章不错的话,可以关注一下哦,嘻嘻嘻
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/73264.html