- Python Pillow教程
- 蟒蛇Pillow - 主页
- Python Pillow - 概述
- Python Pillow - 环境设置
- Python Pillow - 使用图像模块
- Python Pillow - 处理图像
- Python Pillow - 创建缩略图
- Python Pillow - 合并图像
- Python Pillow - 模糊图像
- Python Pillow - 裁剪图像
- Python Pillow - 翻转和旋转图像
- Python Pillow - 调整图像大小
- Python Pillow - 创建水印
- Python Pillow - 向图像添加滤镜
- Python Pillow - 图像上的颜色
- Python Pillow - ImageDraw 模块
- Python Pillow - 图像序列
- Python Pillow - 在图像上写入文本
- Python Pillow - 使用 Numpy 进行机器学习
- Python Pillow 有用资源
- Python Pillow - 快速指南
- Python Pillow - 有用的资源
- Python Pillow - 讨论
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显示实用程序显示创建的缩略图,如下所示 -
原图
输出图像
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 波段的图像,如下所示 -
输入图像
输出图像
合并两个图像
以同样的方式,要合并两个不同的图像,您需要 -
使用 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
输入图像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照片应用程序)。
原图
图像模糊
框模糊
在此过滤器中,我们使用“半径”作为参数。半径与模糊值成正比。
句法
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 照片应用程序)。
原图
图像模糊
高斯模糊
该滤镜还使用参数半径,并与框模糊执行相同的工作,但进行了一些算法更改。简而言之,改变半径值,将生成不同强度的“高斯模糊”图像。
句法
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照片应用程序)。
原图
图像模糊
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显示实用程序显示原始图像和裁剪后的图像,如下所示 -
原图
裁剪图像
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()
输出
原图
翻转图像
示例 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()
输出
原始图像
翻转图像
示例 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()
输出
原始图像
旋转图像
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显示实用程序显示原始图像和调整大小的图像,如下所示 -
原始图像
调整图像大小
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 的模糊图像,如下所示 -
原始图像
图像模糊
使用迷你滤镜模糊图像
过滤器
当前版本的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 显示实用程序的过滤图像,如下所示 -
原图
过滤后的图像
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 显示实用程序的过滤图像,如下所示 -
原图
过滤后的图像
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 显示实用程序的过滤图像,如下所示 -
原图
过滤后的图像
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 显示实用程序的过滤图像,如下所示 -
原图
过滤后的图像
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 显示实用程序的过滤图像,如下所示 -
原图
过滤后的图像
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 显示实用程序的过滤图像,如下所示 -
原图
过滤后的图像
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 显示实用程序的过滤图像,如下所示 -
原图
过滤后的图像
以下 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 显示实用程序的过滤图像,如下所示 -
原图
过滤后的图像
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()
输出
图像颜色。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显示实用程序显示它,如下所示 -
选择字体
有多种方法可以选择用于在图像上书写的字体。我们可以通过将完整路径传递给函数来直接从系统加载字体,也可以使用 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")
输出
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")
输出
创建灰度图像
创建灰度图像与创建 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]]]
原始图像
从数组构建的图像