python多媒体应用:图片抠像的两种方法(alpha和paddlehub去背)

在网上寻找了很久,关于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,本博文结束,希望大家能够喜欢。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值