Python Pillow 教程

2025年3月17日 | 阅读 14 分钟
Python Pillow Tutorial

随着科技日新月异,数字图像可以成为获取数据不可或缺的来源。我们在日常生活中会遇到很多数字图像。然而,这些图片可能与任何事物相关。

在编程世界中,我们可以使用各种库或工具来处理数字图像。在本文中,我们将学习 Python 中一个流行的工具 Pillow。然而,Python 提供了许多其他有用的库,如 OpenCV、Python Image Library (PIL) 和 Scikit-image。本文完全关注 Python Pillow 模块 (PIL)

在深入研究这个主题之前,让我们先了解一下图像处理。

什么是图像处理?

图像处理是分析和处理数字图像的一种方法。主要目标是提取可用于其他地方的某些信息。让我们通过一个现实生活中的例子来使其易于理解。

例如 - 如今,CCTV 摄像头安装在交通信号灯处,它们捕捉数字图像,识别车辆的车牌,并检查车辆是否违反了交通规则。所有这些过程都与图像处理有关。

引言

Python Pillow 模块建立在 PIL (Python Image Library) 的基础上。它是 Python 中图像处理的重要模块。但它不支持 Python 3。但是,我们可以将此模块与 Python 3.x 版本一起使用,名称为 PIL。它支持各种图像格式,如 jpegpng、bmp、gif、ppm 和 tiff。

我们可以使用 Pillow 模块对数字图像进行任何操作。在接下来的部分中,我们将学习图像的各种操作,如过滤图像、创建缩略图、合并图像、裁剪图像、模糊图像、调整图像大小、创建水印以及许多其他操作。

安装 Pillow

在开始使用 Python 之前,我们需要将 Pillow 库安装到我们的本地计算机上。我们可以通过在终端中输入以下命令来完成。

如果系统中已安装 pip,它将简单显示 “requirement already satisfied”。

使用 Image 模块

Python Pillow 库在其内部使用 Image 类来显示图像。属于 Pillow 包的 Image 模块具有一些内置函数,例如加载图像或创建新图像等。

打开、旋转和显示图像

打开图像是图像处理的基本操作。我们从 PIL 库导入 Image 模块来加载图像。它提供了 Image.open() 方法,该方法接受图像文件名作为参数。此方法返回图像对象。

我们可以对图像对象进行任何修改,然后使用 save() 方法将其保存到图像。图像打开后,我们可以执行调整大小、裁剪、绘制等许多其他操作。

让我们理解下面的例子。

示例 -

输出

Python Pillow Tutorial

旋转后的图像 -

Python Pillow Tutorial

说明

上面的代码使用标准的 jpeg 显示实用程序显示了原始图像和旋转后的图像。如果在 Jupyter notebook 中运行上面的代码,则输出将在本地计算机的图像库中显示。

Image 模块的属性

Image 类包含一些用于操作图像对象的属性。让我们逐一了解这些属性。

Image.filemname

Image.filename 函数返回图像的名称。

输出

'C:\\Users\\DEVANSH SHARMA\\Downloads\\car.jpg'

Image.format

此函数用于获取图像文件的文件格式,例如 'JPEG'、'BMP'、'PNG' 等。

输出

'JPEG'

Image.mode

上述方法返回图像使用的像素格式。类型变量是 '1'、'L'、'RGB' 或 'CMYK'。

输出

'RGB'

Image.size

Image.size 函数返回一个包含图像高度和宽度的元组。

输出

(480, 320)

Image.width

此方法返回图像的宽度。

输出

480

Image.height

此方法返回图像的宽度。

输出

320

Image.info

此方法返回一个包含与图像相关联的数据的字典。

输出

{'jfif': 257,
 'jfif_version': (1, 1),
 'jfif_unit': 0,
 'jfif_density': (1, 1),
 'progressive': 1,
 'progression': 1}

处理图像

Python Pillow 模块使得处理图像变得非常简单。我们可以使用 PIL.Image 模块 的函数。让我们看看语法。

语法 -

在上面的语法中 -

  • fp - 它是文件对象或表示文件名,Path 对象。此文件对象可以实现 read()、seek()tell() 方法。
  • mode - 它表示文件模式。如果给出,则是一个可选参数,默认为 'r'。

请看以下示例。

示例 -

在下面的示例中,我们将打开一个 .jpg 格式的图像。首先,我们将显示图像,然后以另一种文件格式保存它。

上面的代码将显示实际图像和以 45 度旋转的图像。

解释 -

在上面的代码中,我们从 PIL 库 导入了 Image 模块,并调用了 Image.open() 函数来读取图像。Image.open() 函数返回一个图像对象。此方法接受一个 文件名(字符串)、 一个路径对象或一个 图像(文件) 对象。

保存图像

Image 模块提供了 save() 方法来将图像保存到文件。它需要一个文件名,一个已打开用于写入的文件对象。让我们理解以下语法。

语法 -

在上面的语法中 -

  • fp - 它表示一个文件名(字符串)、Path 对象或文件对象。
  • format - 这是一个可选的格式覆盖。当使用文件对象而不是文件名时使用它。
  • options - 这是图像编写器的附加参数。
  • 返回值 - 返回值是
  • KeyError - 当无法从文件名确定输出格式时使用。
  • IOError - 当文件可能已形成且可能包含部分数据时使用。

如果我们总结上面的语法,文件将根据给定的文件名保存。如果我们不指定格式,则基于当前文件名扩展名。

在上面的示例中,它会根据图像类型的扩展名保存文件。例如 - 代码将在我们的当前工作目录中保存为 png 文件。

我们也可以通过第二个参数明确指定文件类型。让我们看看下面这行。

创建缩略图

缩略图是高度和宽度相等的图像。有时,我们需要创建缩略图来指定实际图像。Pillow 库提供了 thumbnail() 函数。此方法将实际图像转换为包含其缩略图版本。缩略图的大小将与给定大小不同。

thumbnail() 估算合适的缩略图尺寸以保留图像的纵横比。我们需要调用另一个方法 draft() 方法,配置文件读取器,最后,调整图像大小。让我们看看下面的语法。

语法 -

上面的语法 -

  • Size - 这是缩略图的定义尺寸。
  • Resample - 这是一个可选的重采样滤波器。此滤波器可以是以下之一:Image.NEAREST、BILNEAR、PIL.Image.BICUBIC 或 PIL.Image.LANCZOS。默认情况下,它是 PIL.Image.BICUBIC。
  • Return - 返回 None

让我们理解下面的例子。

示例 -

输出

Python Pillow Tutorial

解释 -

在上面的代码中,我们定义了 thumbs() 函数,其中包含 try-except 块来处理任何异常。在 try 块中,我们打开了要修改为缩略图的图像。

然后,我们调用了图像对象的 thumbnail() 函数,并传入了缩略图尺寸。如果 try 块抛出错误,它将跳转到 except 块,我们在其中定义了 IOError 异常。

使用 Pillow 合并图像

我们可以将一张图像粘贴到另一张图像上。Pillow 库提供了 merge() 函数,它接受一个模式和图像参数的元组。然后,它将它们组合成一个单一的图像。让我们看看下面的语法。

语法 -

在上面的语法中 -

  • mode - 用于输出图像。
  • bands - 这是一个顺序,包含每个输出通道的一个单通道图像。
  • 返回值 - 返回一个图像对象。

让我们理解下面的例子。

示例 -

输出

Python Pillow Tutorial
Python Pillow Tutorial

当我们执行上面的代码时,我们可以观察到原始图像和合并了 RGB 通道后的图像之间的区别。

合并两张图像

合并两张图像与上面相同。首先,需要使用 open() 函数为必需的图像创建一个图像对象。开发人员应该记住一点;在合并两张图像之前,它们的大小必须相同。然后我们使用 Image.new() 函数创建空图像,并使用 paste() 函数粘贴图像。

之后,我们使用 save()show() 函数保存并显示结果图像。让我们理解下面的示例。

示例 -

输出

Python Pillow Tutorial

解释 -

在上面的代码中,我们从 PIL 库导入了 Image 模块。我们打开了两张图像以将它们合并在一起。在执行合并操作之前,我们需要确保两张图像的大小相同。我们将第一张图像的大小调整为与第二张图像相同。然后,我们使用 paste() 方法将它们合并。

使用 Pillow 模糊图像

模糊图像是通过对图像应用滤波器来降低图像噪声水平的一种方法。它是图像处理中最重要的方面。Pillow 库提供了 ImageFilter 类,其中包含几个标准的图像滤波器。

在本节中,我们将讨论各种模糊图像的技术。这些技术如下所述。

  • 简单模糊
  • 盒式模糊
  • 高斯模糊

Image.filter() 方法将使用上述技术来应用滤波器图像。

简单模糊

在简单模糊中,模糊效果根据指定的内核应用于图像。让我们看看下面的语法。

语法 -

让我们理解下面的例子。

示例 -

输出

原始图像 -

Python Pillow Tutorial

模糊图像 -

Python Pillow Tutorial

我们打开了两张标准图像来进行模糊操作。我们可以看到原始图像和模糊图像之间的区别。

盒式模糊

盒式模糊滤波器使用 'radius' 作为参数。它与模糊值成正比。

语法 -

在上面的语法中 -

  • Radius - 它表示一个方向上的盒子。
  • Radius 0 - 它表示不执行模糊操作并返回相同的图像。
  • RRadius 1 & minnus - 它总共考虑 9 个像素,每个方向一个像素。

让我们理解下面的例子。

示例 -

原始图像 -

Python Pillow Tutorial

盒式模糊图像 -

Python Pillow Tutorial

高斯模糊

此滤波器的工作方式与盒式模糊相同,但在算法上略有不同。它也接受 radius 参数。通过更改 radius 值,我们可以生成不同强度的 Gaussianblur 图像。

语法 -

让我们理解下面的例子。

示例 -

输出

原始图像 -

Python Pillow Tutorial

高斯模糊图像 -

Python Pillow Tutorial

使用 Pillow 创建水印

我们都可能在在线照片的底部看到一个小的文本,称为水印。它是保护图像和防止滥用的绝佳方式。水印不仅可以防止滥用,还可以为我们的创意照片提供版权。因此,在分享到社交媒体之前,最好为图像添加水印。

它是一种叠加在照片上的文本或徽标,具有所有者或照片权利所有者的少量标识。

使用 Python Pillow 库,我们可以非常轻松地为图像添加水印。该库提供了 Image、ImageDraw 和 ImageFont 模块。

让我们理解下面的例子。

示例 -

输出

Python Pillow Tutorial

解释 -

在上面的代码中,我们从 Pillow 库导入了 Image、ImageDrawImageFont 模块,其中 ImageDraw 模块增强了向图像绘制 2D 图形的功能。

ImageFont 模块负责在写入水印时添加字体功能。我们创建了一个图像对象,我们将在其中应用水印。将图像对象传递给 Draw() 方法;我们写入了水印并将其保存到 text 变量。

我们也可以设置字体系列和字体大小,就像我们设置了 'Times New Roman' 和字体大小 25 一样。然后,我们计算了 x、y 坐标以指定图像中文本的位置。一旦计算出坐标,我们就将水印绘制在右下角。

为图像应用颜色

Pillow 库提供了 ImageColor 模块,其中包含多种格式的颜色。它还具有从 CSS3 样式颜色说明符到 RGB 元组的转换器。让我们看看 ImageColor 模块支持的颜色名称。

第一种格式是十六进制颜色说明符,指定为 #rgb#rrggbb。 例如,#00ff00 表示纯绿色。

第二种格式是 #00ff00 十六进制颜色,红色值为 0 (0% 红色),绿色值为 255 (100% 绿色),其 RGB 的蓝色值为 0 (0% 蓝色)。

ImageColor 模块中有 140 个标准颜色名称。大多数颜色都得到 Windows 系统和大多数网页浏览器的支持。

ImageColor.getrgb() 方法

此方法用于将颜色字符串转换为 RGB 元组,并在字符串无法解析时引发 ValueError 异常。让我们看看下面的语法。

语法 -

在上面的语法中 -

  • color - 它是颜色字符串。
  • 返回值 - 返回 RGB (red, green, blue [,alpha])。

让我们理解下面的例子。

示例 -

输出

(0, 0, 255)
(255, 0, 0)

正如我们在上面的代码中看到的,getrgb() 方法接受颜色名称并返回 RGB 值。

示例 - 2

ImageDraw 模块

ImageDraw 模块是 Pillow 库的一个非常重要的组成部分。我们可以为图像对象提供一些简单的 2D 图形支持。

该模块有助于创建新图像,为图像提供一些额外的修饰,并创建一些图形。它还支持文本注释和形状绘制。

ImageDraw 模块使用以图像左上角为原点的二维坐标系。

它支持文本注释的各种字体,如位图、OpenType 或 TrueType。

让我们理解下面的例子。

示例 -

输出

Python Pillow Tutorial

Pillow 中的图像序列

图像序列等同于 Python PIL 库支持的动画格式。FLI/FLC、GIF 和一些新格式由序列格式维护。TIFF 文件也可以包含多帧。

PIL 按顺序加载图像,例如第一帧根据图像序列加载。我们可以使用 seek() 和 tell() 方法来移动不同的帧。让我们理解下面的示例。

示例 -

输出

raise EOFError
EOFError

解释 -

在上面的代码中,我们可以看到当序列结束时会抛出 EOFError 异常。

为了克服这种情况,我们可以创建一个序列迭代器类。

序列迭代器类

使用 Pillow 在图像上写入文本

这与创建水印不同。我们可以通过传递要在图像上写入文本的位置来向图像写入文本。我们可以向 text 方法传递多个参数。让我们理解下面的示例。

示例 -

输出

Python Pillow Tutorial

使用 Pillow 翻转和旋转图像

有时,我们需要执行一些基本操作,例如旋转和翻转图像。这些操作有助于从现有图像中获得洞察,还可以增强图像的可视性。

Pillow 库允许我们非常轻松地翻转和旋转图像。我们将使用图像模块中的 transpose(方法)函数来执行翻转操作。一些最常见的方法如下。

  • FLIP_LEFT_RIGHT - 用于水平翻转图像。
  • FLIP_TOP_BOTTOM - 用于垂直翻转图像。
  • ROTATE_90 - 用于通过指定度数旋转图像。

让我们通过一个例子来理解如何水平翻转图像。

示例 -

输出

原始图像

Python Pillow Tutorial

翻转后的图像 -

Python Pillow Tutorial

解释 -

在上面的代码中,我们读取了图像并将其水平翻转。原始图像和翻转后的图像都使用标准的 JPG 显示实用程序显示。

示例 - 2 垂直翻转图像

输出

原始图像 -

Python Pillow Tutorial

翻转后的图像 -

Python Pillow Tutorial

让我们通过另一个例子来理解旋转

示例 - 3

输出

原始图像 -

Python Pillow Tutorial

旋转后的图像 -

Python Pillow Tutorial