加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

使用Python如何处理照片并更改证件照底色

发布时间:2023-10-07 12:54:59 所属栏目:语言 来源:
导读:这篇主要是介绍“基于python怎样实现证件照抠图及换背景”的内容了,下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家解决基于python怎样实现证件

这篇主要是介绍“基于python怎样实现证件照抠图及换背景”的内容了,下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家解决基于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

核心代码

对文章有问题可以私信我或者来这里哦 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)

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,就得压缩照片,路径之类的问题,总之实现了这个功能很开心!

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章