Python Pillow - 快速指南


Python Pillow - 概述

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

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

Pillow 构建在 PIL(Python 图像库)之上。PIL是Python中图像处理的重要模块之一。但是,自 2011 年以来,PIL 模块不再受支持,并且不支持 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 安装 pip
python -m pip 安装Pillow

如果您的计算机中已经安装了 pip 和pillow,则上述命令将简单地提及“要求已满足”,如下所示 -

要求

Python Pillow - 使用图像模块

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

打开、旋转和显示图像

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

我们将不调用 Pillow 模块,而是调用 PIL 模块,以使其向后兼容名为 Python Imaging Library (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显示实用程序显示原始图像和旋转图像,如下所示 -

实际图像

原来的

旋转图像(45 度)

旋转图像

图像模块属性

Image 类的实例具有一些属性。让我们尝试通过例子来理解其中的一些 -

图片.文件名

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

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

图像格式

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

>>> image = Image.open('beach1.jpg')
>>>
>>> 图像.格式
'JPEG'

图像模式

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

>>> image.mode
'RGB'

图片大小

它返回由图像的高度和重量组成的元组。

>>> image.size
(1280, 721)

图片宽度

它仅返回图像的宽度。

>>> image.width
1280

图像高度

它仅返回图像的高度。

>>> image.height
721

图片信息

它返回一个保存与图像关联的数据的字典。

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

上面的输出- 无

Python Pillow - 处理图像

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

读取图像

使用pillow库读写图像非常简单,借助PIL.Image模块函数

句法

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

在哪里

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

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

  • 返回值- 图像对象。

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

例子

以下是一个非常简单的示例,我们将打开任何格式的图像(我们使用 .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)图像,如下所示 -

实际图像

原来的

重新保存的图像 (.bmp)

重新保存的图像

保存图像

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

句法

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

在哪里,

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

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

  • options - 图像编写器的额外参数。

  • 返回值- 无

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

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

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

image.save('beach1.bmp')

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

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

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

Python Pillow - 创建缩略图

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

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

该方法计算适当的缩略图大小以保留图像的外观,调用草稿()方法来配置文件读取器(如果适用),最后调整图像的大小。

句法

Image.thumbnail(size, resample=3)

在哪里,

  • 尺寸- 所需尺寸

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

  • 返回- 无

例子

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

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显示实用程序显示创建的缩略图,如下所示 -

原图

原始图像.jpg

输出图像

输出图像

Python Pillow - 合并图像

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

句法

Image.merge(mode, bands)

在哪里,

  • mode - 用于输出图像的模式。

  • band - 输出图像中每个波段包含一个单波段图像的序列。所有带必须具有相同的尺寸。

  • 返回值- 图像对象。

使用 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 波段的图像,如下所示 -

输入图像

输入图像

输出图像

输出图像1

合并两个图像

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

  • 使用 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

输入图像1

输入图像2

输入图像2

合并图像

合并图像

Python Pillow - 模糊图像

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

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

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

  • 简单模糊

  • 框模糊

  • 高斯模糊

所有这三种技术都将使用“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照片应用程序)。

原图

原图2

图像模糊

图像模糊

框模糊

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

句法

ImageFilter.BoxBlur(radius)

在哪里,

  • 半径- 盒子在一个方向上的大小。

  • 半径 0 - 表示没有模糊并返回相同的图像。

  • R半径 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 照片应用程序)。

原图

原图3

图像模糊

模糊图像2

高斯模糊

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

句法

ImageFilter.GaussianBlur(radius=2)

在哪里,

  • 半径 – 模糊半径

例子

#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照片应用程序)。

原图

原始图像4

图像模糊

模糊图像3

Python Pillow - 裁剪图像

裁剪是图像处理的重要操作之一,用于删除图像中不需要的部分以及向图像添加所需的特征。它在网络应用程序中广泛使用,用于上传图像。

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显示实用程序显示原始图像和裁剪后的图像,如下所示 -

原图

原图5

裁剪图像

裁剪图像

Python Pillow - 翻转和旋转图像

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

Pillow库的图像模块使我们可以非常轻松地翻转图像。我们将使用图像模块中的转置(方法)函数来翻转图像。“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()

输出

原图

原图6

翻转图像

翻转图像

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

输出

原始图像

原图6

翻转图像

翻转图像2

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

输出

原始图像

原图6

旋转图像

旋转图像2

Python Pillow - 调整图像大小

大多数数字图像是像素的二维平面,并且具有宽度和高度。Pillow库中的图像模块具有尺寸属性。该元组由图像的宽度和高度作为其元素组成。要调整图像大小,您可以通过指定宽度和高度来调用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显示实用程序显示原始图像和调整大小的图像,如下所示 -

原始图像

原始图像

调整图像大小

调整大小的图像.jpg

Python Pillow - 创建水印

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

水印通常是覆盖在照片上的一些文本或徽标,用于标识照片的拍摄者或照片的所有者。

Pillow包允许我们为您的图像添加水印。为了向图像添加水印,我们需要Pillow 包中的“Image”“ImageDraw”“ImageFont”模块。

“ImageDraw”模块添加了在新图像或现有图像上绘制 2D 图形的功能。“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')

输出

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

男生

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

水印

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 的模糊图像,如下所示 -

原始图像

原始图像

图像模糊

模糊的图像6

使用迷你滤镜模糊图像

使用迷你滤镜模糊图像

过滤器

当前版本的Pillow库提供了下面提到的一组预定义图像增强过滤器。

  • 模糊

  • 轮廓

  • 细节

  • 边缘_增强

  • EDGE_ENHANCE_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()方法传递以下任何参数来获取相应的输出 -

  • 轮廓

  • 细节

  • 边缘_增强

  • EDGE_ENHANCE_MORE

  • 浮雕

  • 寻找边缘

  • 光滑的

  • 平滑_更多

  • 锐化

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 显示实用程序的过滤图像,如下所示 -

原图

原始图像

过滤后的图像

过滤图像

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 显示实用程序的过滤图像,如下所示 -

原图

原图

过滤后的图像

过滤后的图像1

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 显示实用程序的过滤图像,如下所示 -

原图

原始图像

过滤后的图像

过滤后的图像2

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 显示实用程序的过滤图像,如下所示 -

原图

原始图像

过滤后的图像

过滤后的图像3

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 显示实用程序的过滤图像,如下所示 -

原图

原始图像

过滤后的图像

过滤后的图像4

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 显示实用程序的过滤图像,如下所示 -

原图

原始图像

过滤后的图像

过滤后的图像5

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 显示实用程序的过滤图像,如下所示 -

原图

原始图像

过滤后的图像

过滤后的图像6

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 显示实用程序的过滤图像,如下所示 -

原图

原始图像

过滤后的图像

过滤后的图像7

以下 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 显示实用程序的过滤图像,如下所示 -

原图

原始图像

过滤后的图像

过滤后的图像8

Python Pillow - 图像上的颜色

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

颜色名称

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

  • 十六进制颜色说明符,以#rgb 或#rrggbb 形式给出。例如#00ff00代表纯绿色。

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

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

  • 图像颜色模块根据 X Window 系统和大多数 Web 浏览器支持的颜色提供大约 140 种标准颜色名称。颜色名称不区分大小写。

ImageColor.getrgb()方法

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

句法

PIL.ImageColor.getrgb(color)

在哪里,

  • 参数: color – 颜色字符串

  • 返回值:(红,绿,蓝[,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()

输出

图像颜色 getrgb

图像颜色。getcolor() 方法

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

句法

PIL.ImageColor.getcolor(color, mode)

在哪里,

  • 参数 - 颜色字符串

  • 返回值 - (graylevel[, alpha]) 或 (red, green, blue[, 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”模块为图像对象提供简单的 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显示实用程序显示它,如下所示 -

公用事业

帆布

  • ImageDraw 是图像的 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()

输出

帆布

使用“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()

输出

线

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

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

ellipse ()方法在绘制时绘制由边界框 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()

输出

椭圆

长方形

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

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

矩形()方法在绘制时绘制给定边界框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()

输出

长方形

多边形

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

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

Polygon ()方法绘制一个多边形,用直线连接绘图上的坐标序列位置 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()

输出

多边形

Python Pillow - 图像序列

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

打开序列文件,PIL 会自动加载序列中的第一帧。要在不同帧之间移动,可以使用查找和告诉方法。

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

输入

教程点

输出

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

教程要点1

选择字体

有多种方法可以选择用于在图像上书写的字体。我们可以通过将完整路径传递给函数来直接从系统加载字体,也可以使用 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")

输出

教程要点2

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 数组

创建灰度图像

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

输出

灰度

从图像创建 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]]]

原始图像

原始图像

从数组构建的图像

建