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. 再来一些后期大小位置调整,这里略过。。。

---------------------------END---------------------------

题外话

感谢你能看到最后,给大家准备了一些福利!

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img

二、Python兼职渠道推荐*

学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
在这里插入图片描述

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 抠图更换背景是图像处理中的两个常见任务。Python中有许多图像处理库,可以帮助我们完成这些任务,其中最常用的是OpenCV和PIL。 抠图可以分为基于颜色和基于形状的方法。基于颜色的方法是通过选择颜色范围来分离前景和背景。基于形状的方法是通过选择前景和背景的边界来分离它们。 以下是使用OpenCV和PIL进行抠图更换背景的简单示例: ```python import cv2 from PIL import Image # 抠图 def remove_background(img_path): img = cv2.imread(img_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt = max(contours, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(cnt) foreground = img[y:y+h, x:x+w] return foreground # 更换背景 def change_background(foreground_path, background_path, output_path): foreground = Image.open(foreground_path) background = Image.open(background_path).resize(foreground.size) background.paste(foreground, (0, 0), foreground) background.save(output_path) # 使用示例 foreground_path = 'path/to/foreground.png' background_path = 'path/to/background.png' output_path = 'path/to/output.png' foreground = remove_background(foreground_path) foreground.save('path/to/foreground.png') change_background('path/to/foreground.png', background_path, output_path) ``` 在此示例中,我们使用OpenCV提取前景,并使用PIL将前景粘贴到背景上。要使用此代码,您需要安装OpenCV和Pillow(PIL)库。 ### 回答2: Python视频抠图更换背景是指使用Python编程语言对视频中的对象进行抠图,并将其替换为不同的背景。 首先,我们需要使用Python中的图像处理库(如OpenCV)来从视频中提取每一帧图像。然后,我们将使用图像分割算法(如GrabCut算法)来识别和分离图像中的前景和背景。 一旦我们成功地将图像中的前景与背景分开,我们可以使用图像处理技术(如图像融合)将对象从原始背景中移除,并将其贴在新的背景上。 为了实现这个过程,我们可以按照以下步骤进行操作: 1. 导入所需的库,如OpenCV。 2. 从视频中获取每一帧图像。 3. 对每一帧图像进行图像分割,将前景和背景分离出来。 4. 使用图像处理技术将前景与新的背景进行融合。 5. 将处理后的图像保存为视频文件。 值得注意的是,在实际处理视频时,由于视频具有多个帧图像,我们需要对每一帧都进行处理,并将其合并为一个新的视频文件。 总结起来,Python视频抠图更换背景可以通过使用图像处理库和技术,将视频中的对象与背景进行分割和替换,从而实现。这为我们提供了广阔的应用领域,例如影视后期制作、虚拟现实等。 ### 回答3: Python的视频抠图更换背景是使用图像处理技术来实现的。具体步骤如下: 1. 首先,我们需要使用Python的图像处理库(如OpenCV)来读取视频,并提取视频中的每一帧图像。 2. 接着,将每一帧的图像进行背景抠图。可以使用图像分割算法(如GrabCut算法)来实现。该算法能够根据用户给定的初始前景和背景区域,自动分割出前景和背景。 3. 抠图后,将前景图像保存,并继续处理下一帧图像。 4. 接下来,我们需要准备一个新的背景图像。可以选择一张静态图片作为新的背景,或者使用视频中的某一帧图像作为新的背景。 5. 将前景图像与新的背景图像进行融合。可以使用图像合成技术(如透明度混合)来实现。这样就可以将前景图像放置在新的背景之上。 6. 最后,将融合后的图像保存,并继续处理下一帧图像,重复以上步骤,直到处理完所有帧。 使用Python进行视频抠图更换背景可以实现很多有趣的效果,如去除原视频的背景替换为自定义的背景,或者将特定物体提取出来,放置到不同的环境中。这样可以为视频增加视觉吸引力,增强用户的观赏体验。同时,Python作为一种简洁易用的编程语言,具有丰富的图像处理库和算法,使得视频抠图更换背景变得更加简单和高效。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值