Python案例——利用接口实现【自动抠图+改色】

目录

一、注册AI账号

二、代码实现

1.引入库

2.获取Access Token

3. 核心代码

4.图片底色填充

5.获取图图片大小

6.png格式转jpg

8.完整代码

三、使用前注意事项



💴哈喽,大家好丫,国庆节快乐丫,你们的小郭子又来啦 ~

                        

今天给朋友们介绍一个小技巧,就是用Python实现【抠图+改底色】功能。

你会发现,有时候我们的证件照需要换底色,又来不及去照相馆拍照,用ps也不好抠图。 那么今天这个小技巧就用得上了。

话不多说,直接开干,嘿嘿嘿

                                        

一、注册AI账号

  1. 百度人像分割主页:按步骤注册,登录,实名认证即可。
  2. 在控制台主页找到人体分析

创建应用

 

 创建完成在应用列表记录 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

3. 核心代码

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.获取图图片大小

def get_size():
    size = os.path.getsize(name)
    return size / 1024

6.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.完整代码

#人像分割
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. 将程序复制到和待处理的照片同目录下,双击程序即可运行

好啦,今天的分享到这里就结束啦 ~

觉得我分享的文章不错的话,可以关注一下哦,嘻嘻嘻

                                        

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python中的OpenCV和Dlib库来实现自动人脸的功能。以下是一个简单的示例代码: ```python import cv2 import dlib # 加载Haar级联分类器,用于检测人脸 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载Dlib的人脸检测器和面部标志检测器 detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat') # 加载像 img = cv2.imread('input.jpg') # 转换为灰度像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用Haar级联分类器检测人脸 faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 对每个检测到的人脸进行处理 for (x, y, w, h) in faces: # 使用Dlib人脸检测器检测面部标志 rect = dlib.rectangle(int(x), int(y), int(x + w), int(y + h)) landmarks = predictor(gray, rect) # 提取面部标志中的左眼、右眼、鼻子和嘴巴的坐标 left_eye = (landmarks.part(36).x, landmarks.part(36).y, landmarks.part(39).x, landmarks.part(39).y) right_eye = (landmarks.part(42).x, landmarks.part(42).y, landmarks.part(45).x, landmarks.part(45).y) nose = (landmarks.part(27).x, landmarks.part(27).y, landmarks.part(35).x, landmarks.part(35).y) mouth = (landmarks.part(48).x, landmarks.part(48).y, landmarks.part(54).x, landmarks.part(54).y) # 根据面部标志的坐标出人脸 mask = np.zeros_like(gray) cv2.fillPoly(mask, [np.array([left_eye, right_eye, nose, mouth], dtype=np.int32)], 255) masked_img = cv2.bitwise_and(img, img, mask=mask) # 显示结果 cv2.imshow('Input', img) cv2.imshow('Output', masked_img) cv2.waitKey(0) ``` 在上面的代码中,我们首先使用Haar级联分类器检测人脸,然后使用Dlib人脸检测器和面部标志检测器提取面部标志的坐标。最后,我们根据面部标志的坐标出人脸,并显示结果。注意,需要先安装OpenCV和Dlib库,并下载相应的分类器和模型文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值