Title Loading...

  1. Time Loading...
  2. Wordcount Loading...
  3. Pluto

Catalogue

使用Python和Remove.bg 自动生成证件照

先上女神美照。

咳咳、

下面进入正题。

序言

最近看到一篇文章,介绍了一个利用机器学习等技术进行图像处理的网站:Remove.bg 。站如其名,从他的域名我们就可以看出他的功能是移除图片背景。好了,废话不多说,直接上效果图。

事实证明,女神不管在什么背景下都很美。=_=

可以说抠图的效果是很好了。接下来只要用Python填充一下背景就行了。

下面是详细代码:

代码实现

首先引入模块:

import requests,sys
from PIL import Image

然后我们定义并实现一个抠图函数:

def RemoveBG():  #抠图函数,调用Remove.bg的api
    filename = sys.argv[1]   #接收命令行参数,图片名
    img = open(filename,"rb")

    url = "https://api.remove.bg/v1.0/removebg"
    key = "t784r4J1k7cj61srKEfQTBHL"  #Remove.bg上申请的Key

    headers = {
        'X-Api-Key': key
        }
    data = {
        'size': 'auto'
        }
    files = {
        'image_file': img
        }

    response = requests.post(url,files=files,data=data,headers=headers)
    img.close()

    if response.status_code == requests.codes.ok:
        return response.content
    else:
        print("Error:", response.status_code, response.text)
        return False

此函数以一个图片作为输入,调用Remove.bg的api进行抠图,最后返回去除背景的图片。当然你也可以使用官网提供的专用模块removebg ,两行代码就能实现以上函数的功能。顺便一提,代码中的key真实可用,你也可以拿去使用,不过一个账号一个月只有50张图片的免费额度。博主为了测试脚本,用光了好几个账号。。。

抠完图就是背景填充了,我们再定义一个换背景的函数:

def FillIMG(no_bg): #背景填充函数
    bg_colors = {
        "red" : (255,0,0,255), #红色背景
        "blue" : (67,142,219,255), #蓝色背景
        "white" : (255,255,255,255), #白色背景
        "passport" : (67,142,219,255) #护照背景
    }
    bg_color = sys.argv[2]  #从命令行接收颜色值
    with open("out.png","wb") as i:
        i.write(no_bg)

    img = Image.open("out.png")
    width,height = img.size
    #print(img.mode)
    for h in range(0,height):
        for w in range(0,width):
            data = (img.getpixel((w,h)))
            if data[3] < 201: #阈值
                img.putpixel((w,h),(bg_colors[bg_color]))
    
    img = img.convert("RGB")
    img.save("out.png","png",quality=100, optimize=True, progressive=True)

这个函数的功能很简单,就是遍历图片的RGBA值,找出所有Alpha通道为255的像素点进行替换,我们为了让图片的边缘过渡更自然,可以放宽条件,定义一个阀值,只有小于这个值的点才进行替换。代码中的阀值是通过手动选取计算出来的,并不代表最佳值。当然,若嫌麻烦可以直接用博主计算的值。最终效果还是可以的,可以看文章最后的图片。

计算阀值

这是计算的截图,过程是对边缘的像素点规律进行大致总结,最终取了201的值。

然后,别忘记调用:

if __name__ == "__main__":
    FillIMG(RemoveBG())

最后

效果图:

女神的:

文章开头给出的图片的效果:

当然,Remove.bg不仅能扣人,还能扣许多东西。我们甚至能给猫主子做一张证件照:

还有车的。。

特斯拉的Model S。

最后的最后,本文的部分图片来源网络,侵删。