Python实现一键抠图的示例代码
作者:梦想橡皮擦 发布时间:2022-01-31 10:15:49
需求来源
好友 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 ID
,Api Key
,Secret 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)
最后在使用一张复杂些的图片进行测试,背景去除的非常干净。
来源:https://juejin.cn/post/7128416215864705055
猜你喜欢
- Conditional-CSS允许你针对单一浏览器或浏览器组写出有逻辑条件的可维护的特定的CSS声明。使CSS针对特定的浏览器。简化你对CS
- 不错,这个是一个文章详细页,没有左右两栏布局,不过这里我重点要讲的是合理的布局,在稍后的文章中我会详细的介绍浮动元素。好,回到刚才的话题,大
- 访问FTP,无非两件事情:upload和download,最近在项目中需要从ftp下载大量文件,然后我就试着去实验自己的ftp操作类,如下(
- excel 文件内容如下:读取excel内容:import xlrdfrom datetime import datetimefrom xl
- 目前lnmp一键安装包比较多的问题就是502 Bad Gateway,大部分情况下原因是在安装php前,脚本中某些lib包可能没有安装上,造
- MySQL是中小型网站普遍使用的数据库之一,然而,很多人并不清楚MySQL到底能支持多大的数据量,再加上某些国内CMS厂商把数据承载量的责任
- #!/usr/bin/python#-*-coding:utf-8-*-# JCrawler# Author: Jam <810441
- 由于最近有个任务需要在python环境下跑,项目是python3.6 + tensorflow1.3.1.现总结安装环境:卸载Python3
- 一、使用ddt和data装饰器的大致框架如下,每个test_开头的方法,代表一条测试用例from ddt import ddt,dataim
- -----最近从github上找了一个代码跑,但是cpu训练的时间实在是太长,所以想用gpu训练一下,经过了一天的折腾终于可以用gpu进行训
- 本文实例为大家分享了Virginia无密钥解密的具体代码,供大家参考,具体内容如下加密virginia加密是一种多表替换加密方法,通过这种方
- 字符替换是一个非常重要的功能,javascript 中有一个 String.replace( ),但是此方法有
- PHP使用星号替代用户名手机和邮箱这个在许多的活动界面会看到如淘宝的购物界面中的一些客户的支付宝号都是隐藏掉的哦,下面我们来看一下它的使用方
- 有时候我们会在页面上显示用户的所在地区,这个原理是:先得到用户的IP,然后去查询将IP转换成一个数值,最后去查这个数值所在的范围,来得到用户
- 过年GUI博客二连发,本打算出去玩玩,奈何空气,天气实在差,遂使用tkinter开发一款GUI刷屏器,写此博客记录一下我的开发思路。一.准备
- 很多人不明白,学习这些冷门的函数基本上都用不到,或者说是什么多大用处,事实上,有是有很多用处的,比如今天给大家介绍的uuid模块,就能够生成
- 本次小编向大家介绍的是根据用户的需求输入想爬取的内容及页数。主要步骤:1.提示用户输入爬取的内容及页码。2.根据用户输入,获取网址列表。3.
- 一、起源 因子分析的起源是这样的:1904年英
- 本文给大家介绍使用js实现下拉菜单可选择互相移动并实现菜单排序,代码简单易懂,具有参考价值,先给大家展示下效果图,感觉还很满意请参考本段代码
- 我们在编写asp程序时经常会使用到这个功能,一般我们这样判断如:if a="" then ,而这个函数考虑的就比较全面了