在本文中,我们介绍了 Python Pillow 模块。拥有一些图像处理经验很有用,因为它是各种应用程序的基础:自动后期处理照片、使用 Python 为在线内容生成缩略图以及为机器学习预处理图像等。

Python Pillow 模块是 Python 图像库 (PIL) 的一个分支。用户需要安装 Pillow。最简单的方法是使用 pip 。有关该功能的更多背景信息、教程或参考资料, 请参阅 官方文档。

对于刚接触编程的人来说, 这个专题 是一个很好的起点。它不需要任何编程或 IT 方面的先验知识。如果您是本博客的常客,您可能会注意到一些旨在让学习 Python 变得更加容易的更改。请查看 本文 以了解这些更改的概述。

开场图片

使用 Python Pillow 模块可以处理多种图像格式。您可能最熟悉的是光栅图像格式,例如 JPG、PNG 和 GIF 等。

光栅图像具有固定数量的像素,具体取决于图像分辨率,并且每个像素都有定义的颜色。如果将光栅图像放大到足够大,像素会变得更加明显。绝大多数图像都以这种方式存储。

另一方面,矢量图使用由数学方程定义的曲线来创建图像。您可以不断放大矢量图,而曲线仍然保持平滑。这种文件格式的两个示例是 SVG 和 EPS。

但是,在 Python 中处理基于矢量的图像可能有点棘手,因为它涉及使用其他专门的库。为简单起见,我们将讨论限制在熟悉的光栅图像格式上。

要使用 Python Pillow 模块打开并显示图像,请导入 Image 模块并打开图像,如下所示:

>>> from PIL import Image
>>> im = Image.open('image.png', mode='r')
>>> im.show()

该函数返回一个 Image 对象,您可以开始分析和修改该对象。可选关键字模式定义图像是以读取模式还是写入模式打开。第二个可选关键字格式定义 formats 尝试加载文件的列表或元组。

Python Pillow 模块支持 30 多种不同的光栅文件类型供读取。但是,对写入文件的支持不太广泛。例如,如果您使用 JPG,则打开文件的过程与上述相同。要显示图像,您可以使用 show() 上的方法 Image 。这会在单独的窗口中显示图像,主要用于调试目的。

该对象 im 有几种提供图像信息的方法。 、 format , mode size 方法提供了一些有关图像的关键信息。 尝试一下,看看它们返回什么信息。 这些方法以后会派上用场。 您还可以使用 方法找到图像的分辨率 info ,该方法返回一个包含键“ dpi ”的字典。

修改图像

Python Pillow 模块的优势在于其在修改图像方面的实用性。它包含许多图像预处理和后处理功能。下面,我们来看看一些比较有用的功能。

一个好的起点是了解图像的大小。为此,只需在对象上调用 size 方法 Image ,该方法将返回一个元组,其中包含图像的宽度和高度(以像素为单位)。

您可以使用该 thumbnail() 方法在 Python 中自动生成缩略图,如果您从事在线内容制作业务,该方法非常有用。它需要一个必需参数 size ——一个 () 元组 width, height 和一个可选参数 resample 。要查看一个很好的示例,包括如何进行一些错误处理,请查看 文档中的 教程页面

如果您要准备大量照片进行打印,最好将它们全部转换为标准宽高比。宽高比会改变照片的构图和观感。1:1 的宽高比适合个人资料照片,而 3:2 或 5:4 的宽高比在摄影和艺术印刷品中很常见。

顺便说一句,如果你需要更多关于 Python 自动处理大量文件的背景知识,请查看 这篇文章 .

要更改图片的长宽比,您可以尝试这种 resize 方法,该方法要求您以像素为单位指定新的高度和宽度尺寸。但是,如果使用不同的长宽比,这会扭曲图像。

使用 Python 裁剪图像并不比使用 照片编辑软件 。为了演示这一点,我们首先需要一张可爱的小山羊的照片。我们假设它被命名为“goat.jpg”并保存到您的工作目录中:

>>> from PIL import Image
	>>> im = Image.open('goat.jgp')
	>>> im.show()

如前所述,这将在新窗口中打开以下图像。

Pillow

使用该 size 方法 Image ,我们发现图像的尺寸为 (1124, 750),其长宽比为 3:2。我们可以将其长宽比更改为 1:1,如下所示:

>>> height, width = 500, 500
>>> left, upper, right, lower = 60, 200, width+60, height+200
>>> cropped_image = im.crop((left, upper, right, lower))
>>> cropped_image.show()

上面的代码生成了下面的图像,将这个可爱的小家伙完美地框在了中心。

Pillow

在上面的代码中,我们定义了变量 left , upper , right 、 和 lower ,它们指定要裁剪区域的像素坐标。请注意,我们必须手动定义它,以便山羊被很好地框起来。也就是说,可以通过在图像中定义一个点并围绕该点进行裁剪来自动完成此操作。

Python Pillow 库附带许多预编程函数,可帮助您在图像中呈现最佳效果。这些函数包括将图像转换为灰度的函数以及调整亮度、对比度和锐度等的函数。这些函数包含在 ImageOps ImageEnhance 模块中。

让我们将其中一些函数应用到我们 cropped_image 上面定义的图像对象上。我们将图像转换为灰度并将清晰度提高 1.2 倍:

>>> from PIL import ImageOps, ImageEnhance
>>> im_gray = ImageOps.grayscale(cropped_image)
>>> im_sharp = ImageEnhance.Sharpness(im_gray).enhance(1.2)
>>> im_sharp.show()
Pillow

该模块还包含另一组有用的工具 ImageFilter 。如果您对使用图像数据进行机器学习感兴趣,您可以在这里找到一些有用的图像处理函数。

正如我们 之前所说 ,Python 非常适合机器学习项目。例如,如果您正在编写对象检测应用程序,则在输入图像上使用 EDGE_ENHANCE or FIND_EDGES 可能有助于提高应用程序的准确性。如果您有兴趣获取有关这些过滤器的更多信息,请查看 文档 。

更高级的 Python 图像处理

当我们使用 Python Pillow 模块加载图像时,各个像素值会存储在数据结构中。这意味着我们可以逐个像素地操作图像,这开辟了一系列有趣的可能性,例如创建自定义过滤器。

我们可以按如下方式访问裁剪图像的像素值:

>>> pixels = list(cropped_image.getdata())

get_data 方法返回一个扁平化的序列对象,其中包含一个接一个的像素值。变量 pixels 是一个元组列表,每个元组包含每个像素的 RGB 值。该方法包含一个可选参数 band,它允许您通过提供索引返回 RGB 图像的单个波段:0 表示“R”波段,1 表示“G”波段,2 表示“B”波段。列表的长度 pixels 250.000 ,对应于其大小 500 x 500 (高度 x 宽度)。

假设我们想通过修改像素值来创建自定义过滤器。为了使我们在这里做的事情更清楚一点,我们使用列表推导分离出通道, 并 使用 NumPy 将它们重新转换为数组:

>>> import numpy as np
>>> input_R = np.array([pix[0] for pix in pixels])
>>> input_G = np.array([pix[1] for pix in pixels])
>>> input_B = np.array([pix[2] for pix in pixels])

现在,为了创建过滤器,我们修改通道如下:

>>> output_R = (input_R*0.6358) + (input_G*0.4614) + (input_B*0.1134)
>>> output_G = (input_R*0.2093) + (input_G*0.8116) + (input_B*0.1008)
>>> output_B = (input_R*0.1324) + (input_G*0.3204) + (input_B*0.4786)

我们将输出数组放在一起,并确保结果具有正确的形状(高度、宽度、通道):

>>> new_pixels = np.array([output_R, output_G, output_B]).T.reshape(500, 500, 3)

在 RGB 模式下,每个颜色通道由 0 到 255 之间的整数表示。我们需要将像素值限制在这个范围内,然后将数组元素转换为正确的数据类型:

>>> new_pixels[new_pixels>255]=255
>>> new_pixels = new_pixels.astype(np.uint8)

最后一步是将像素值数组转换为对象 Image ,然后看看我们的辛勤工作:

>>> new_image = Image.fromarray(np.array(new_pixels))
>>> new_image.show()
Pillow

我接下来该去哪里?

Pillow 的功能远不止我们在本文中介绍的那么简单。我们希望鼓励您利用您在这里学到的知识,开始尝试处理您自己的图像。也许您可以制作自己的图像滤镜或自动对照片进行后期处理。

正如我们所提到的,有抱负的数据科学家应该以此为基础开始探索图像分类或对象检测。祝你好运!

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部