在网上寻找了很久,关于PS抠图的东东,然后发现有几种方法:
1、使用alpha通道进行抠图,只能实现简单的去除背景的功能。但是比较实用。
2、使用百度AI里面的paddlehub库进行抠图,通过AI算法识别出人物进行抠图,但是尝试之后发现只能扣人像,其他好像就抠不出来。
3、使用removebg 去抠图,但是需要注册账号获取key,比较麻烦。
在本博文中,我将分享给大家上述两种方法的抠图,第三种可以自行尝试。
一、使用alpha通道进行抠图
(一)原生抠图
首先从网上随便找一张图片,本次案例如下:
然后可以发现,该图片比较简单,背景色主要是白色,那么我们可以直接使用PIL库中的Image类进行处理,相关代码如下:
from PIL import Image
img = Image.open(r".\image\timg.jpg")
img = img.resize([200,200])
img = img.convert("RGBA") # 转换获取信息
pixdata = img.load()
for y in range(img.size[1]):
for x in range(img.size[0]):
if pixdata[x, y][0] > 250 and pixdata[x, y][1] > 250 and pixdata[x, y][2] > 200 and pixdata[x, y][3] > 250:
pixdata[x, y] = (255, 255, 255, 0)
img.save(r".\image\timg_new.png")
备注:这里的阈值250可以自行设置,譬如可以设置成200、220等等。
(二)原理解析
通过img = Image.open(r".\image\timg.jpg")
加载图片,通过img.resize([200,200])
缩小图片的尺寸为(200,200),然后通过img = img.convert("RGBA")
将R\G\B三通道转换成R\G\B\A四通道,即增加alpha通道,因为需要使用alpha通道来设置透明(即是否显示的问题)。
下面这段代码则是告诉我们当颜色通道均在250以上时,就设置成不显示(即透明)
pixdata = img.load()
for y in range(img.size[1]):
for x in range(img.size[0]):
if pixdata[x, y][0] > 250 and pixdata[x, y][1] > 250 and pixdata[x, y][2] > 200 and pixdata[x, y][3] > 250:
pixdata[x, y] = (255, 255, 255, 0)
备注:白色色值为(255,255,255)。
然后将修改完的图片信息保存到新的图片img.save(r".\image\timg_new.png")
中。
(三)显示效果
效果还是挺不错的。
(四)拓展应用
其实当我们懂得了这个原理之后,我们可以去背,也可以将背景修改为别的任意的颜色,譬如,这里可以设置成pink粉红色
。
from PIL import Image
img = Image.open(r".\image\timg.jpg")
img = img.resize([200,200])
img = img.convert("RGBA") # 转换获取信息
pixdata = img.load()
for y in range(img.size[1]):
for x in range(img.size[0]):
if pixdata[x, y][0] > 250 and pixdata[x, y][1] > 250 and pixdata[x, y][2] > 250 and pixdata[x, y][3] > 200:
pixdata[x, y] = (255,192,203, 255)
img.save(r".\image\timg_new.png")
运行效果如下:
懂得了这些原理之后,就不能了,主要就是用到了alpha通道设置透明的方法。
二、使用百度AI里面的paddlehub库进行抠图
(一)paddlehub库安装
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip install paddlehub -i https://mirror.baidu.com/pypi/simple
备注:如果对于该库想深入了解,可参看官网:paddle官网
(二)代码实现
通过加载PaddleHub DeepLabv3+模型(deeplabv3p_xception65_humanseg)实现一键抠图
import os
import paddlehub
# 加载模型
humanseg = paddlehub.Module(name="deeplabv3p_xception65_humanseg")
# 指定抠图图片目录
path = './image/'
files = []
dirs = os.listdir(path)
for diretion in dirs:
files.append(path + diretion)
# 批量抠图
results = humanseg.segmentation(data={"image": files})
运行完毕之后,自动会在文件夹中新建一个文件夹(humanseg_output)
,然后把扣完的图片保存在其中。
关于这部分,我就不上效果图了,大家可以自行测试就好!自测的话,只能扣人像,其他的暂时抠不出来。
OK,本博文结束,希望大家能够喜欢。