Python Pillow 简明教程
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 模块在数字图像上做几乎任何事情。除了基本图像处理功能,包括点操作、使用内置卷积核过滤图像和色彩空间转换。
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 对象上使用大小调整、裁剪、绘制或其他图像处理方法调用。
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'
Python Pillow - Working with Images
本章详细介绍了如何在 Pillow 中读取和保存图像等主题。
Reading an Image
借助 PIL.Image module function ,使用 pillow 库读、写图像非常简单。
Syntax
Image.open(fp, mode=’r’)
其中
-
fp − 一个文件名(字符串)、pathlib.Path 对象或一个文件对象。文件对象必须实现 read()、seek() 和 tell() 方法,并且以二进制模式打开。
-
mode - 这一个可选参数,如果给定,必须是“r”。
-
Return value − 一个 Image 对象。
-
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() 将读取图像并从图像中获取所有相关信息。
Saving an Image
save() 函数将图像写入文件。与阅读(open() 函数)一样,save() 函数接受一个文件名、一个路径对象或一个已打开以便写入的文件对象。
Syntax
Image.save(fp, format=None, **params)
其中,
-
fp − 一个文件名(字符串)、pathlib.Path 对象或已打开以便写入的文件对象。
-
format − 可选的格式覆盖。如果省略,将根据文件扩展名确定要使用的格式。如果使用文件对象而不是文件名,则始终应使用此参数。
-
options − 对图像写入器使用的额外参数。
-
Return value − None
-
KeyError − 如果无法从文件名确定输出格式,请使用格式选项解决此问题。
-
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)
其中,
-
Size − Required size
-
Resample - 可选的重新采样过滤器。它可以是 PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 或 PIL.Image.LANCZOS 中的一个。如果省略,则默认为 PIL.Image.BICUBIC。
-
Returns − None
Python Pillow - Merging Images
Pillow 包允许你将一张图像粘贴到另一张图像上。merge() 函数接受一个模式和一个图像元组作为参数,并将它们合并到一个图像中。
Syntax
Image.merge(mode, bands)
其中,
-
mode − 用于输出图像的模式。
-
*bands * − 一个序列,包含输出图像的每个频带的一个单频带图像。所有频带必须具有相同的尺寸。
-
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 频带合并后的图像,如下所示 −
Merging two images
同样,要合并两张不同的图像,您需要 −
-
使用 open() 函数为所需的图像创建图像对象。
-
在合并两张图像时,您需要确保两张图像的大小相同。因此,获取两张图像的每个尺寸,并在需要时相应调整图像大小。
-
使用 Image.new() 函数创建一张空图像。
-
使用 paste() 函数粘贴图像。
-
利用 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()
Python Pillow - Blur an Image
模糊图像可通过应用滤镜到图像来降低图像的噪点级别来完成。图像模糊处理是图像处理的一个重要方面。
Pillow 库中的 ImageFilter class 提供了几种标准图像滤镜。图像滤镜可通过使用图像对象的 filter() method 并根据 ImageFilter 类中定义的要求的滤镜类型调用该函数来应用于一张图像。
用于模糊图像的有各种技术,而且我们将讨论下面提到的技术。
-
Simple blur
-
Box blur
-
Gaussian blur
所有这三种技术都将使用“Image.filter()”方法将滤镜应用于图像。
Simple 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
Blurred image
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')
Gaussian Blur
此滤镜也使用半径参数并执行与框模糊一样的工作,但进行了一些算法上的更改。简而言之,更改半径值将生成不同强度的“Gaussianblur”图像。
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')
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')
Python Pillow - Flip and Rotate Images
使用 python 图像处理库处理图像时,有时您需要翻转现有图像以从中获取更多见解,以提高其可见性或根据您的要求。
枕头库的图像模块允许我们非常轻松地翻转图像。我们将使用图像模块中的 transpose(方法)函数来翻转图像。一些最常用的‘transpose()’支持的方法有 −
-
Image.FLIP_LEFT_RIGHT − 用于水平翻转图像
-
Image.FLIP_TOP_BOTTOM − 用于垂直翻转图像
-
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()
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()
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()
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')
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')
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
Blurred Image
Image blurred with mini filter
Filters
当前版本的 pillow 库提供了以下提到的预定义图像增强滤镜。
-
BLUR
-
CONTOUR
-
DETAIL
-
EDGE_ENHANCE
-
EDGE_ENHANCE_MORE
-
EMBOSS
-
FIND_EDGES
-
SHARPEN
-
SMOOTH
-
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()
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()
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()
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()
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()
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()
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()
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()
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
Filtered image
以下 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()
Python Pillow - Colors on an Image
ImageColor 模块包含用表格排列的采用不同格式的颜色,它还包含从 CSS3 式颜色说明符到 RGB 元组的转换器。
Color Names
ImageColor 模块支持以下字符串格式 −
-
十六进制颜色说明符,表示为 #rgb 或 #rrggbb。例如,#00ff00 表示纯绿色。
-
#00ff00 十六进制颜色,红色值为 0(0% 红色),绿色值为 255(100% 绿色),蓝色值为 0(0% 蓝色)。
-
圆柱 – #00ff00 颜色的坐标表示(也称为 HSL),色相:0.33,饱和度:1.00,亮度值:0.50。
-
Image Color 模块提供约 140 个标准颜色名称,基于 X 窗口系统和大多数 Web 浏览器支持的颜色。颜色名称不区分大小写。
ImageColor.getrgb() Method
将一个颜色字符串转换为一个 RGB 元组。如果无法分析该字符串,这个函数将引发 ValueError 异常。
Example 1
from PIL import ImageColor
# using getrgb
img = ImageColor.getrgb("blue")
print(img)
img1 = ImageColor.getrgb("purple")
print(img1)
ImageColor. getcolor() Method
此方法与 getrgb() 相同,然而,它将 RGB 值转换为灰度值(如果模式不是图形命令支持形状绘制和文本注释颜色或一个调色板图像)。如果无法分析该字符串,这个函数将引发 ValueError 异常。
Python Pillow - ImageDraw Module
‘ImageDraw’ 模块为 Image Object 提供简单的 2D 图形支持。通常,我们使用这个模块创建新图像、注释或润色现有图像以及为 Web 使用动态生成图形。
图像命令支持绘制形状标注。
-
图像可以被认为是一个二维像素数组(图像元素)。像素是支持的最小颜色点。
-
ImageDraw 使用的二维坐标系原点位于图像的 upper left corner 。
-
我们使用的 pillow 颜色方案是 RGB。RGB 颜色表示和支持由模块 ImageColor 提供。
-
位图、OpenType 或 TrueType 是文本标注可接受的字体。
-
大多数绘制命令可能需要一个边界包围框参数,它指定要向其应用命令的图像区域。
-
坐标序列可以表示为 [(x0, y0), (x1, y1),…(xn, yn)]。
-
对于某些绘制命令,我们需要角度值。
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()
Canvas
-
ImageDraw 是 Image 的 Pillow 可绘制曲面(即画布)。
-
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()
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()
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()
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()
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()
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
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")
Selecting the font
可以通过多种方式选择用于在图像上书写的字体。我们可以通过将完整路径传递给函数直接从系统加载字体,或者我们可以使用 ImageFont 加载 TrueType 字体。
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 文件。在以下示例中,我们将:
-
创建一个 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")
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')
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 并执行,
-
显示原始图像。
-
显示从其中检索到的数组。
-
将数组转换回图像并显示。
-
由于我们使用了 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
Image constructed from the array