手把手帶你通過Python呼叫介面實現摳圖並改底色

2022-10-21 22:01:00

程式設計師必備介面測試偵錯工具:

有時候我們的證件照需要換底色,又來不及去照相館拍照,用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)
    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,就得壓縮照片,路徑之類的問題,總之實現了這個功能很開心!

好啦,今天的分享到這裡就結束了 ~

【相關推薦:Python3視訊教學

以上就是手把手帶你通過Python呼叫介面實現摳圖並改底色的詳細內容,更多請關注TW511.COM其它相關文章!