首頁 > 軟體

Python實現一鍵摳圖的範例程式碼

2022-08-07 14:01:42

需求來源

好友 A:橡皮擦,可否提供網頁,上傳帶人像的圖片,然後可以直接摳圖,最好直接生成 PNG 圖片下載。 橡皮擦:每天需要呼叫多少次? 好友 A:大概 100 次吧。 橡皮擦:妥了,給你寫個免費的吧。

本案例的實戰需求是對圖片進行摳圖,每日請求量為 100,來源依舊是好友求助,既然日請求量不大,那某智慧雲的人像分隔介面就可以使用了,申請之後,其贈送了 10000 次,每秒限制 2 次請求,足夠使用。

實現方法

從官方下載 Python API SDK 之後,得到下圖所示目錄:

然後進入該目錄執行下述命令安裝 SDK

python setup.py build
python setup.py install

安裝成功之後就可以通過 pip list 檢視相關資料。

接下來需要建立一個 AipBodyAnalysis,該物件是後續處理人像分析的核心物件。

新建 show_people.py 檔案,輸入如下程式碼:

from aip import AipBodyAnalysis

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)

其中 App IDApi KeySecret Key 都需要提前在平臺方申請使用。

接下來就可以使用人像分隔主體函數了,程式碼如下:

client = AipBodyAnalysis(APP_ID, API_KEY, SECRET_KEY)
""" 讀取圖片 """
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

image = get_file_content('./demo.png')

""" 呼叫人像分割 """
ret = client.bodySeg(image)

print(ret)

程式碼用到的測試圖為:

執行後提示 ModuleNotFoundError: No module named 'chardet',使用 pip install chardet 安裝缺少模組。

上述 client.bodySeg(image) 函數的引數如下所示:

image:影象資料,base64 編碼,要求 base64 編碼後大小不超過 4M,最短邊至少 15px,最長邊最大 4096px,支援 jpg/png/bmp 格式;

type:可以通過設定 type 引數,自主設定返回哪些結果圖,避免造成頻寬的浪費

可選值說明:

  • labelmap - 二值影象,需二次處理方能檢視分割效果
  • scoremap - 人像前景灰度圖
  • foreground - 人像前景摳圖,透明背景

type 引數值可以是可選值的組合,用逗號分隔;如果無此引數預設輸出全部 3 類結果圖

基於上述設定,在方法呼叫時新增引數,獲取人像前景摳圖。

""" 如果有可選引數 """
options = {}
options["type"] = "foreground"

""" 帶引數呼叫人像分割 """
ret = client.bodySeg(image, options)
print(ret)

返回參數列如下所示:

  • labelmap:分割結果圖片,base64 編碼之後的二值影象,需二次處理方能檢視分割效果
  • scoremap :分割後人像前景的 scoremap,歸一到 0-255,不用進行二次處理,直接解碼儲存圖片即可。Base64 編碼後的灰度圖檔案,圖片中每個畫素點的灰度值 = 置信度 * 255,置信度為原圖對應畫素點位於人體輪廓內的置信度,取值範圍[0, 1]
  • foreground:分割後的人像前景摳圖,透明背景,Base64 編碼後的 png 格式圖片,不用進行二次處理,直接解碼儲存圖片即可。將置信度大於 0.5 的畫素摳出來,並通過 image matting 技術消除鋸齒
  • person_num:檢測到的人體框數目
  • person_info:人體框資訊

此時輸出 person_num 就可以獲得人像數量,測試程式碼如下所示。

ret = client.bodySeg(image, options)
print(ret["person_num"]) # 輸出 1

接下來直接儲存前景摳圖,匯入 base64 模組,直接解碼儲存即可。

""" 帶引數呼叫人像分割 """
ret = client.bodySeg(image, options)
data = ret["foreground"]

data = base64.b64decode(data)
# 生成圖片
with open("./fore.png",'wb') as f:
    f.write(data)

最後在使用一張複雜些的圖片進行測試,背景去除的非常乾淨。

到此這篇關於Python實現一鍵摳圖的範例程式碼的文章就介紹到這了,更多相關Python摳圖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com