• 技术文章 >后端开发 >Python教程

    手把手带你通过Python调用接口实现抠图并改底色

    青灯夜游青灯夜游2022-10-21 20:03:59转载2347

    php入门到就业线上直播课:进入学习

    有时候我们的证件照需要换底色,又来不及去照相馆拍照,用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调用接口实现抠图并改底色的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:python
    上一篇:一文了解CPython中的垃圾收集器 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 关于python中第三方库交叉编译的问题• Python Scala中使用def语句定义方法的详细过程• 基于Python通过cookie对某芯片网站信息的获取• 用Python获取Amazon亚马逊的商品信息• 什么是Python垃圾回收机制中的引用计数
    1/1

    PHP中文网