Python Pillow - 快速指南



Python Pillow - 概述

在当今的数字世界中,我们遇到了大量的数字图像。如果我们使用 Python 编程语言,它提供了许多图像处理库来为数字图像添加图像处理功能。

一些最常见的图像处理库有:OpenCV、Python 图像库 (PIL)、Scikit-image、Pillow。但是,在本教程中,我们只关注 **Pillow 模块**,并尝试探索该模块的各种功能。

Pillow 建立在 PIL (Python Image Library) 之上。PIL 是 Python 中图像处理的重要模块之一。但是,PIL 模块自 2011 年以来一直不受支持,并且不支持 Python 3。

Pillow 模块提供了更多功能,可以在所有主要操作系统上运行,并支持 Python 3。它支持各种各样的图像,例如“jpeg”、“png”、“bmp”、“gif”、“ppm”、“tiff”。您可以使用 Pillow 模块对数字图像执行几乎所有操作。除了基本图像处理功能外,还包括点运算、使用内置卷积核滤波图像以及颜色空间转换。

图像档案

Python 图像库最适合图像归档和批量处理应用程序。Python Pillow 包可用于创建缩略图、从一种格式转换为另一种格式以及打印图像等。

图像显示

您可以使用 Tk PhotoImage、BitmapImage 和 Windows DIB 接口显示图像,这些接口可与 PythonWin 和其他基于 Windows 的工具包以及许多其他图形用户界面 (GUI) 工具包一起使用。

出于调试目的,有一个 show() 方法将图像保存到磁盘,该方法调用外部显示实用程序。

图像处理

Pillow 库包含所有基本图像处理功能。您可以进行图像调整大小、旋转和变换。

Pillow 模块允许您使用直方图方法从图像中提取一些统计数据,这些数据稍后可用于统计分析和自动对比度增强。

Python Pillow - 环境设置

本章讨论如何在您的计算机上安装 Pillow 包。

安装 Pillow 包非常容易,尤其是在使用 pip 安装时。

使用 pip 安装 Pillow

要使用 pip 安装 Pillow,只需在命令提示符中运行以下命令:

python -m pip install pip
python -m pip install pillow

如果您的计算机上已经安装了 pip 和 Pillow,则上述命令将简单地显示“需求已满足”,如下所示:

Requirement

Python Pillow - 使用 Image 模块

要显示图像,Pillow 库在其内部使用图像类。Pillow 包中的 Image 模块包含一些重要的内置函数,例如加载图像或创建新图像等。

打开、旋转和显示图像

要加载图像,我们只需从 Pillow 中导入 Image 模块并调用 **Image.open()**,传入图像文件名。

为了使其与旧模块 Python Imaging Library (PIL) 向后兼容,我们不调用 Pillow 模块,而是调用 PIL 模块。这就是为什么我们的代码以 **“from PIL import Image”** 而不是 **“from Pillow import Image”** 开头。

接下来,我们将通过调用 **Image.open() 函数** 来加载图像,该函数返回 Image 对象数据类型的返回值。我们可以对图像对象进行的任何修改都可以使用 **save()** 方法保存到图像文件中。我们使用 **Image.open()** 获取的图像对象稍后可用于调整大小、裁剪、绘制或在此 Image 对象上调用其他图像处理方法。

示例

以下示例演示了如何使用 Python Pillow 旋转图像:

from PIL import Image
#Open image using Image module
im = Image.open("images/cuba.jpg")
#Show actual Image
im.show()
#Show rotated Image
im = im.rotate(45)
im.show()

输出

如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示原始图像和旋转后的图像,如下所示:

实际图像

Original

旋转后的图像(45 度)

Rotated Image

Image 模块的属性

Image 类的实例具有一些属性。让我们尝试通过示例了解其中的一些:

Image.filename

此函数用于获取图像的文件名或路径。

>>>image = Image.open('beach1.jpg')
>>> image.filename
'beach1.jpg'

Image.format

此函数返回图像文件的格式,例如“JPEG”、“BMP”、“PNG”等。

>>> image = Image.open('beach1.jpg')
>>>
>>> image.format
'JPEG'

Image.mode

它用于获取图像使用的像素格式。典型值是“1”、“L”、“RGB”或“CMYK”。

>>> image.mode
'RGB'

Image.size

它返回包含图像高度和宽度的元组。

>>> image.size
(1280, 721)

Image.width

它仅返回图像的宽度。

>>> image.width
1280

Image.height

它仅返回图像的高度。

>>> image.height
721

Image.info

它返回一个字典,其中包含与图像相关联的数据。

>>> image.info
{'jfif': 257, 'jfif_version': (1, 1), 'dpi': (300, 300), 'jfif_unit': 1, 'jfif_density': (300, 300), 'exif': b"Exif\x00\x00MM\x00*\x00\x00\x00
....
....
\xeb\x00\x00'\x10\x00\x00\xd7\xb3\x00\x00\x03\xe8"}

Image.palette

如果存在,它返回颜色调色板表。

>>> image.palette

**以上输出** - None

Python Pillow - 处理图像

本章详细阐述了如何在 Pillow 中读取和保存图像等主题。

读取图像

使用 Pillow 库读取和写入图像非常简单,借助 **PIL.Image 模块函数**。

语法

Image.open(fp, mode=’r’)

其中

  • **fp** - 文件名(字符串)、pathlib.Path 对象或文件对象。文件对象必须实现 read()、seek() 和 tell() 方法,并以二进制模式打开。

  • **mode** - 这是一个可选参数,如果给出,必须为“r”。

  • **返回值** - 一个 Image 对象。

  • **错误** - 如果找不到文件,或者无法打开和识别图像。

示例

以下是一个非常简单的示例,我们将打开任何格式的图像(我们使用 .**jpg**),在窗口中显示它,然后以另一种文件格式(.**png**)保存它(默认位置)。

from PIL import Image
image = Image.open('beach1.jpg')
image.show()
image.save('beach1.bmp')
image1 = Image.open('beach1.bmp')
image1.show()

在上面的示例中,我们从 PIL 库中导入 Image 模块,然后调用 **Image.open()** 函数从磁盘读取图像,该函数返回图像对象数据类型。它将通过查看文件内容自动确定文件类型。对于读取,**open()** 函数接受 **文件名(字符串)**、**路径对象** 或 **图像(文件)** 对象。

因此,通过使用 open() 函数,我们实际上是在读取图像。Image.open() 将读取图像并获取图像的所有相关信息。

输出

如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示原始图像(.jpg)和重新保存的图像(.bmp),如下所示:

实际图像

Original

重新保存的图像(.bmp)

Resaved Image

保存图像

save() 函数将图像写入文件。与读取(open() 函数)一样,save() 函数接受文件名、路径对象或已打开以进行写入的文件对象。

语法

Image.save(fp, format=None, **params)

其中,

  • **fp** - 文件名(字符串)、pathlib.Path 对象或文件对象。

  • **format** - 可选的格式覆盖。如果省略,则要使用的格式将从文件名扩展名确定。如果使用文件对象而不是文件名,则应始终使用此参数。

  • **options** - 传递给图像写入器的额外参数。

  • **返回值** - None

  • **KeyError** - 如果无法从文件名确定输出格式,请使用 format 选项来解决此问题。

  • **IOError** - 如果无法写入文件,则可能已创建文件,并且可能包含部分数据。

简而言之,上述语法将图像保存到给定的文件名下。如果未指定格式,则基于当前文件名扩展名。为了向编写器提供其他说明,我们使用关键字选项。

image.save('beach1.bmp')

在上面的示例中,它根据文件扩展名保存文件以确定图像类型,例如 - 上述操作将在我们的当前工作目录中创建一个 bmp 文件。

您还可以显式地将文件类型作为第二个参数指定 -

image.save('beach1.gif', 'GIF')

Python Pillow - 创建缩略图

有时,需要所有图像的高度和宽度都相等。实现此目的的一种方法是使用 pillow 库中的 thumbnail() 函数创建所有图像的缩略图。

此方法修改图像以包含其自身的缩略图版本,并且图像的大小不会大于给定大小。

该方法计算适当的缩略图大小以保留图像的纵横比,调用 **draft() 方法** 配置文件读取器(在适用情况下),最后调整图像大小。

语法

Image.thumbnail(size, resample=3)

其中,

  • **Size** - 所需大小

  • **Resample** - 可选重采样滤镜。它可以是以下之一:PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 或 PIL.Image.LANCZOS。如果省略,则默认为 PIL.Image.BICUBIC。

  • **Returns** - 无

示例

以下示例演示了使用 python pillow 创建缩略图 -

from PIL import Image
def tnails():
   try:
      image = Image.open('images/cat.jpg')
      image.thumbnail((90,90))
      image.save('images/thumbnail.jpg')
      image1 = Image.open('images/thumbnail.jpg')
      image1.show()
   except IOError:
      pass
tnails()

输出

如果将上述程序保存为 Example.py 并执行,它将使用默认的 PNG 显示实用程序显示创建的缩略图,如下所示 -

原始图像

original_image.jpg

输出图像

Output Image

Python Pillow - 合并图像

Pillow 包允许您将一个图像粘贴到另一个图像上。merge() 函数接受模式和图像元组作为参数,并将它们组合成单个图像。

语法

Image.merge(mode, bands)

其中,

  • **mode** - 输出图像要使用的模式。

  • **bands** - 包含输出图像中每个波段的一个单波段图像的序列。所有波段必须具有相同的大小。

  • **返回值** - Image 对象。

使用 merge() 函数,您可以合并图像的 RGB 波段,如下所示 -

from PIL import Image
image = Image.open("beach1.jpg")
r, g, b = image.split()
image.show()
image = Image.merge("RGB", (b, g, r))
image.show()

执行上述代码段后,您可以看到原始图像和合并 RGB 波段后的图像,如下所示 -

输入图像

Input Image

输出图像

Output Image1

合并两个图像

同样,要合并两个不同的图像,您需要 -

  • 使用 open() 函数为所需的图像创建图像对象。

  • 合并两个图像时,需要确保两个图像的大小相同。因此,获取两个图像的每个大小,并在需要时相应地调整其大小。

  • 使用 Image.new() 函数创建一个空图像。

  • 使用 paste() 函数粘贴图像。

  • 使用 save() 和 show() 函数保存和显示结果图像。

示例

以下示例演示了使用 python pillow 合并两个图像 -

from PIL import Image
#Read the two images
image1 = Image.open('images/elephant.jpg')
image1.show()
image2 = Image.open('images/ladakh.jpg')
image2.show()
#resize, first image
image1 = image1.resize((426, 240))
image1_size = image1.size
image2_size = image2.size
new_image = Image.new('RGB',(2*image1_size[0], image1_size[1]), (250,250,250))
new_image.paste(image1,(0,0))
new_image.paste(image2,(image1_size[0],0))
new_image.save("images/merged_image.jpg","JPEG")
new_image.show()

输出

如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示两个输入图像和合并后的图像,如下所示 -

输入图像1

Input Image1

输入图像2

Input Image2

合并后的图像

Merged Image

Python Pillow - 模糊图像

模糊图像可以通过应用滤镜来减少图像中的噪声水平来完成。图像模糊是图像处理的重要方面之一。

Pillow 库中的 **ImageFilter 类** 提供了几个标准图像滤镜。可以通过使用 ImageFilter 类中定义的所需滤镜类型调用 Image 对象的 **filter() 方法** 将图像滤镜应用于图像。

有多种技术用于模糊图像,我们将讨论以下提到的技术。

  • 简单模糊

  • 方框模糊

  • 高斯模糊

所有这三种技术都将使用“Image.filter()”方法将滤镜应用于图像。

简单模糊

它根据特定内核或卷积矩阵指定的模糊效果应用于图像。

语法

filter(ImageFilter.BLUR)

示例

#Import required Image library
from PIL import Image, ImageFilter

#Open existing image
OriImage = Image.open('images/boy.jpg')
OriImage.show()

blurImage = OriImage.filter(ImageFilter.BLUR)
blurImage.show()
#Save blurImage
blurImage.save('images/simBlurImage.jpg')

执行后,上述示例将生成两个标准 PNG 显示实用程序窗口(在本例中为 Windows **照片** 应用)。

原始图像

Original Image2

模糊图像

Blurred Image

方框模糊

在此滤镜中,我们使用“radius”作为参数。半径与模糊值成正比。

语法

ImageFilter.BoxBlur(radius)

其中,

  • **Radius** - 一个方向上的方框大小。

  • **Radius 0** - 表示没有模糊,并返回相同的图像。

  • **Radius 1** - 在每个方向上取 1 个像素,即总共 9 个像素。

示例

#Import required Image library
from PIL import Image,
 
#Open existing image
OriImage = Image.open('images/boy.jpg')
OriImage.show()

#Applying BoxBlur filter
boxImage = OriImage.filter(ImageFilter.BoxBlur(5))
boxImage.show()

#Save Boxblur image
boxImage.save('images/boxblur.jpg')

输出

执行后,上述示例将生成两个标准 PNG 显示实用程序窗口(在本例中为 Windows 照片应用)。

原始图像

Original Image3

模糊图像

Blurred Image2

高斯模糊

此滤镜也使用参数 radius 并执行与方框模糊相同的工作,但有一些算法更改。简而言之,更改 radius 值将生成不同强度的“高斯模糊”图像。

语法

ImageFilter.GaussianBlur(radius=2)

其中,

  • Radius - 模糊半径

示例

#Import required Image library
from PIL import Image, ImageFilter

#Open existing image
OriImage = Image.open('images/boy.jpg')
OriImage.show()

#Applying GaussianBlur filter
gaussImage = OriImage.filter(ImageFilter.GaussianBlur(5))
gaussImage.show()

#Save Gaussian Blur Image
gaussImage.save('images/gaussian_blur.jpg')

输出

执行后,上述示例将生成两个标准 PNG 显示实用程序窗口(在本例中为 Windows **照片** 应用)。

原始图像

Orignal Images4

模糊图像

Blurred Image3

Python Pillow - 裁剪图像

裁剪是图像处理的重要操作之一,用于去除图像中不需要的部分以及向图像添加所需的功能。它广泛用于 Web 应用程序中,用于上传图像。

Pillow 中图像类的 crop() 函数需要将要裁剪的部分作为矩形。要从图像中裁剪的矩形部分指定为一个四元素元组,并返回已裁剪的图像的矩形部分作为图像对象。

示例

以下示例演示了如何使用 python pillow 旋转图像 -

#Import required Image library
from PIL import Image

#Create an Image Object from an Image
im = Image.open('images/elephant.jpg')

#Display actual image
im.show()

#left, upper, right, lowe
#Crop
cropped = im.crop((1,2,300,300))

#Display the cropped portion
cropped.show()

#Save the cropped image
cropped.save('images/croppedBeach1.jpg')

输出

如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示原始图像和裁剪后的图像,如下所示 -

原始图像

Original Image5

裁剪后的图像

Cropped Image

Python Pillow - 翻转和旋转图像

在使用 python 图像处理库处理图像时,有时需要翻转现有图像以获得更多见解,以增强其可见性或由于您的需求。

pillow 库的 Image 模块允许我们非常轻松地翻转图像。我们将使用 Image 模块中的 transpose() 函数来翻转图像。“transpose()”支持的一些最常用的方法是 -

  • **Image.FLIP_LEFT_RIGHT** - 水平翻转图像

  • **Image.FLIP_TOP_BOTTOM** - 垂直翻转图像

  • **Image.ROTATE_90** - 通过指定度数旋转图像

示例 1:水平翻转的图像

以下 Python 示例读取图像,将其水平翻转,并使用标准 PNG 显示实用程序显示原始图像和翻转后的图像 -

# import required image module
from PIL import Image

# Open an already existing image
imageObject = Image.open("images/spiderman.jpg")

# Do a flip of left and right
hori_flippedImage = imageObject.transpose(Image.FLIP_LEFT_RIGHT)

# Show the original image
imageObject.show()

# Show the horizontal flipped image
hori_flippedImage.show()

输出

原始图像

Original Image6

翻转后的图像

Flipped Image

示例 2:垂直翻转的图像

以下 Python 示例读取图像,将其垂直翻转,并使用标准 PNG 显示实用程序显示原始图像和翻转后的图像 -

# import required image module
from PIL import Image

# Open an already existing image
imageObject = Image.open("images/spiderman.jpg")

# Do a flip of left and right
hori_flippedImage = imageObject.transpose(Image.FLIP_LEFT_RIGHT)

# Show the original image
imageObject.show()

# Show vertically flipped image
Vert_flippedImage = imageObject.transpose(Image.FLIP_TOP_BOTTOM)
Vert_flippedImage.show()

输出

原始图像

Original Image6

翻转后的图像

Flipped Image2

示例 3:将图像旋转到特定角度

以下 Python 示例读取图像,将其旋转到指定角度,并使用标准 PNG 显示实用程序显示原始图像和旋转后的图像 -

# import required image module
from PIL import Image

# Open an already existing image
imageObject = Image.open("images/spiderman.jpg")

# Do a flip of left and right
hori_flippedImage = imageObject.transpose(Image.FLIP_LEFT_RIGHT)

# Show the original image
imageObject.show()

#show 90 degree flipped image
degree_flippedImage = imageObject.transpose(Image.ROTATE_90)
degree_flippedImage.show()

输出

原始图像

Original Image6

旋转后的图像

Rotated Image2

Python Pillow - 调整图像大小

大多数数字图像都是像素的二维平面,它具有宽度和高度。pillow 库的 Image 模块具有一个属性 size。此元组包含图像的宽度和高度作为其元素。要调整图像大小,您可以通过提供宽度和高度来调用 pillow 的图像类的 resize() 方法。

调整大小并保存调整大小的图像

调整大小并保存调整大小的图像的程序如下所示 -

#Import required Image library
from PIL import Image

#Create an Image Object from an Image
im = Image.open("images/cat.jpg")

#Display actual image
im.show()

#Make the new image half the width and half the height of the original image
resized_im = im.resize((round(im.size[0]*0.5), round(im.size[1]*0.5)))

#Display the resized imaged
resized_im.show()

#Save the cropped image
resized_im.save('resizedBeach1.jpg')

输出

如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示原始图像和调整大小后的图像,如下所示 -

原始图像

Original Image

调整大小后的图像

resized_image.jpg

Python Pillow - 创建水印

您已经注意到,一些在线照片带有水印。水印绝对是保护您的图像免遭滥用的更好方法之一。此外,建议在社交媒体上分享您的创意照片之前,为其添加水印,以防止其被滥用。

水印通常是在照片上叠加的一些文本或徽标,用于识别拍摄照片的人或拥有照片版权的人。

Pillow 包允许我们向图像添加水印。要向我们的图像添加水印,我们需要 pillow 包中的 **“Image”**、**“ImageDraw”** 和 **“ImageFont”** 模块。

“ImageDraw”模块增加了在新的或现有的图像上绘制二维图形的功能。“ImageFont”模块用于加载位图、TrueType 和 OpenType 字体文件。

示例

以下 python 程序演示了如何使用 python pillow 向图像添加水印 -

#Import required Image library
from PIL import Image, ImageDraw, ImageFont

#Create an Image Object from an Image
im = Image.open('images/boy.jpg')
width, height = im.size

draw = ImageDraw.Draw(im)
text = "sample watermark"

font = ImageFont.truetype('arial.ttf', 36)
textwidth, textheight = draw.textsize(text, font)

# calculate the x,y coordinates of the text
margin = 10
x = width - textwidth - margin
y = height - textheight - margin

# draw watermark in the bottom right corner
draw.text((x, y), text, font=font)
im.show()

#Save watermarked image
im.save('images/watermark.jpg')

输出

假设,以下是在图像文件夹中找到的输入图像 **boy.jpg**。

Boy

执行上述程序后,如果观察输出文件夹,您会看到结果 watermark.jpg 文件在其上带有水印,如下所示 -

Watermark

Python Pillow - 为图像添加滤镜

**ImageFilter 模块** 包含预定义滤镜集的定义,我们将其与 Image.filter() 方法一起使用。这些滤镜用于更改图像的外观和风格。

示例

以下示例是过滤图像 -

from PIL import Image, ImageFilter

im = Image.open('jungleSaf2.jpg')

im1 = im.filter(ImageFilter.BLUR)
im1.show()

im2 = im.filter(ImageFilter.MinFilter(3))
im2.show()

im3 = im.filter(ImageFilter.MinFilter) # same as MinFilter(3)
im3.show()

在上面的程序中,我们使用了 **MinFilter()** 方法,该方法用于创建最小滤镜。它在给定大小的窗口中选择最低的像素值。

ImageFilter.MinFilter(size=3)

其中,

**size** - 内核大小(以像素为单位)。

输出

如果保存上述程序并执行,它将显示原始图像、模糊图像以及使用标准 PNG 显示实用程序应用了 MinFilter 的模糊图像,如下所示 -

原始图像

Original Images

模糊图像

Blurred Image6

使用最小滤镜模糊的图像

Image Blurred With Mini Filter

滤镜

pillow 库的当前版本提供了以下提到的预定义图像增强滤镜集。

  • BLUR

  • CONTOUR

  • DETAIL

  • EDGE_ENHANCE

  • EDGE_ENHANCE_MORE

  • EMBOSS

  • FIND_EDGES

  • SHARPEN

  • SMOOTH

  • SMOOTH_MORE

示例

以下 python 示例将模糊滤镜应用于图像,并将其保存并使用标准 PNG 显示实用程序显示 -

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow

from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)

#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(BLUR)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

Image Filter

同样,您可以将以下任何参数传递给 **image.filter()** 方法以获取相应的输出 -

  • CONTOUR

  • DETAIL

  • EDGE_ENHANCE

  • EDGE_ENHANCE_MORE

  • EMBOSS

  • FIND_EDGES

  • SMOOTH

  • SMOOTH_MORE

  • SHARPEN

Python img.filter(CONTOUR) 方法

以下 python 示例将 CONTOUR 滤镜应用于给定图像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(CONTOUR)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Original Image

过滤后的图像

Filtered Image

Python img.filter(DETAIL) 方法

以下 python 示例将 DETAIL 滤镜应用于给定图像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(DETAIL)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Original image

过滤后的图像

Filtered Image1

Python img.filter(EDGE_ENHANCE) 方法

以下 python 示例将 EDGE_ENHANCE 滤镜应用于给定图像 -

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(EDGE_ENHANCE)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Orignal Image

过滤后的图像

Filtered Image2

Python img.filter(EDGE_ENHANCE_MORE) 方法

以下 python 示例将 EDGE_ENHANCE_MORE 滤镜应用于给定图像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(EDGE_ENHANCE_MORE)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Original Image

过滤后的图像

Filtered Image3

Python img.filter(EMBOSS) 方法

以下 python 示例将 EMBOSS 滤镜应用于给定图像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(EMBOSS)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Original Image

过滤后的图像

Filtered Image4

Python img.filter(FIND_EDGES) 方法

以下 python 示例将 FIND_EDGES 滤镜应用于给定图像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(FIND_EDGES)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Original Image

过滤后的图像

Filtered Image5

Python img.filter(SMOOTH) 方法

以下 python 示例将 SMOOTH 滤镜应用于给定图像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(SMOOTH)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Original Image

过滤后的图像

Filtered Image6

Python img.filter(SHARPEN) 方法

以下 python 示例将 SHARPEN 滤镜应用于给定图像。

示例

#Import required image modules
from PIL import Image, ImageFilter

#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(SHARPEN)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Original Image

过滤后的图像

Filtered Image7

以下 python 示例将 SHARPEN 滤镜应用于给定图像。

示例

#Import required image modules
from PIL import Image, ImageFilter
#Import all the enhancement filter from pillow
from PIL.ImageFilter import (
   BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE,
   EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN
)
#Create image object
img = Image.open('images/cat.jpg')
#Applying the blur filter
img1 = img.filter(SHARPEN)
img1.save('images/ImageFilter_blur.jpg')
img1.show()

输出

如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -

原始图像

Original Image

过滤后的图像

Filtered Image8

Python Pillow - 图像上的颜色

**ImageColor 模块** 包含以不同格式排列的颜色表,它还包含从 CSS3 样式颜色说明符到 RGB 元组的转换器。

颜色名称

ImageColor 模块支持以下字符串格式 -

  • 十六进制颜色说明符,表示为 #rgb 或 #rrggbb。例如,#00ff00 表示纯绿色。

  • #00ff00 十六进制颜色,红色值为 0(0% 红色),绿色值为 255(100% 绿色),其 RGB 的蓝色值为 0(0% 蓝色)。

  • 圆柱坐标表示(也称为 HSL)的颜色 #00ff00 色相:0.33,饱和度:1.00,并且 00ff00 的亮度值为 0.50。

  • Image Color 模块提供了大约 140 种标准颜色名称,基于 X 窗口系统和大多数 Web 浏览器支持的颜色。颜色名称不区分大小写。

ImageColor.getrgb() 方法

将颜色字符串转换为 RGB 元组。如果无法解析字符串,则此函数将引发 ValueError 异常。

语法

PIL.ImageColor.getrgb(color)

其中,

  • 参数:color - 颜色字符串

  • 返回值:(red, green, blue[, alpha])

示例 1

from PIL import ImageColor

# using getrgb
img = ImageColor.getrgb("blue")
print(img)

img1 = ImageColor.getrgb("purple")
print(img1)

输出

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

示例 2

#Import required image modules
from PIL import Image,ImageColor

# Create new image & get color RGB tuple.
img = Image.new("RGB", (256, 256), ImageColor.getrgb("#add8e6"))

#Show image
img.show()

输出

ImageColor getrgb

ImageColor.getcolor() 方法

此方法与 getrgb() 相同,但是如果模式不是图形命令支持的形状绘制和文本注释颜色或调色板图像,则会将 RGB 值转换为灰度值。如果字符串无法解析,则此函数引发 ValueError 异常。

语法

PIL.ImageColor.getcolor(color, mode)

其中,

  • 参数 - 颜色字符串

  • 返回值 - (灰度级[, alpha]) 或 (红色, 绿色, 蓝色[, alpha])

示例

#Import required image modules
from PIL import Image,ImageColor

# using getrgb

img = ImageColor.getrgb("skyblue")
print(img)

img1 = ImageColor.getrgb("purple")
print(img1)

输出

(135, 206, 235)
(128, 0, 128)

Python Pillow - ImageDraw 模块

'ImageDraw' 模块为 Image 对象提供了简单的 2D 图形支持。通常,我们使用此模块来创建新图像、注释或修饰现有图像以及为 Web 使用动态生成图形。

图形命令支持绘制形状和注释文本。

  • 可以将图像理解为像素(图像元素)的二维数组。像素是支持的最小颜色点。

  • ImageDraw 使用的二维坐标系的原点位于图像的左上角

  • 我们使用的 Pillow 颜色方案是 RGB。RGB 颜色表示和支持由ImageColor模块提供。

  • 位图、OpenType 或 TrueType 是文本注释可接受的字体。

  • 大多数绘图命令可能需要一个边界框参数,该参数指定要应用命令的图像区域。

  • 一系列坐标可以表示为 [ (x0, y0), (x1, y1),…(xn, yn)]。

  • 对于某些绘图命令,我们需要角度值。

示例

以下 Python 示例在给定图像上绘制一条线 -

#Import required libraries
import sys
from PIL import Image, ImageDraw

#Create Image object
im = Image.open("images/logo.jpg")

#Draw line
draw = ImageDraw.Draw(im)
draw.line((0, 0) + im.size, fill=128)
draw.line((0, im.size[1], im.size[0], 0), fill=128)

#Show image
im.show()

输出

如果将上述程序保存为 Example.py 并执行,它将在图像上绘制一条线,并使用标准 PNG 显示实用程序显示它,如下所示 -

Utility

画布

  • ImageDraw 是 Image 的 Pillow 可绘制表面(即画布)。

  • ImageDraw.Draw(img) 返回 Image 参数 img 的可绘制画布表示。画布的背景是“img”图像。

示例

以下 Python 示例在给定图像上绘制文本 -

#Import required modules from Pillow package
from PIL import Image, ImageDraw, ImageFont

# get an image
base = Image.open('images/boy.jpg').convert('RGBA')

# make a blank image for the text, initialized to transparent text color
txt = Image.new('RGBA', base.size, (255,255,255,0))

# get a font
fnt = ImageFont.truetype('E:/PythonPillow/Fonts/Pacifico.ttf', 40)

# get a drawing context
d = ImageDraw.Draw(txt)

# draw text, half opacity
d.text((14,14), "Tutorials", font=fnt, fill=(255,255,255,128))

# draw text, full opacity
d.text((14,60), "Point", font=fnt, fill=(255,255,255,255))
out = Image.alpha_composite(base, txt)

#Show image
out.show()

输出

Canvas

使用 'ImageDraw' 模块绘制形状

ImageDraw 模块允许我们通过首先使用要处理的图像创建绘图对象,然后应用它来创建不同的形状。我们可以使用 'ImageDraw' 模块绘制的一些常见形状如下 -

线条

以下是使用 Python Pillow 绘制线条的语法 -

draw.line(xy, fill=None, width=0)

line() 方法在边界框 xy 和画布上从左上角到右下角绘制一条线。线条使用颜色填充填充。参数 fill 和 width 是可选的,其默认值分别为 None 和 0。

示例

from PIL import Image, ImageDraw

img = Image.new('RGB', (500, 300), (125, 125, 125))
draw = ImageDraw.Draw(img)
draw.line((200, 100, 300, 200), fill=(0, 0, 0), width=10)

img.show()

输出

Line

椭圆

以下是使用 Python Pillow 绘制椭圆的语法 -

draw.ellipse(xy, fill=None, outline=None)

ellipse() 方法在 draw 上绘制由边界框 xy 包围的椭圆。形状使用颜色填充填充,周长使用颜色轮廓填充。参数 fill 和 width 是可选的,其默认值为 None。

示例

from PIL import Image, ImageDraw

img = Image.new('RGB', (500, 300), (125, 125, 125))
draw = ImageDraw.Draw(img)

draw.ellipse((200, 125, 300, 200), fill=(255, 0, 0), outline=(0, 0, 0))
img.show()

输出

Ellipse

矩形

以下是使用 Python Pillow 绘制矩形的语法 -

draw.rectangle(xy, fill=None, outline=None)

rectangle() 方法在 draw 上绘制给定的边界框 xy 矩形。形状使用颜色填充填充,周长使用颜色轮廓填充。参数 fill 和 width 是可选的,其默认值为 None。

from PIL import Image, ImageDraw

img = Image.new('RGB', (500, 300), (125, 125, 125))
draw = ImageDraw.Draw(img)

draw.rectangle(
   (200, 125, 300, 200),
   fill=(255, 0, 0),
   outline=(0, 0, 0))
img.show()

输出

Rectangle

多边形

以下是使用 Python Pillow 绘制矩形的语法 -

draw.polygon(seq, fill=None, outline=None)

polygon() 方法在 draw 上绘制一个多边形,该多边形用直线连接坐标序列位置 seq。seq 中的第一个和最后一个坐标也由直线连接。形状使用颜色填充填充,周长使用颜色轮廓填充。参数 fill 和 outline 是可选的,默认值为 None。

from PIL import Image, ImageDraw

img = Image.new('RGB', (500, 300), (125, 125, 125))
draw = ImageDraw.Draw(img)

draw.polygon(
   ((200, 200), (300, 100), (250, 50)),
   fill=(255, 0, 0),
   outline=(0, 0, 0))
img.show()

输出

Polygon

Python Pillow - 图像序列

Python 图像库 (PIL) 包含一些对图像序列(动画格式)的基本支持。FLI/FLC、GIF 和一些实验性格式是受支持的序列格式。TIFF 文件也可以包含多个帧。

打开序列文件时,PIL 会自动加载序列中的第一帧。要移动到不同的帧,可以使用 seek 和 tell 方法。

from PIL import Image
img = Image.open('bird.jpg')
#Skip to the second frame
img.seek(1)
try:
   while 1:
      img.seek(img.tell() + 1)
      #do_something to img
except EOFError:
   #End of sequence
   pass

输出

raise EOFError
EOFError

如上所示,当序列结束时,您将获得 EOFError 异常。

库最新版本中的大多数驱动程序仅允许您跳转到下一帧(如上例所示),要倒回文件,您可能需要重新打开它。

一个序列迭代器类

class ImageSequence:
   def __init__(self, img):
      self.img = img
   def __getitem__(self, ix):
      try:
         if ix:
            self.img.seek(ix)
         return self.img
      except EOFError:
         raise IndexError # end of sequence
for frame in ImageSequence(img):
   # ...do something to frame...

Python Pillow - 在图像上写入文本

您可以通过传递文本的位置、文本本身和文本的颜色来在图像上写入文本。我们可以向此方法传递多个其他参数。

示例

from PIL import Image, ImageDraw

img = Image.open(beach1.jpg')
d1 = ImageDraw.Draw(img)
d1.text((28, 36), "Hello, TutorialsPoint!", fill=(255, 0, 0))
img.show()
img.save("images/image_text.jpg")

输入

Tutorials Point

输出

如果将上述程序保存为 Example.py 并执行,它将在其上添加给定的文本,并使用标准 PNG 显示实用程序显示它,如下所示 -

Tutorials Point1

选择字体

有许多方法可以选择用于在图像上写入的字体。我们可以通过将完整路径传递给函数来直接从系统加载字体,也可以使用 ImageFont 加载 TrueType 字体。

示例

from PIL import Image, ImageDraw, ImageFont

img = Image.open('images/logo.jpg')
d1 = ImageDraw.Draw(img)
myFont = ImageFont.truetype('E:/PythonPillow/Fonts/FreeMono.ttf', 40)
d1.text((0, 0), "Sample text", font=myFont, fill =(255, 0, 0))
img.show()
img.save("images/image_text.jpg")

输出

Tutorials Point2

Python Pillow - 使用 Numpy 进行机器学习

在本章中,我们使用 numpy 使用 Python 图像库 - “pillow” 存储和处理图像数据。

在继续本章之前,请以管理员模式打开命令提示符,并在其中执行以下命令以安装 numpy -

pip install numpy

注意 - 只有在安装并更新了 PIP 后,此方法才有效。

从 Numpy 数组创建图像

使用 PIL 创建 RGB 图像并将其保存为 jpg 文件。在以下示例中,我们将 -

  • 创建一个 150 x 250 像素的数组。

  • 用橙色填充数组的左侧一半。

  • 用蓝色填充数组的右侧一半。

from PIL import Image
import numpy as np

arr = np.zeros([150, 250, 3], dtype=np.uint8)

arr[:,:100] = [255, 128, 0]

arr[:,100:] = [0, 0, 255]

img = Image.fromarray(arr)

img.show()

img.save("RGB_image.jpg")

输出

Numpy Array

创建灰度图像

创建灰度图像与创建 RGB 图像略有不同。我们可以使用二维数组来创建灰度图像。

from PIL import Image
import numpy as np

arr = np.zeros([150,300], dtype=np.uint8)

#Set grey value to black or white depending on x position
   for x in range(300):
      for y in range(150):
         if (x % 16) // 8 == (y % 16)//8:
            arr[y, x] = 0
         else:
            arr[y, x] = 255
img = Image.fromarray(arr)

img.show()

img.save('greyscale.jpg')

输出

Greyscale

从图像创建 numpy 数组

您可以将 PIL 图像转换为 numpy 数组,反之亦然。下面是一个演示相同内容的小程序。

示例

#Import required libraries
from PIL import Image
from numpy import array

#Open Image & create image object
img = Image.open('beach1.jpg')

#Show actual image
img.show()

#Convert an image to numpy array
img2arr = array(img)

#Print the array
print(img2arr)

#Convert numpy array back to image
arr2im = Image.fromarray(img2arr)

#Display image
arr2im.show()

#Save the image generated from an array
arr2im.save("array2Image.jpg")

输出

如果将上述程序保存为 Example.py 并执行 -

  • 它将显示原始图像。

  • 显示从中检索到的数组。

  • 将数组转换回图像并显示它。

  • 由于我们使用了 show() 方法,因此图像将使用默认的 PNG 显示实用程序显示,如下所示。

[[[ 0 101 120]
[ 3 108 127]
[ 1 107 123]
...
...
[[ 38 59 60]
[ 37 58 59]
[ 36 57 58]
...
[ 74 65 60]
[ 59 48 42]
[ 66 53 47]]
[[ 40 61 62]
[ 38 59 60]
[ 37 58 59]
...
[ 75 66 61]
[ 72 61 55]
[ 61 48 42]]
[[ 40 61 62]
[ 34 55 56]
[ 38 59 60]
...
[ 82 73 68]
[ 72 61 55]
[ 63 52 46]]]

原始图像

Original Image

从数组构建的图像

Constructed
广告