程式設計師必備介面測試偵錯工具:
有時候我們的證件照需要換底色,又來不及去照相館拍照,用ps也不好摳圖,所以今天給你們分享一下如何用python來摳圖,並換底色
百度人像分割主頁:按步驟註冊,登入,實名認證即可。
在控制檯主頁找到人體分析
建立應用
裡面的需要填寫的內容可以隨便寫,新使用者要去領取免費資源,不然使用不了。
建立完成在應用列表記錄 API Key、Secret Key的值 ,稍後要用。
至此,註冊賬號和建立應用的任務就完成了。
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
登入後複製
對文章有問題可以私信我或者來這裡哦 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
登入後複製
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
登入後複製
#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 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()
登入後複製
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(" ")
登入後複製
對文章有問題可以私信我或者來這裡哦 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,就得壓縮照片,路徑之類的問題,總之實現了這個功能很開心!
好啦,今天的分享到這裡就結束了 ~
【相關推薦:Python3視訊教學 】
以上就是手把手帶你通過Python呼叫介面實現摳圖並改底色的詳細內容,更多請關注TW511.COM其它相關文章!