Python + AI:完美抠图,更换背景

翻看家里的老照片,发现一只小 dog,很趣致吧,这眼神汪汪地~ (背景是在厨房)。

有时候就想把某些照片里的人物或者主角抠出来,然后贴到喜欢的背景图里,比如你想自己制作一个 DIY 的头像。

虽然有很多 APP 或者小程序可以提供这类的功能,付费购买服务固然没问题,但是免费的服务都是带有瑕疵的,比如输出的最终图片带有广告水印,或者像素过低导致图片略显模糊等等。

你想要免费的早午晚三餐,我都懂。求人不如求己,发挥极客精神,让我们自己动手吧。接下来就介绍一个非常好用的 python 工具包 Rembg,其中也应用了大模型之类的 AI 来辅助提取人像或者主角,详情往下看。

环境准备–linux

Rembg 是用 python 开发的,依赖于 python3 的执行环境,而且要求版本在 python 3.7 ~ 3.11 之间。

我比较常使用的平台是 linux,现在大部分的 linux 发行版都是默认安装了 python3,开始之前还是确认一下 python 的版本

$ cat /etc/issue
Ubuntu 20.04.4 LTS
$ python -V
Python 3.8.10

如果你最先安装的是 python 2,然后又安装了 python 3,那么可以

$ python3 -V

环境

在安装工具包之前,有必要提醒一下,每个工具都有其依赖的特定环境,那么环境的相互隔离就显得很有必要了,在 python 生态中,我们可以运用好虚拟环境的特性做到这点。

创建一个工程目录 rembg,并在里边新建虚拟环境,存放环境的目录名这里定为 .venv,然后切换 python 环境到虚拟环境下

$ python -m venv .venv
$ source .venv/bin/activate
(.venv) $ 

进入虚拟环境后,命令行的最前面会自动加上虚拟环境的目录,表示已经进入该目录下的虚拟环境。关于 python 虚拟环境的更多介绍可以看看我的另一篇文章《Python:灵活的开发环境》// TODO.

安装 Rembg

(.venv) $ pip install rembg

Rembg 的依赖包比较多,安装启动后,需要等一会,一杯茶过后我们再回来看。。。

如果你的网络环境不是很顺畅,可以参考一下网上的方法,切换 linux 安装包源到墙内的镜像源,不展开了,自行查阅。

虽说运行前的环境已安装好,但是 Rembg 在本地第一次运行的时候会从 github 下载一个叫做 U-2-Net(U square net) 的模式识别图像处理模型,这是一个基于 Apache 2.0 license 的开源 AI 项目,曾经获得 2020 最佳论文奖(BEST PAPER AWARD)。

到这一步了,如果还会执行失败,大概率是因为你的网络受限导致下载失败,比如在墙内。不用慌,我都替你想好了,可以在我公众号后台回复【u2net】获得网盘分享链接。下载完成后,用 tar -zxf 解压并存放到当前用户的 ~/.u2net/u2net.onnx。u2net.onnx 就是解压后的最终文件,大小接近 200 MB,下载起来需要花点时间,不过这对于好奇心爆棚的你来说,都是小 case。

小试牛刀–抹除背景

好了,环境已准备好,现在开始耍耍刚磨好的大刀 -

动物篇

就用文初的那张小狗图片来试一下吧,原始图片是 dog.jpeg,输出没有背景的图片 dog_without_bg.jpeg,文件路径都在当前文件夹下。

(.venv) $ rembg i dog.jpeg dog_without_bg.jpeg
(.venv) $ ll
...
-r-xr-xr-x 1 root root  959306 Mar 16  2017 dog.jpeg*
-rwxrwxrwx 1 root root 2088784 Oct 21 20:52 dog_without_bg.jpeg*

打开输出的图片 dog_without_bg.jpeg 看看

看上去图像提取得非常好,背景真的抹去了,而且速度很快,输入的源图片文件 dog.jpeg 大小接近 1 MB,花费的时间也不过十几秒钟,可能我的机器比较高级?其实硬件放在现在就是中规中矩的配置,你一点也不需要为此担心硬件。

人物篇

试完动物,再换一张人像看看,试一下可爱的小女孩被偷拍下的一瞬间

(.venv) $ rembg i girl.jpeg girl_without_bg.jpeg
(.venv) $ ll
...
-r-xr-xr-x 1 root root  99541 Dec 28  2014 girl.jpeg*
-rwxrwxrwx 1 root root 857075 Oct 21 20:54 girl_without_bg.jpeg*

打开输出的图片 girl_without_bg.jpeg 看看

这效果真的是杠杠滴,输入的图片文件 girl.jpeg 大小接近 100 KB,花费的时间也仅需要几秒钟,太棒了!

更换背景

上面只是抹除了老照片里的背景,新的背景插入还需要其它软件来完成,而插入图片可以通过专业图片处理软件的图层操作来添加,比如 Photoshop 等等。

但是我要介绍一个非常好用的开源免费软件给大家,这样你就不需要为盗版 license 烦恼了,我怎么那么喜欢为大伙操碎了心?

GIMP 接受挑战!GIMP 跨平台,在各个主流操作系统都有完好的支持。

先来看看效果,我把小狗的背景换到了更加喜庆的场合下,你看

怎么弄的?

  1. 打开 GIMP,然后菜单栏 文件 --> 打开,选中上面 Rembg 输出的已抹去背景的小狗图 dog_without_bg.jpeg。
  2. 再次菜单栏 文件 --> 作为图层打开,选中一张你觉得很喜庆的照片,这张照片将作为新背景图。我选了一张放鞭炮之后的照片,鞭炮象征着热闹,再好不过了。
  3. 这时候,你会发现新背景图在最前面,把其它内容都遮盖了。你可以在主窗口的右边,有个图层窗口,其中列出来了有两个图层,最上面是最后打开的新背景图,下面才是没有背景的小狗图,这样你可以拖动其中一张,让它俩互换顺序,然后你就可以看到小狗已经站在新背景图里了。
  4. 再来一些后期大小位置调整,这里略过。。。

Python 的迅速崛起对整个行业来说都是极其有利的 ,但“人红是非多”,导致它平添了许许多多的批评,不过依旧挡不住它火爆的发展势头。

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

### Python 图像处理 抠图 并 替背景 对于图像处理中的抠图以及替背景操作,Python提供了多种方法来完成这一目标。通过结合`PIL`(即`Pillow`)和`OpenCV`这两个强大的库能够高效地实现所需的功能。 #### 将OpenCV读取的BGR格式图像转为RGB格式以便于后续处理 由于OpenCV默认使用的色彩空间是BGR而非标准的RGB,在使用`Image.fromarray()`函数之前需要先将色彩模式进行转[^1]: ```python import cv2 from PIL import Image image = cv2.imread('input_image_path') # 加载输入图片 rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转成RGB颜色模型 pil_image = Image.fromarray(rgb_image) # 创建PIL.Image对象用于进一步编辑 ``` #### 利用蒙版技术进行抠图 为了创建一个具有透明背景的新图像,可以通过构建二值化掩码的方式来进行前景提取。这里假设已经有一个预定义好的黑白掩码(mask),其中白色区域代表要保留的部分而黑色部分则会被视为透明: ```python mask = ... # 假设这是预先计算得到的二值化掩码 rgba_image = pil_image.convert("RGBA") # 将原图转为支持Alpha通道的形式 datas = rgba_image.getdata() newData = [] for item in datas: if item[:3] == (0, 0, 0): # 如果像素对应位置在mask上为黑,则设置其alpha=0表示完全透明 newData.append((255, 255, 255, 0)) else: newData.append(item) rgba_image.putdata(newData) rgba_image.save("output_with_transparent_bg.png", "PNG") ``` 上述代码片段实现了基于给定掩码对指定图像执行简单的抠图过程,并保存结果到文件中作为带有透明度信息(PNG格式)的结果图像。 #### 合成新背景 一旦获得了带透明背景的目标物体图像之后就可以轻松地将其放置在一个新的背景下了。只需要加载一张想要用来充当背景的新图片并与之前的抠图结果相叠加即可[^2]: ```python background_img = Image.open('path_to_new_background').convert('RGBA') foreground_img = Image.open('output_with_transparent_bg.png') # 确保两张图片尺寸一致;如果不符可调整大小 if background_img.size != foreground_img.size: background_img = background_img.resize(foreground_img.size) final_composite = Image.alpha_composite(background_img, foreground_img) final_composite.show() final_composite.save('resulting_image.png', 'PNG') ``` 这段脚本展示了如何把两个不同源的图像合成在一起形成最终的效果图。注意这里的顺序很重要——总是应该先打开背景再叠加上面的对象层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值