python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景

1. 前言

图像处理中,有很多都需要对图像进行抠图、提取关键信息等操作。而其中的蒙版抠图技术可以帮助我们快速、准确地去除图像中不需要的部分,使得图像背景透明,以便更好地嵌入到其他地方中。

本文将详细介绍如何使用Python中的Pillow和OpenCV库来完成一张图片的蒙版抠图,具体包括以下几个部分:

1.1 蒙版抠图的基本概念

1.2 抠图所需的库和工具

2. 蒙版抠图的基本概念

蒙版抠图是指通过一张蒙版图片来对原始图片进行修改,从而达到抠出感兴趣部分的效果。在实际操作中,我们只需要将蒙版图片中需要保留的部分设置为白色,其余部分设置为黑色,再将其与原始图片进行按位与操作,即可得到我们所需的抠图结果。

因此,完成蒙版抠图需要以下两个步骤:

制作蒙版图片:将所需保留的区域设置为白色,其他区域设置为黑色

利用蒙版图片对原始图片进行抠图:即将原始图片和蒙版图片进行按位与操作得到抠图结果

3. 抠图所需的库和工具

为了完成一张图片的蒙版抠图,我们需要使用两个常用的Python图像处理库:Pillow和OpenCV。

3.1 Pillow库

Pillow是Python的一种图像处理库,支持很多常见图片格式的读取和编辑,如PNG、JPEG、BMP等常见图片格式,同时能够进行基本的图像变换、滤波、颜色处理等操作。

在使用Pillow库进行图片的蒙版处理时,主要使用到的类为Image,其支持读取和保存常见的图片格式,并且提供了一系列对图像进行修改的方法。

3.2 OpenCV库

OpenCV是一种跨平台的计算机视觉库,主要用于图像处理和机器视觉应用中的算法设计和开发。它支持多种编程语言,包括C++、Python等,并且提供了很多处理图像和视频的函数,如读入和写出图片、视频流的处理、图像分割、特征检测、跟踪等。

在使用OpenCV库进行图片的蒙版处理时,主要使用到的函数为cv2.bitwise_and(),其支持按位与操作来完成图片的蒙版抠图。

4. 使用Pillow和OpenCV库进行蒙版抠图

4.1 加载图片

我们首先需要通过Pillow库中的Image.open()函数将原始图片加载到内存中,并且将其转换为灰度图,我这里选取了一张主题为La Casa De Papel的图片作为示例。

from PIL import Image

img = Image.open("lacasadepapel.jpg")

img = img.convert('L')

# 查看图片信息

print("Format: {}, Size: {}".format(img.format, img.size))

运行该代码可以显示出该图片的基本信息:

Format: JPEG, Size: (960, 640)

下面我们来看一下原始图片的样子。

4.2 制作蒙版

我们需要创建一个与原始图片等大的黑白蒙版图片,并定义需要保留的部分,如下所示:

import numpy as np

# 创建蒙版图片

mask = np.zeros((img.height, img.width), np.uint8)

# 定义需要保留的部分

# 这里是对人物面部的区域进行保留

points1 = [[655, 105], [652, 269], [605, 272], [604, 105]]

points2 = [[345, 108], [355, 304], [479, 308], [482, 97]]

cv2.fillPoly(mask,[np.array(points1)],(255))

cv2.fillPoly(mask,[np.array(points2)],(255))

# 将蒙版保存到磁盘中

cv2.imwrite('mask.jpg', mask)

运行该代码后,将会在磁盘上生成一张蒙版图片mask.jpg,如下所示。

4.3 利用蒙版进行按位与操作

最后一步,我们需要利用OpenCV库中的cv2.bitwise_and()函数将原始图片和蒙版图片进行按位与操作。得到的图片会把蒙版中白色的部分(即需要保留的部分)取出来,其他部分变为全透明的效果,如下所示:

import cv2

# 将原始图片和蒙版图片都加载到内存中

img1 = cv2.imread("lacasadepapel.jpg")

mask = cv2.imread("mask.jpg", cv2.IMREAD_GRAYSCALE)

# 利用蒙版进行按位与操作

res = cv2.bitwise_and(img1, img1, mask=mask)

# 将处理后的结果保存到磁盘中

cv2.imwrite('res.png', res)

运行该代码后,将会在磁盘上生成一张抠图结果图片res.png,如下所示。

5. 总结

通过本文的介绍,读者可以了解到如何使用Python中的Pillow和OpenCV库完成一张图片的蒙版抠图。在具体实现中,我们需要先制作一张黑白蒙版图片,并定义需要保留的部分,然后利用OpenCV库中的按位与函数将原始图片和蒙版图片进行按位与操作得到抠图结果。整个过程简单明了,且运行效果较好。

后端开发标签