Python實現(xiàn)一鍵摳圖的示例代碼
需求來源
好友 A:橡皮擦,可否提供網(wǎng)頁,上傳帶人像的圖片,然后可以直接摳圖,最好直接生成 PNG 圖片下載。 橡皮擦:每天需要調(diào)用多少次? 好友 A:大概 100 次吧。 橡皮擦:妥了,給你寫個免費的吧。
本案例的實戰(zhàn)需求是對圖片進行摳圖,每日請求量為 100,來源依舊是好友求助,既然日請求量不大,那某智能云的人像分隔接口就可以使用了,申請之后,其贈送了 10000 次,每秒限制 2 次請求,足夠使用。
實現(xiàn)方法
從官方下載 Python API SDK 之后,得到下圖所示目錄:
然后進入該目錄執(zhí)行下述命令安裝 SDK
python setup.py build python setup.py install
安裝成功之后就可以通過 pip list
查看相關(guān)數(shù)據(jù)。
接下來需要創(chuàng)建一個 AipBodyAnalysis
,該對象是后續(xù)處理人像分析的核心對象。
新建 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 ID
,Api Key
,Secret Key
都需要提前在平臺方申請使用。
接下來就可以使用人像分隔主體函數(shù)了,代碼如下:
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') """ 調(diào)用人像分割 """ ret = client.bodySeg(image) print(ret)
代碼用到的測試圖為:
運行后提示 ModuleNotFoundError: No module named 'chardet'
,使用 pip install chardet
安裝缺少模塊。
上述 client.bodySeg(image)
函數(shù)的參數(shù)如下所示:
image
:圖像數(shù)據(jù),base64 編碼,要求 base64 編碼后大小不超過 4M,最短邊至少 15px,最長邊最大 4096px,支持 jpg/png/bmp 格式;
type
:可以通過設(shè)置 type 參數(shù),自主設(shè)置返回哪些結(jié)果圖,避免造成帶寬的浪費
可選值說明:
- labelmap - 二值圖像,需二次處理方能查看分割效果
- scoremap - 人像前景灰度圖
- foreground - 人像前景摳圖,透明背景
type 參數(shù)值可以是可選值的組合,用逗號分隔;如果無此參數(shù)默認輸出全部 3 類結(jié)果圖
基于上述配置,在方法調(diào)用時添加參數(shù),獲取人像前景摳圖。
""" 如果有可選參數(shù) """ options = {} options["type"] = "foreground" """ 帶參數(shù)調(diào)用人像分割 """ ret = client.bodySeg(image, options) print(ret)
返回參數(shù)列表如下所示:
labelmap
:分割結(jié)果圖片,base64 編碼之后的二值圖像,需二次處理方能查看分割效果scoremap
:分割后人像前景的 scoremap,歸一到 0-255,不用進行二次處理,直接解碼保存圖片即可。Base64 編碼后的灰度圖文件,圖片中每個像素點的灰度值 = 置信度 * 255,置信度為原圖對應(yīng)像素點位于人體輪廓內(nèi)的置信度,取值范圍[0, 1]foreground
:分割后的人像前景摳圖,透明背景,Base64 編碼后的 png 格式圖片,不用進行二次處理,直接解碼保存圖片即可。將置信度大于 0.5 的像素摳出來,并通過 image matting 技術(shù)消除鋸齒person_num
:檢測到的人體框數(shù)目person_info
:人體框信息
此時輸出 person_num
就可以獲得人像數(shù)量,測試代碼如下所示。
ret = client.bodySeg(image, options) print(ret["person_num"]) # 輸出 1
接下來直接保存前景摳圖,導(dǎo)入 base64 模塊,直接解碼保存即可。
""" 帶參數(shù)調(diào)用人像分割 """ ret = client.bodySeg(image, options) data = ret["foreground"] data = base64.b64decode(data) # 生成圖片 with open("./fore.png",'wb') as f: f.write(data)
最后在使用一張復(fù)雜些的圖片進行測試,背景去除的非常干凈。
到此這篇關(guān)于Python實現(xiàn)一鍵摳圖的示例代碼的文章就介紹到這了,更多相關(guān)Python摳圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python編程matplotlib繪圖挑鉆石seaborn小提琴和箱線圖
這篇文章主要為大家介紹了Python編程如何使用matplotlib繪圖來挑出完美的鉆石以及seaborn小提琴和箱線圖,有需要的朋友可以借鑒參考下,希望能夠優(yōu)速幫助2021-10-10python pygame實現(xiàn)滾動橫版射擊游戲城市之戰(zhàn)
這篇文章主要為大家詳細介紹了python pygame實現(xiàn)滾動橫版射擊游戲城市之戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11selenium3.0+python之環(huán)境搭建的方法步驟
這篇文章主要介紹了selenium3.0+python之環(huán)境搭建的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02