Python Pillow 简明教程

Python Pillow - Quick Guide

Python Pillow - Overview

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

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

Pillow 建立在 PIL(Python 图像库)之上。PIL 是 Python 中用于图像处理的重要模块之一。不过,PIL 模块自 2011 年起不再受支持,并且不支持 python 3。

Pillow 模块提供了更多功能,可在所有主要的操作系统上运行,并支持 python 3。它支持各种图像,比如“jpeg”、“png”、“bmp”、“gif”、“ppm”、“tiff”。你可以使用 pillow 模块在数字图像上做几乎任何事情。除了基本图像处理功能,包括点操作、使用内置卷积核过滤图像和色彩空间转换。

Image Archives

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

Image Display

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

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

Image Processing

Pillow 库包含了所有基本的图像处理功能。你可以调整图像大小、执行旋转和转换。

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

Python Pillow - Environment Setup

本章讨论了如何在计算机中安装枕头包。

安装枕头包非常容易,特别是如果你使用 pip 安装的话。

Installing Pillow using pip

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

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

如果你的计算机已经安装了 pip 和 pillow,则以上命令只会简单地提到“ requirement already satisfied ”,如下所示 −

requirement

Python Pillow - Using Image Module

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

Opening, rotating and displaying an image

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

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

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

Example

以下示例演示了如何使用 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()

Output

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

Actual image

original

Rotated image (45 degrees)

rotated image

Attributes of Image Module

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

Output above − None

Python Pillow - Working with Images

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

Reading an Image

借助 PIL.Image module function ,使用 pillow 库读、写图像非常简单。

Syntax

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

其中

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

  2. mode - 这一个可选参数,如果给定,必须是“r”。

  3. Return value − 一个 Image 对象。

  4. Error − 如果找不到文件,或者无法打开和识别图像。

Example

下面是一个非常简单的例子,我们将打开一个任意格式的图片(我们使用了 . 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() 函数从磁盘读取图像,该函数返回一个 image 对象数据类型。它将通过查看文件内容自动确定文件的类型。对于读取来说, open() 函数接受一个 filename(string) 、一个 path object 或一个 image(file) 对象。

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

Output

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

Actual image

original

Resaved image (.bmp)

resaved image

Saving an Image

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

Syntax

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

其中,

  1. fp − 一个文件名(字符串)、pathlib.Path 对象或已打开以便写入的文件对象。

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

  3. options − 对图像写入器使用的额外参数。

  4. Return value − None

  5. KeyError − 如果无法从文件名确定输出格式,请使用格式选项解决此问题。

  6. IOError − 如果无法写文件,可能已经创建了文件,并可能包含部分数据。

简而言之,上述语法将在给定的文件名下保存图像。如果没有指定格式,则它将基于当前文件名扩展名。为了给编写器提供额外的指令,我们使用关键词选项。

image.save('beach1.bmp')

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

您也可以明确地指定文件类型作为第二个参数 −

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

Python Pillow - Creating Thumbnails

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

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

此方法计算适当的缩略图大小以保留图像的长宽比,调用 draft () method 以配置文件读取器(如果适用),最后调整图像大小。

Syntax

Image.thumbnail(size, resample=3)

其中,

  1. Size − Required size

  2. Resample - 可选的重新采样过滤器。它可以是 PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 或 PIL.Image.LANCZOS 中的一个。如果省略,则默认为 PIL.Image.BICUBIC。

  3. Returns − None

Example

以下示例演示如何使用 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()

Output

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

Original image

original image

Output image

output image

Python Pillow - Merging Images

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

Syntax

Image.merge(mode, bands)

其中,

  1. mode − 用于输出图像的模式。

  2. *bands * − 一个序列,包含输出图像的每个频带的一个单频带图像。所有频带必须具有相同的尺寸。

  3. Return value − 一个 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

input image

Output image

output image1

Merging two images

同样,要合并两张不同的图像,您需要 −

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

  2. 在合并两张图像时,您需要确保两张图像的大小相同。因此,获取两张图像的每个尺寸,并在需要时相应调整图像大小。

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

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

  5. 利用 save() 和 show() 函数保存并显示结果图像。

Example

以下示例演示了使用 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()

Output

如果将以上程序另存为 Example.py 并执行,则将使用标准 PNG 显示实用工具显示两张输入图像和合并后的图像,如下所示:

Input image1

input image1

Input image2

input image2

Merged image

merged image

Python Pillow - Blur an Image

模糊图像可通过应用滤镜到图像来降低图像的噪点级别来完成。图像模糊处理是图像处理的一个重要方面。

Pillow 库中的 ImageFilter class 提供了几种标准图像滤镜。图像滤镜可通过使用图像对象的 filter() method 并根据 ImageFilter 类中定义的要求的滤镜类型调用该函数来应用于一张图像。

用于模糊图像的有各种技术,而且我们将讨论下面提到的技术。

  1. Simple blur

  2. Box blur

  3. Gaussian blur

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

Simple blur

它对图像应用模糊效果,如通过特定的内核或卷积矩阵所指定的那样。

Syntax

filter(ImageFilter.BLUR)

Example

#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 Photos 应用)。

Original image

original image2

Blurred image

blurred image

Box blur

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

Syntax

ImageFilter.BoxBlur(radius)

其中,

  1. Radius − 在一个方向上框的大小。

  2. Radius 0 − 表示不进行模糊处理,并返回同一张图像。

  3. *Radius 1 * - 从每个方向取一个像素,总共 9 个像素。

Example

#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')

Output

在执行时,以上示例将生成两个标准 PNG 显示实用工具窗口(在本例中为 Windows 照片应用)。

Original image

original image3

Blurred image

blurred image2

Gaussian Blur

此滤镜也使用半径参数并执行与框模糊一样的工作,但进行了一些算法上的更改。简而言之,更改半径值将生成不同强度的“Gaussianblur”图像。

Syntax

ImageFilter.GaussianBlur(radius=2)

其中,

  1. Radius – Blur radius

Example

#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')

Output

在执行时,以上示例将生成两个标准 PNG 显示实用工具窗口(在本例中为 Windows Photos 应用)。

Original image

original image4

Blurred image

blurred image3

Python Pillow - Cropping an Image

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

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

Example

以下示例演示了如何使用 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')

Output

如果您将上述程序另存为 Example.py 并执行它,它会使用以下方式显示原始和裁剪的图像 −

Original image

original image5

Cropped image

cropped image

Python Pillow - Flip and Rotate Images

使用 python 图像处理库处理图像时,有时您需要翻转现有图像以从中获取更多见解,以提高其可见性或根据您的要求。

枕头库的图像模块允许我们非常轻松地翻转图像。我们将使用图像模块中的 transpose(方法)函数来翻转图像。一些最常用的‘transpose()’支持的方法有 −

  1. Image.FLIP_LEFT_RIGHT − 用于水平翻转图像

  2. Image.FLIP_TOP_BOTTOM − 用于垂直翻转图像

  3. Image.ROTATE_90 − 通过指定角度旋转图像

Example 1: Horizontally flipped Image

以下 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()

Output

Original image

original image6

Flipped image

flipped image

Example 2: Vertically Flipped Image

以下 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()

Output

Original Image

original image6

Flipped Image

flipped image2

Example 3: Rotate Image to a specific degree

以下 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()

Output

Original Image

original image6

Rotated Image

rotated image2

Python Pillow - Resizing an Image

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

Resize and save the resized image

用于调整图像大小并保存调整大小的图像的程序如下 −

#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')

Output

如果您将上述程序另存为 Example.py 并执行它,它会使用以下方式显示原始和调整大小的图像 −

Original Image

original image

Resized Image

resized image

Python Pillow - Creating a Watermark

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

水印通常是一些文本或标识,会叠加在照片上,以识别谁拍摄了照片或谁拥有照片的权利。

Pillow 程序包允许我们向图像添加水印。若要向图像添加水印,我们需要来自 Pillow 程序包的 “Image”“ImageDraw”“ImageFont” 模块。

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

Example

下面的 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')

Output

假设下面位于 image 文件夹中的输入图像 boy.jpg

boy

执行上述程序后,如果您观察输出文件夹,可以看到其上带有水印的最终 watermark.jpg 文件,如下所示 −

watermark

Python Pillow - Adding Filters to an Image

ImageFilter module 包含对一组预定义的滤镜的定义,我们将其与 Image.filter() 方法配合使用。这些滤镜用于改变图像的外观和感觉。

Example

以下示例是对图像进行滤镜处理 −

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 - 内核大小,以像素为单位。

Output

如果您保存上述程序并执行,它将显示原始图像、模糊图像以及使用标准 PNG 显示实用工具创建的带有最小滤镜的模糊图像,如下所示 −

Original Image

original image

Blurred Image

blurred image6

Image blurred with mini filter

image blurred with mini filter

Filters

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

  1. BLUR

  2. CONTOUR

  3. DETAIL

  4. EDGE_ENHANCE

  5. EDGE_ENHANCE_MORE

  6. EMBOSS

  7. FIND_EDGES

  8. SHARPEN

  9. SMOOTH

  10. SMOOTH_MORE

Example

以下 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()

Output

image filter

同样地,您可以向 image.filter() 方法传递以下任何参数,以获取相应输出 −

  1. CONTOUR

  2. DETAIL

  3. EDGE_ENHANCE

  4. EDGE_ENHANCE_MORE

  5. EMBOSS

  6. FIND_EDGES

  7. SMOOTH

  8. SMOOTH_MORE

  9. SHARPEN

Python img.filter(CONTOUR) method

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

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image

Python img.filter(DETAIL) method

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

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image1

Python img.filter(EDGE_ENHANCE) method

以下 Python示例将 EDGE_ENHANCE 滤镜应用于给定图像 −

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image2

Python img.filter(EDGE_ENHANCE_MORE) method

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

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image3

Python img.filter(EMBOSS) method

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

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image4

Python img.filter(FIND_EDGES) method

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

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image5

Python img.filter(SMOOTH) method

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

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image6

Python img.filter(SHARPEN) method

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

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image7

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

Example

#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()

Output

如果您保存上述程序并执行,它将显示原始图像和使用标准 PNG 显示实用工具的经过滤镜处理的图像,如下所示 −

Original image

original image

Filtered image

filtered image8

Python Pillow - Colors on an Image

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

Color Names

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

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

  2. #00ff00 十六进制颜色,红色值为 0(0% 红色),绿色值为 255(100% 绿色),蓝色值为 0(0% 蓝色)。

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

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

ImageColor.getrgb() Method

将一个颜色字符串转换为一个 RGB 元组。如果无法分析该字符串,这个函数将引发 ValueError 异常。

Syntax

PIL.ImageColor.getrgb(color)

其中,

  1. 参数:颜色 – 一个颜色字符串

  2. 返回值: (红色,绿色,蓝色,[透明度])

Example 1

from PIL import ImageColor

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

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

Output

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

Example 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()

Output

imagecolor getrgb

ImageColor. getcolor() Method

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

Syntax

PIL.ImageColor.getcolor(color, mode)

其中,

  1. 参数 – 一个颜色字符串

  2. 返回值 – (灰度,[透明度]) 或 (红色,绿色,蓝色,[透明度])

Example

#Import required image modules
from PIL import Image,ImageColor

# using getrgb

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

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

Output

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

Python Pillow - ImageDraw Module

‘ImageDraw’ 模块为 Image Object 提供简单的 2D 图形支持。通常,我们使用这个模块创建新图像、注释或润色现有图像以及为 Web 使用动态生成图形。

图像命令支持绘制形状标注。

  1. 图像可以被认为是一个二维像素数组(图像元素)。像素是支持的最小颜色点。

  2. ImageDraw 使用的二维坐标系原点位于图像的 upper left corner

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

  4. 位图、OpenType 或 TrueType 是文本标注可接受的字体。

  5. 大多数绘制命令可能需要一个边界包围框参数,它指定要向其应用命令的图像区域。

  6. 坐标序列可以表示为 [(x0, y0), (x1, y1),…(xn, yn)]。

  7. 对于某些绘制命令,我们需要角度值。

Example

以下 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()

Output

如果您将上述程序保存为 Example.py 并执行,它会绘制一条线穿过图像并使用标准 PNG 显示工具将其显示出来,如下所示 −

utility

Canvas

  1. ImageDraw 是 Image 的 Pillow 可绘制曲面(即画布)。

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

Example

以下 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()

Output

canvas

Drawing Shapes using ‘ImageDraw’ module

ImageDraw 模块允许我们创建不同的形状,方法是首先使用您想要处理的图像创建一个绘制对象,然后应用它。我们可以使用‘ImageDraw’模块绘制的一些常见形状如下-

Line

以下是使用 python pillow 绘制线条的语法-

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

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

Example

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()

Output

line

Eclipse

以下是使用 python pillow 绘制椭圆的语法-

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

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

Example

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()

Output

ellipse

Rectangle

以下是使用 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()

Output

rectangle

Polygon

以下是使用 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()

Output

polygon

Python Pillow - Image Sequences

Python Imaging Library (PIL) 包含一些 Image 序列(动画格式)的基本支持。支持的序列格式包括 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

Output

raise EOFError
EOFError

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

库中的大多数驱动程序在最新版本中只允许你查找下一个帧(如上述示例中所示),要快退文件,可能需要重新打开它。

A sequence iterator class

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 - Writing Text on Image

可以通过传递文本位置、文本本身以及文本颜色来在图像上书写文本。我们可以将多个其他参数传递给此方法。

Example

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")

Input

tutorials point

Output

如果你将上述程序保存为 Example.py 并执行,它会添加给定的文本并使用标准的 PNG 显示实用工具显示该文本,如下所示:

tutorials point1

Selecting the font

可以通过多种方式选择用于在图像上书写的字体。我们可以通过将完整路径传递给函数直接从系统加载字体,或者我们可以使用 ImageFont 加载 TrueType 字体。

Example

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")

Output

tutorials point2

Python Pillow - M L with Numpy

在本章中,我们使用 numpy 存储和处理图像数据,使用 python imaging library – “pillow”。

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

pip install numpy

Note - 这仅在你已经安装并更新 PIP 时有效。

Creating image from Numpy Array

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

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

  2. 用橙色填充该数组的左半部分。

  3. 用蓝色填充该数组的右半部分。

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")

Output

numpy array

Creating greyscale images

创建灰度图像与创建 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')

Output

greyscale

Creating numpy array from an Image

你可以将 PIL 图像转换为 numpy 数组,反之亦然。下面是一个展示该功能的小程序:

Example

#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")

Output

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

  1. 显示原始图像。

  2. 显示从其中检索到的数组。

  3. 将数组转换回图像并显示。

  4. 由于我们使用了 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

original image

Image constructed from the array

constructed