Python Pillow 教程2025年3月17日 | 阅读 14 分钟 ![]() 随着科技日新月异,数字图像可以成为获取数据不可或缺的来源。我们在日常生活中会遇到很多数字图像。然而,这些图片可能与任何事物相关。 在编程世界中,我们可以使用各种库或工具来处理数字图像。在本文中,我们将学习 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。它支持各种图像格式,如 jpeg、png、bmp、gif、ppm 和 tiff。 我们可以使用 Pillow 模块对数字图像进行任何操作。在接下来的部分中,我们将学习图像的各种操作,如过滤图像、创建缩略图、合并图像、裁剪图像、模糊图像、调整图像大小、创建水印以及许多其他操作。 安装 Pillow在开始使用 Python 之前,我们需要将 Pillow 库安装到我们的本地计算机上。我们可以通过在终端中输入以下命令来完成。 如果系统中已安装 pip,它将简单显示 “requirement already satisfied”。 使用 Image 模块Python Pillow 库在其内部使用 Image 类来显示图像。属于 Pillow 包的 Image 模块具有一些内置函数,例如加载图像或创建新图像等。 打开、旋转和显示图像打开图像是图像处理的基本操作。我们从 PIL 库导入 Image 模块来加载图像。它提供了 Image.open() 方法,该方法接受图像文件名作为参数。此方法返回图像对象。 我们可以对图像对象进行任何修改,然后使用 save() 方法将其保存到图像。图像打开后,我们可以执行调整大小、裁剪、绘制等许多其他操作。 让我们理解下面的例子。 示例 - 输出 ![]() 旋转后的图像 - ![]() 说明 上面的代码使用标准的 jpeg 显示实用程序显示了原始图像和旋转后的图像。如果在 Jupyter notebook 中运行上面的代码,则输出将在本地计算机的图像库中显示。 Image 模块的属性Image 类包含一些用于操作图像对象的属性。让我们逐一了解这些属性。 Image.filemnameImage.filename 函数返回图像的名称。 输出 'C:\\Users\\DEVANSH SHARMA\\Downloads\\car.jpg' Image.format此函数用于获取图像文件的文件格式,例如 'JPEG'、'BMP'、'PNG' 等。 输出 'JPEG' Image.mode上述方法返回图像使用的像素格式。类型变量是 '1'、'L'、'RGB' 或 'CMYK'。 输出 'RGB' Image.sizeImage.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 模块 的函数。让我们看看语法。 语法 - 在上面的语法中 -
请看以下示例。 示例 - 在下面的示例中,我们将打开一个 .jpg 格式的图像。首先,我们将显示图像,然后以另一种文件格式保存它。 上面的代码将显示实际图像和以 45 度旋转的图像。 解释 - 在上面的代码中,我们从 PIL 库 导入了 Image 模块,并调用了 Image.open() 函数来读取图像。Image.open() 函数返回一个图像对象。此方法接受一个 文件名(字符串)、 一个路径对象或一个 图像(文件) 对象。 保存图像Image 模块提供了 save() 方法来将图像保存到文件。它需要一个文件名,一个已打开用于写入的文件对象。让我们理解以下语法。 语法 - 在上面的语法中 -
如果我们总结上面的语法,文件将根据给定的文件名保存。如果我们不指定格式,则基于当前文件名扩展名。 在上面的示例中,它会根据图像类型的扩展名保存文件。例如 - 代码将在我们的当前工作目录中保存为 png 文件。 我们也可以通过第二个参数明确指定文件类型。让我们看看下面这行。 创建缩略图缩略图是高度和宽度相等的图像。有时,我们需要创建缩略图来指定实际图像。Pillow 库提供了 thumbnail() 函数。此方法将实际图像转换为包含其缩略图版本。缩略图的大小将与给定大小不同。 thumbnail() 估算合适的缩略图尺寸以保留图像的纵横比。我们需要调用另一个方法 draft() 方法,配置文件读取器,最后,调整图像大小。让我们看看下面的语法。 语法 - 上面的语法 -
让我们理解下面的例子。 示例 - 输出 ![]() 解释 - 在上面的代码中,我们定义了 thumbs() 函数,其中包含 try-except 块来处理任何异常。在 try 块中,我们打开了要修改为缩略图的图像。 然后,我们调用了图像对象的 thumbnail() 函数,并传入了缩略图尺寸。如果 try 块抛出错误,它将跳转到 except 块,我们在其中定义了 IOError 异常。 使用 Pillow 合并图像我们可以将一张图像粘贴到另一张图像上。Pillow 库提供了 merge() 函数,它接受一个模式和图像参数的元组。然后,它将它们组合成一个单一的图像。让我们看看下面的语法。 语法 - 在上面的语法中 -
让我们理解下面的例子。 示例 - 输出 ![]() ![]() 当我们执行上面的代码时,我们可以观察到原始图像和合并了 RGB 通道后的图像之间的区别。 合并两张图像合并两张图像与上面相同。首先,需要使用 open() 函数为必需的图像创建一个图像对象。开发人员应该记住一点;在合并两张图像之前,它们的大小必须相同。然后我们使用 Image.new() 函数创建空图像,并使用 paste() 函数粘贴图像。 之后,我们使用 save() 和 show() 函数保存并显示结果图像。让我们理解下面的示例。 示例 - 输出 ![]() 解释 - 在上面的代码中,我们从 PIL 库导入了 Image 模块。我们打开了两张图像以将它们合并在一起。在执行合并操作之前,我们需要确保两张图像的大小相同。我们将第一张图像的大小调整为与第二张图像相同。然后,我们使用 paste() 方法将它们合并。 使用 Pillow 模糊图像模糊图像是通过对图像应用滤波器来降低图像噪声水平的一种方法。它是图像处理中最重要的方面。Pillow 库提供了 ImageFilter 类,其中包含几个标准的图像滤波器。 在本节中,我们将讨论各种模糊图像的技术。这些技术如下所述。
Image.filter() 方法将使用上述技术来应用滤波器图像。 简单模糊在简单模糊中,模糊效果根据指定的内核应用于图像。让我们看看下面的语法。 语法 - 让我们理解下面的例子。 示例 - 输出 原始图像 - ![]() 模糊图像 - ![]() 我们打开了两张标准图像来进行模糊操作。我们可以看到原始图像和模糊图像之间的区别。 盒式模糊盒式模糊滤波器使用 'radius' 作为参数。它与模糊值成正比。 语法 - 在上面的语法中 -
让我们理解下面的例子。 示例 - 原始图像 - ![]() 盒式模糊图像 - ![]() 高斯模糊此滤波器的工作方式与盒式模糊相同,但在算法上略有不同。它也接受 radius 参数。通过更改 radius 值,我们可以生成不同强度的 Gaussianblur 图像。 语法 - 让我们理解下面的例子。 示例 - 输出 原始图像 - ![]() 高斯模糊图像 - ![]() 使用 Pillow 创建水印我们都可能在在线照片的底部看到一个小的文本,称为水印。它是保护图像和防止滥用的绝佳方式。水印不仅可以防止滥用,还可以为我们的创意照片提供版权。因此,在分享到社交媒体之前,最好为图像添加水印。 它是一种叠加在照片上的文本或徽标,具有所有者或照片权利所有者的少量标识。 使用 Python Pillow 库,我们可以非常轻松地为图像添加水印。该库提供了 Image、ImageDraw 和 ImageFont 模块。 让我们理解下面的例子。 示例 - 输出 ![]() 解释 - 在上面的代码中,我们从 Pillow 库导入了 Image、ImageDraw 和 ImageFont 模块,其中 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 异常。让我们看看下面的语法。 语法 - 在上面的语法中 -
让我们理解下面的例子。 示例 - 输出 (0, 0, 255) (255, 0, 0) 正如我们在上面的代码中看到的,getrgb() 方法接受颜色名称并返回 RGB 值。 示例 - 2 ImageDraw 模块ImageDraw 模块是 Pillow 库的一个非常重要的组成部分。我们可以为图像对象提供一些简单的 2D 图形支持。 该模块有助于创建新图像,为图像提供一些额外的修饰,并创建一些图形。它还支持文本注释和形状绘制。 ImageDraw 模块使用以图像左上角为原点的二维坐标系。 它支持文本注释的各种字体,如位图、OpenType 或 TrueType。 让我们理解下面的例子。 示例 - 输出 ![]() Pillow 中的图像序列图像序列等同于 Python PIL 库支持的动画格式。FLI/FLC、GIF 和一些新格式由序列格式维护。TIFF 文件也可以包含多帧。 PIL 按顺序加载图像,例如第一帧根据图像序列加载。我们可以使用 seek() 和 tell() 方法来移动不同的帧。让我们理解下面的示例。 示例 - 输出 raise EOFError EOFError 解释 - 在上面的代码中,我们可以看到当序列结束时会抛出 EOFError 异常。 为了克服这种情况,我们可以创建一个序列迭代器类。 序列迭代器类 使用 Pillow 在图像上写入文本这与创建水印不同。我们可以通过传递要在图像上写入文本的位置来向图像写入文本。我们可以向 text 方法传递多个参数。让我们理解下面的示例。 示例 - 输出 ![]() 使用 Pillow 翻转和旋转图像有时,我们需要执行一些基本操作,例如旋转和翻转图像。这些操作有助于从现有图像中获得洞察,还可以增强图像的可视性。 Pillow 库允许我们非常轻松地翻转和旋转图像。我们将使用图像模块中的 transpose(方法)函数来执行翻转操作。一些最常见的方法如下。
让我们通过一个例子来理解如何水平翻转图像。 示例 - 输出 原始图像 ![]() 翻转后的图像 - ![]() 解释 - 在上面的代码中,我们读取了图像并将其水平翻转。原始图像和翻转后的图像都使用标准的 JPG 显示实用程序显示。 示例 - 2 垂直翻转图像 输出 原始图像 - ![]() 翻转后的图像 - ![]() 让我们通过另一个例子来理解旋转 示例 - 3 输出 原始图像 - ![]() 旋转后的图像 - ![]() |
我们请求您订阅我们的新闻通讯以获取最新更新。