Python利用AI接口實(shí)現(xiàn)摳圖并改圖片底色
前言
嗨嗨,大家好呀 ,我是小圓。有時(shí)候我們的證件照需要換底色,又來不及去照相館拍照,用ps也不好摳圖,所以今天給你們分享一下如何用python來摳圖,并換底色
一、注冊百度AI賬號
創(chuàng)建人像分割應(yīng)用
百度人像分割主頁:按步驟注冊,登錄,實(shí)名認(rèn)證即可。
在控制臺主頁找到人體分析
創(chuàng)建應(yīng)用
里面的需要填寫的內(nèi)容可以隨便寫,新用戶要去領(lǐng)取免費(fèi)資源,不然使用不了。
創(chuàng)建完成在應(yīng)用列表記錄 API Key、Secret Key的值 ,稍后要用。
至此,注冊賬號和創(chuàng)建應(yīng)用的任務(wù)就完成了。
二、代碼實(shí)現(xiàn)
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', # 在開放平臺注冊后所建應(yīng)用的API Key 'client_secret': '替換成你的Secret Key' # 所建應(yīng)用的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" # 二進(jìn)制方式打開圖片文件 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格式轉(zhuǎn)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:數(shù)值越小照片越模糊 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 代表圖片質(zhì)量,值越低越模糊 im_resize.save(name) im.close()
6.獲取圖圖片大小
def get_size(): size = os.path.getsize(name) return size / 1024
7.png格式轉(zhuǎn)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 代表圖片質(zhì)量,值越低越模糊 bg.save(jpg_name,quality=70) im.close()
8.主函數(shù)
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.完整代碼
#人像分割 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', # 在開放平臺注冊后所建應(yīng)用的API Key 'client_secret': '替換成你的Secret Key' # 所建應(yīng)用的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 代表圖片質(zhì)量,值越低越模糊 bg.save(jpg_name,quality=70) im.close() #compress_rate:數(shù)值越小照片越模糊 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 代表圖片質(zhì)量,值越低越模糊 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" # 二進(jìn)制方式打開圖片文件 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(" ")
[重要]使用前注意事項(xiàng)
1. 該程序會覆蓋原文件,使用前請備份文件,以免造成數(shù)據(jù)丟失
2. 將程序復(fù)制到和待處理的照片同目錄下,雙擊程序即可運(yùn)行
到此這篇關(guān)于Python利用AI接口實(shí)現(xiàn)摳圖并改圖片底色的文章就介紹到這了,更多相關(guān)Python 摳圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python中Tkinter實(shí)現(xiàn)分頁標(biāo)簽的示例代碼
這篇文章主要介紹了python中Tkinter實(shí)現(xiàn)分頁標(biāo)簽的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04python使用xlrd實(shí)現(xiàn)檢索excel中某列含有指定字符串記錄的方法
這篇文章主要介紹了python使用xlrd實(shí)現(xiàn)檢索excel中某列含有指定字符串記錄的方法,涉及Python使用xlrd模塊檢索Excel的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05Python實(shí)現(xiàn)url長短鏈接的轉(zhuǎn)換
短鏈接,通俗來說,就是將長的URL網(wǎng)址,通過程序計(jì)算等方式,轉(zhuǎn)換為簡短的網(wǎng)址字符串。本文將用Python語言實(shí)現(xiàn)這一效果,需要的可以參考一下2022-11-11Python實(shí)現(xiàn)獲取磁盤剩余空間的2種方法
這篇文章主要介紹了Python實(shí)現(xiàn)獲取磁盤剩余空間的2種方法,結(jié)合具體實(shí)例形式分析了Python操作計(jì)算機(jī)硬件的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06Django中使用Json返回?cái)?shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了Django中使用Json返回?cái)?shù)據(jù)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06