• Python 几行代码实现一键抠图,收费应用 BYEBYE


    ⛳️ 需求来源

    好友 A:橡皮擦,可否提供网页,上传带人像的图片,然后可以直接抠图,最好直接生成 PNG 图片下载。
    橡皮擦:每天需要调用多少次?
    好友 A:大概 100 次吧。
    橡皮擦:妥了,给你写个免费的吧。

    本案例的实战需求是对图片进行抠图,每日请求量为 100,来源依旧是好友求助,既然日请求量不大,那某智能云的人像分隔接口就可以使用了,申请之后,其赠送了 10000 次,每秒限制 2 次请求,足够使用。
    Python 几行代码实现一键抠图,收费应用 BYEBYE
    从官方下载 Python API SDK 之后,得到下图所示目录:
    Python 几行代码实现一键抠图,收费应用 BYEBYE
    然后进入该目录执行下述命令安装 SDK

    python setup.py build
    python setup.py install
    
    • 1
    • 2

    安装成功之后就可以通过 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其中 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    代码用到的测试图为:
    Python 几行代码实现一键抠图,收费应用 BYEBYE
    运行后提示 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    返回参数列表如下所示:

    • 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
    
    • 1
    • 2

    接下来直接保存前景抠图,导入 base64 模块,直接解码保存即可。

    """ 带参数调用人像分割 """
    ret = client.bodySeg(image, options)
    data = ret["foreground"]
    
    data = base64.b64decode(data)
    # 生成图片
    with open("./fore.png",'wb') as f:
        f.write(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Python 几行代码实现一键抠图,收费应用 BYEBYE
    最后在使用一张复杂些的图片进行测试,背景去除的非常干净。
    Python 几行代码实现一键抠图,收费应用 BYEBYE

    📢📢📢📢📢📢
    💗 你正在阅读 【梦想橡皮擦】 的博客
    👍 阅读完毕,可以点点小手赞一下
    🌻 发现错误,直接评论区中指正吧
    📆 橡皮擦的第 713 篇原创博客

    从订购之日起,案例 5 年内保证更新

  • 相关阅读:
    【DB2】—— 数据库表查询一直查不出来数据
    Quantlab整合Alpha158因子集,为机器学习大类资产配置策略做准备(代码+数据)
    有什么视频转文字软件?快把这些方法收好
    (附源码)springboot电影院售票与管理系统 011449
    SpringAMQP简介及简单使用
    数据库MySQL中Show指令祥解
    【数值分析】1 - 误差及有关概念
    控制您的音乐、视频等媒体内容
    springboot+Mybatis项目初始化
    【linux命令讲解大全】105.掌握磁盘配额管理的edquota命令
  • 原文地址:https://blog.csdn.net/hihell/article/details/126183088