- 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 - 在图像上写入文本
- Python Pillow - ImageDraw 模块
- Python Pillow - 连接两张图像
- Python Pillow - 创建缩略图
- Python Pillow - 创建水印
- Python Pillow - 图像序列
- Python Pillow 颜色转换
- Python Pillow - 图像上的颜色
- Python Pillow - 使用颜色创建图像
- Python Pillow - 将颜色字符串转换为 RGB 颜色值
- Python Pillow - 将颜色字符串转换为灰度值
- Python Pillow - 通过更改像素值来更改颜色
- 图像处理
- Python Pillow - 降噪
- Python Pillow - 更改图像模式
- Python Pillow - 图像合成
- Python Pillow - 使用 Alpha 通道
- 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 - 提取图像元数据
- Python Pillow - 识别颜色
- 高级主题
- Python Pillow - 创建动画 GIF
- Python Pillow - 批量处理图像
- Python Pillow - 转换图像文件格式
- Python Pillow - 为图像添加填充
- Python Pillow - 颜色反转
- Python Pillow - 使用 Numpy 进行机器学习
- Python Pillow 与 Tkinter BitmapImage 和 PhotoImage 对象
- Image 模块
- Python Pillow - 图像混合
- Python Pillow 有用资源
- Python Pillow - 快速指南
- Python Pillow - 函数参考
- Python Pillow - 有用资源
- Python Pillow - 讨论
Python Pillow - 快速指南
Python Pillow - 概述
在当今的数字世界中,我们遇到了大量的数字图像。如果我们使用 Python 编程语言,它提供了许多图像处理库来为数字图像添加图像处理功能。
一些最常见的图像处理库有:OpenCV、Python 图像库 (PIL)、Scikit-image、Pillow。但是,在本教程中,我们只关注 **Pillow 模块**,并尝试探索该模块的各种功能。
Pillow 建立在 PIL (Python Image Library) 之上。PIL 是 Python 中图像处理的重要模块之一。但是,PIL 模块自 2011 年以来一直不受支持,并且不支持 Python 3。
Pillow 模块提供了更多功能,可以在所有主要操作系统上运行,并支持 Python 3。它支持各种各样的图像,例如“jpeg”、“png”、“bmp”、“gif”、“ppm”、“tiff”。您可以使用 Pillow 模块对数字图像执行几乎所有操作。除了基本图像处理功能外,还包括点运算、使用内置卷积核滤波图像以及颜色空间转换。
图像档案
Python 图像库最适合图像归档和批量处理应用程序。Python Pillow 包可用于创建缩略图、从一种格式转换为另一种格式以及打印图像等。
图像显示
您可以使用 Tk PhotoImage、BitmapImage 和 Windows DIB 接口显示图像,这些接口可与 PythonWin 和其他基于 Windows 的工具包以及许多其他图形用户界面 (GUI) 工具包一起使用。
出于调试目的,有一个 show() 方法将图像保存到磁盘,该方法调用外部显示实用程序。
图像处理
Pillow 库包含所有基本图像处理功能。您可以进行图像调整大小、旋转和变换。
Pillow 模块允许您使用直方图方法从图像中提取一些统计数据,这些数据稍后可用于统计分析和自动对比度增强。
Python Pillow - 环境设置
本章讨论如何在您的计算机上安装 Pillow 包。
安装 Pillow 包非常容易,尤其是在使用 pip 安装时。
使用 pip 安装 Pillow
要使用 pip 安装 Pillow,只需在命令提示符中运行以下命令:
python -m pip install pip python -m pip install pillow
如果您的计算机上已经安装了 pip 和 Pillow,则上述命令将简单地显示“需求已满足”,如下所示:
Python Pillow - 使用 Image 模块
要显示图像,Pillow 库在其内部使用图像类。Pillow 包中的 Image 模块包含一些重要的内置函数,例如加载图像或创建新图像等。
打开、旋转和显示图像
要加载图像,我们只需从 Pillow 中导入 Image 模块并调用 **Image.open()**,传入图像文件名。
为了使其与旧模块 Python Imaging Library (PIL) 向后兼容,我们不调用 Pillow 模块,而是调用 PIL 模块。这就是为什么我们的代码以 **“from PIL import Image”** 而不是 **“from Pillow import Image”** 开头。
接下来,我们将通过调用 **Image.open() 函数** 来加载图像,该函数返回 Image 对象数据类型的返回值。我们可以对图像对象进行的任何修改都可以使用 **save()** 方法保存到图像文件中。我们使用 **Image.open()** 获取的图像对象稍后可用于调整大小、裁剪、绘制或在此 Image 对象上调用其他图像处理方法。
示例
以下示例演示了如何使用 Python Pillow 旋转图像:
from PIL import Image #Open image using Image module im = Image.open("images/cuba.jpg") #Show actual Image im.show() #Show rotated Image im = im.rotate(45) im.show()
输出
如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示原始图像和旋转后的图像,如下所示:
实际图像
旋转后的图像(45 度)
Image 模块的属性
Image 类的实例具有一些属性。让我们尝试通过示例了解其中的一些:
Image.filename
此函数用于获取图像的文件名或路径。
>>>image = Image.open('beach1.jpg') >>> image.filename 'beach1.jpg'
Image.format
此函数返回图像文件的格式,例如“JPEG”、“BMP”、“PNG”等。
>>> image = Image.open('beach1.jpg') >>> >>> image.format 'JPEG'
Image.mode
它用于获取图像使用的像素格式。典型值是“1”、“L”、“RGB”或“CMYK”。
>>> image.mode 'RGB'
Image.size
它返回包含图像高度和宽度的元组。
>>> image.size (1280, 721)
Image.width
它仅返回图像的宽度。
>>> image.width 1280
Image.height
它仅返回图像的高度。
>>> image.height 721
Image.info
它返回一个字典,其中包含与图像相关联的数据。
>>> image.info {'jfif': 257, 'jfif_version': (1, 1), 'dpi': (300, 300), 'jfif_unit': 1, 'jfif_density': (300, 300), 'exif': b"Exif\x00\x00MM\x00*\x00\x00\x00 .... .... \xeb\x00\x00'\x10\x00\x00\xd7\xb3\x00\x00\x03\xe8"}
Image.palette
如果存在,它返回颜色调色板表。
>>> image.palette
**以上输出** - None
Python Pillow - 处理图像
本章详细阐述了如何在 Pillow 中读取和保存图像等主题。
读取图像
使用 Pillow 库读取和写入图像非常简单,借助 **PIL.Image 模块函数**。
语法
Image.open(fp, mode=’r’)
其中
**fp** - 文件名(字符串)、pathlib.Path 对象或文件对象。文件对象必须实现 read()、seek() 和 tell() 方法,并以二进制模式打开。
**mode** - 这是一个可选参数,如果给出,必须为“r”。
**返回值** - 一个 Image 对象。
**错误** - 如果找不到文件,或者无法打开和识别图像。
示例
以下是一个非常简单的示例,我们将打开任何格式的图像(我们使用 .**jpg**),在窗口中显示它,然后以另一种文件格式(.**png**)保存它(默认位置)。
from PIL import Image image = Image.open('beach1.jpg') image.show() image.save('beach1.bmp') image1 = Image.open('beach1.bmp') image1.show()
在上面的示例中,我们从 PIL 库中导入 Image 模块,然后调用 **Image.open()** 函数从磁盘读取图像,该函数返回图像对象数据类型。它将通过查看文件内容自动确定文件类型。对于读取,**open()** 函数接受 **文件名(字符串)**、**路径对象** 或 **图像(文件)** 对象。
因此,通过使用 open() 函数,我们实际上是在读取图像。Image.open() 将读取图像并获取图像的所有相关信息。
输出
如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示原始图像(.jpg)和重新保存的图像(.bmp),如下所示:
实际图像
重新保存的图像(.bmp)
保存图像
save() 函数将图像写入文件。与读取(open() 函数)一样,save() 函数接受文件名、路径对象或已打开以进行写入的文件对象。
语法
Image.save(fp, format=None, **params)
其中,
**fp** - 文件名(字符串)、pathlib.Path 对象或文件对象。
**format** - 可选的格式覆盖。如果省略,则要使用的格式将从文件名扩展名确定。如果使用文件对象而不是文件名,则应始终使用此参数。
**options** - 传递给图像写入器的额外参数。
**返回值** - None
**KeyError** - 如果无法从文件名确定输出格式,请使用 format 选项来解决此问题。
**IOError** - 如果无法写入文件,则可能已创建文件,并且可能包含部分数据。
简而言之,上述语法将图像保存到给定的文件名下。如果未指定格式,则基于当前文件名扩展名。为了向编写器提供其他说明,我们使用关键字选项。
image.save('beach1.bmp')
在上面的示例中,它根据文件扩展名保存文件以确定图像类型,例如 - 上述操作将在我们的当前工作目录中创建一个 bmp 文件。
您还可以显式地将文件类型作为第二个参数指定 -
image.save('beach1.gif', 'GIF')
Python Pillow - 创建缩略图
有时,需要所有图像的高度和宽度都相等。实现此目的的一种方法是使用 pillow 库中的 thumbnail() 函数创建所有图像的缩略图。
此方法修改图像以包含其自身的缩略图版本,并且图像的大小不会大于给定大小。
该方法计算适当的缩略图大小以保留图像的纵横比,调用 **draft() 方法** 配置文件读取器(在适用情况下),最后调整图像大小。
语法
Image.thumbnail(size, resample=3)
其中,
**Size** - 所需大小
**Resample** - 可选重采样滤镜。它可以是以下之一:PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 或 PIL.Image.LANCZOS。如果省略,则默认为 PIL.Image.BICUBIC。
**Returns** - 无
示例
以下示例演示了使用 python pillow 创建缩略图 -
from PIL import Image def tnails(): try: image = Image.open('images/cat.jpg') image.thumbnail((90,90)) image.save('images/thumbnail.jpg') image1 = Image.open('images/thumbnail.jpg') image1.show() except IOError: pass tnails()
输出
如果将上述程序保存为 Example.py 并执行,它将使用默认的 PNG 显示实用程序显示创建的缩略图,如下所示 -
原始图像
输出图像
Python Pillow - 合并图像
Pillow 包允许您将一个图像粘贴到另一个图像上。merge() 函数接受模式和图像元组作为参数,并将它们组合成单个图像。
语法
Image.merge(mode, bands)
其中,
**mode** - 输出图像要使用的模式。
**bands** - 包含输出图像中每个波段的一个单波段图像的序列。所有波段必须具有相同的大小。
**返回值** - Image 对象。
使用 merge() 函数,您可以合并图像的 RGB 波段,如下所示 -
from PIL import Image image = Image.open("beach1.jpg") r, g, b = image.split() image.show() image = Image.merge("RGB", (b, g, r)) image.show()
执行上述代码段后,您可以看到原始图像和合并 RGB 波段后的图像,如下所示 -
输入图像
输出图像
合并两个图像
同样,要合并两个不同的图像,您需要 -
使用 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 类** 提供了几个标准图像滤镜。可以通过使用 ImageFilter 类中定义的所需滤镜类型调用 Image 对象的 **filter() 方法** 将图像滤镜应用于图像。
有多种技术用于模糊图像,我们将讨论以下提到的技术。
简单模糊
方框模糊
高斯模糊
所有这三种技术都将使用“Image.filter()”方法将滤镜应用于图像。
简单模糊
它根据特定内核或卷积矩阵指定的模糊效果应用于图像。
语法
filter(ImageFilter.BLUR)
示例
#Import required Image library from PIL import Image, ImageFilter #Open existing image OriImage = Image.open('images/boy.jpg') OriImage.show() blurImage = OriImage.filter(ImageFilter.BLUR) blurImage.show() #Save blurImage blurImage.save('images/simBlurImage.jpg')
执行后,上述示例将生成两个标准 PNG 显示实用程序窗口(在本例中为 Windows **照片** 应用)。
原始图像
模糊图像
方框模糊
在此滤镜中,我们使用“radius”作为参数。半径与模糊值成正比。
语法
ImageFilter.BoxBlur(radius)
其中,
**Radius** - 一个方向上的方框大小。
**Radius 0** - 表示没有模糊,并返回相同的图像。
**Radius 1** - 在每个方向上取 1 个像素,即总共 9 个像素。
示例
#Import required Image library from PIL import Image, #Open existing image OriImage = Image.open('images/boy.jpg') OriImage.show() #Applying BoxBlur filter boxImage = OriImage.filter(ImageFilter.BoxBlur(5)) boxImage.show() #Save Boxblur image boxImage.save('images/boxblur.jpg')
输出
执行后,上述示例将生成两个标准 PNG 显示实用程序窗口(在本例中为 Windows 照片应用)。
原始图像
模糊图像
高斯模糊
此滤镜也使用参数 radius 并执行与方框模糊相同的工作,但有一些算法更改。简而言之,更改 radius 值将生成不同强度的“高斯模糊”图像。
语法
ImageFilter.GaussianBlur(radius=2)
其中,
Radius - 模糊半径
示例
#Import required Image library from PIL import Image, ImageFilter #Open existing image OriImage = Image.open('images/boy.jpg') OriImage.show() #Applying GaussianBlur filter gaussImage = OriImage.filter(ImageFilter.GaussianBlur(5)) gaussImage.show() #Save Gaussian Blur Image gaussImage.save('images/gaussian_blur.jpg')
输出
执行后,上述示例将生成两个标准 PNG 显示实用程序窗口(在本例中为 Windows **照片** 应用)。
原始图像
模糊图像
Python Pillow - 裁剪图像
裁剪是图像处理的重要操作之一,用于去除图像中不需要的部分以及向图像添加所需的功能。它广泛用于 Web 应用程序中,用于上传图像。
Pillow 中图像类的 crop() 函数需要将要裁剪的部分作为矩形。要从图像中裁剪的矩形部分指定为一个四元素元组,并返回已裁剪的图像的矩形部分作为图像对象。
示例
以下示例演示了如何使用 python pillow 旋转图像 -
#Import required Image library from PIL import Image #Create an Image Object from an Image im = Image.open('images/elephant.jpg') #Display actual image im.show() #left, upper, right, lowe #Crop cropped = im.crop((1,2,300,300)) #Display the cropped portion cropped.show() #Save the cropped image cropped.save('images/croppedBeach1.jpg')
输出
如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示原始图像和裁剪后的图像,如下所示 -
原始图像
裁剪后的图像
Python Pillow - 翻转和旋转图像
在使用 python 图像处理库处理图像时,有时需要翻转现有图像以获得更多见解,以增强其可见性或由于您的需求。
pillow 库的 Image 模块允许我们非常轻松地翻转图像。我们将使用 Image 模块中的 transpose() 函数来翻转图像。“transpose()”支持的一些最常用的方法是 -
**Image.FLIP_LEFT_RIGHT** - 水平翻转图像
**Image.FLIP_TOP_BOTTOM** - 垂直翻转图像
**Image.ROTATE_90** - 通过指定度数旋转图像
示例 1:水平翻转的图像
以下 Python 示例读取图像,将其水平翻转,并使用标准 PNG 显示实用程序显示原始图像和翻转后的图像 -
# import required image module from PIL import Image # Open an already existing image imageObject = Image.open("images/spiderman.jpg") # Do a flip of left and right hori_flippedImage = imageObject.transpose(Image.FLIP_LEFT_RIGHT) # Show the original image imageObject.show() # Show the horizontal flipped image hori_flippedImage.show()
输出
原始图像
翻转后的图像
示例 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 库的 Image 模块具有一个属性 size。此元组包含图像的宽度和高度作为其元素。要调整图像大小,您可以通过提供宽度和高度来调用 pillow 的图像类的 resize() 方法。
调整大小并保存调整大小的图像
调整大小并保存调整大小的图像的程序如下所示 -
#Import required Image library from PIL import Image #Create an Image Object from an Image im = Image.open("images/cat.jpg") #Display actual image im.show() #Make the new image half the width and half the height of the original image resized_im = im.resize((round(im.size[0]*0.5), round(im.size[1]*0.5))) #Display the resized imaged resized_im.show() #Save the cropped image resized_im.save('resizedBeach1.jpg')
输出
如果将上述程序保存为 Example.py 并执行,它将使用标准 PNG 显示实用程序显示原始图像和调整大小后的图像,如下所示 -
原始图像
调整大小后的图像
Python Pillow - 创建水印
您已经注意到,一些在线照片带有水印。水印绝对是保护您的图像免遭滥用的更好方法之一。此外,建议在社交媒体上分享您的创意照片之前,为其添加水印,以防止其被滥用。
水印通常是在照片上叠加的一些文本或徽标,用于识别拍摄照片的人或拥有照片版权的人。
Pillow 包允许我们向图像添加水印。要向我们的图像添加水印,我们需要 pillow 包中的 **“Image”**、**“ImageDraw”** 和 **“ImageFont”** 模块。
“ImageDraw”模块增加了在新的或现有的图像上绘制二维图形的功能。“ImageFont”模块用于加载位图、TrueType 和 OpenType 字体文件。
示例
以下 python 程序演示了如何使用 python pillow 向图像添加水印 -
#Import required Image library from PIL import Image, ImageDraw, ImageFont #Create an Image Object from an Image im = Image.open('images/boy.jpg') width, height = im.size draw = ImageDraw.Draw(im) text = "sample watermark" font = ImageFont.truetype('arial.ttf', 36) textwidth, textheight = draw.textsize(text, font) # calculate the x,y coordinates of the text margin = 10 x = width - textwidth - margin y = height - textheight - margin # draw watermark in the bottom right corner draw.text((x, y), text, font=font) im.show() #Save watermarked image im.save('images/watermark.jpg')
输出
假设,以下是在图像文件夹中找到的输入图像 **boy.jpg**。
执行上述程序后,如果观察输出文件夹,您会看到结果 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 库的当前版本提供了以下提到的预定义图像增强滤镜集。
BLUR
CONTOUR
DETAIL
EDGE_ENHANCE
EDGE_ENHANCE_MORE
EMBOSS
FIND_EDGES
SHARPEN
SMOOTH
SMOOTH_MORE
示例
以下 python 示例将模糊滤镜应用于图像,并将其保存并使用标准 PNG 显示实用程序显示 -
#Import required image modules from PIL import Image, ImageFilter #Import all the enhancement filter from pillow from PIL.ImageFilter import ( BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN ) #Create image object img = Image.open('images/cat.jpg') #Applying the blur filter img1 = img.filter(BLUR) img1.save('images/ImageFilter_blur.jpg') img1.show()
输出
同样,您可以将以下任何参数传递给 **image.filter()** 方法以获取相应的输出 -
CONTOUR
DETAIL
EDGE_ENHANCE
EDGE_ENHANCE_MORE
EMBOSS
FIND_EDGES
SMOOTH
SMOOTH_MORE
SHARPEN
Python img.filter(CONTOUR) 方法
以下 python 示例将 CONTOUR 滤镜应用于给定图像。
示例
#Import required image modules from PIL import Image, ImageFilter #Import all the enhancement filter from pillow from PIL.ImageFilter import ( BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE, SHARPEN ) #Create image object img = Image.open('images/cat.jpg') #Applying the blur filter img1 = img.filter(CONTOUR) img1.save('images/ImageFilter_blur.jpg') img1.show()
输出
如果保存上述程序并执行,它将显示原始图像和过滤后的图像,使用标准 PNG 显示实用程序,如下所示 -
原始图像
过滤后的图像
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% 蓝色)。
圆柱坐标表示(也称为 HSL)的颜色 #00ff00 色相:0.33,饱和度:1.00,并且 00ff00 的亮度值为 0.50。
Image Color 模块提供了大约 140 种标准颜色名称,基于 X 窗口系统和大多数 Web 浏览器支持的颜色。颜色名称不区分大小写。
ImageColor.getrgb() 方法
将颜色字符串转换为 RGB 元组。如果无法解析字符串,则此函数将引发 ValueError 异常。
语法
PIL.ImageColor.getrgb(color)
其中,
参数:color - 颜色字符串
返回值:(red, green, blue[, alpha])
示例 1
from PIL import ImageColor # using getrgb img = ImageColor.getrgb("blue") print(img) img1 = ImageColor.getrgb("purple") print(img1)
输出
(0, 0, 255) (128, 0, 128)
示例 2
#Import required image modules from PIL import Image,ImageColor # Create new image & get color RGB tuple. img = Image.new("RGB", (256, 256), ImageColor.getrgb("#add8e6")) #Show image img.show()
输出
ImageColor.getcolor() 方法
此方法与 getrgb() 相同,但是如果模式不是图形命令支持的形状绘制和文本注释颜色或调色板图像,则会将 RGB 值转换为灰度值。如果字符串无法解析,则此函数引发 ValueError 异常。
语法
PIL.ImageColor.getcolor(color, mode)
其中,
参数 - 颜色字符串
返回值 - (灰度级[, alpha]) 或 (红色, 绿色, 蓝色[, alpha])
示例
#Import required image modules from PIL import Image,ImageColor # using getrgb img = ImageColor.getrgb("skyblue") print(img) img1 = ImageColor.getrgb("purple") print(img1)
输出
(135, 206, 235) (128, 0, 128)
Python Pillow - ImageDraw 模块
'ImageDraw' 模块为 Image 对象提供了简单的 2D 图形支持。通常,我们使用此模块来创建新图像、注释或修饰现有图像以及为 Web 使用动态生成图形。
图形命令支持绘制形状和注释文本。
可以将图像理解为像素(图像元素)的二维数组。像素是支持的最小颜色点。
ImageDraw 使用的二维坐标系的原点位于图像的左上角。
我们使用的 Pillow 颜色方案是 RGB。RGB 颜色表示和支持由ImageColor模块提供。
位图、OpenType 或 TrueType 是文本注释可接受的字体。
大多数绘图命令可能需要一个边界框参数,该参数指定要应用命令的图像区域。
一系列坐标可以表示为 [ (x0, y0), (x1, y1),…(xn, yn)]。
对于某些绘图命令,我们需要角度值。
示例
以下 Python 示例在给定图像上绘制一条线 -
#Import required libraries import sys from PIL import Image, ImageDraw #Create Image object im = Image.open("images/logo.jpg") #Draw line draw = ImageDraw.Draw(im) draw.line((0, 0) + im.size, fill=128) draw.line((0, im.size[1], im.size[0], 0), fill=128) #Show image im.show()
输出
如果将上述程序保存为 Example.py 并执行,它将在图像上绘制一条线,并使用标准 PNG 显示实用程序显示它,如下所示 -
画布
ImageDraw 是 Image 的 Pillow 可绘制表面(即画布)。
ImageDraw.Draw(img) 返回 Image 参数 img 的可绘制画布表示。画布的背景是“img”图像。
示例
以下 Python 示例在给定图像上绘制文本 -
#Import required modules from Pillow package from PIL import Image, ImageDraw, ImageFont # get an image base = Image.open('images/boy.jpg').convert('RGBA') # make a blank image for the text, initialized to transparent text color txt = Image.new('RGBA', base.size, (255,255,255,0)) # get a font fnt = ImageFont.truetype('E:/PythonPillow/Fonts/Pacifico.ttf', 40) # get a drawing context d = ImageDraw.Draw(txt) # draw text, half opacity d.text((14,14), "Tutorials", font=fnt, fill=(255,255,255,128)) # draw text, full opacity d.text((14,60), "Point", font=fnt, fill=(255,255,255,255)) out = Image.alpha_composite(base, txt) #Show image out.show()
输出
使用 '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() 方法在 draw 上绘制由边界框 xy 包围的椭圆。形状使用颜色填充填充,周长使用颜色轮廓填充。参数 fill 和 width 是可选的,其默认值为 None。
示例
from PIL import Image, ImageDraw img = Image.new('RGB', (500, 300), (125, 125, 125)) draw = ImageDraw.Draw(img) draw.ellipse((200, 125, 300, 200), fill=(255, 0, 0), outline=(0, 0, 0)) img.show()
输出
矩形
以下是使用 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()
输出
多边形
以下是使用 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 - 图像序列
Python 图像库 (PIL) 包含一些对图像序列(动画格式)的基本支持。FLI/FLC、GIF 和一些实验性格式是受支持的序列格式。TIFF 文件也可以包含多个帧。
打开序列文件时,PIL 会自动加载序列中的第一帧。要移动到不同的帧,可以使用 seek 和 tell 方法。
from PIL import Image img = Image.open('bird.jpg') #Skip to the second frame img.seek(1) try: while 1: img.seek(img.tell() + 1) #do_something to img except EOFError: #End of sequence pass
输出
raise EOFError EOFError
如上所示,当序列结束时,您将获得 EOFError 异常。
库最新版本中的大多数驱动程序仅允许您跳转到下一帧(如上例所示),要倒回文件,您可能需要重新打开它。
一个序列迭代器类
class ImageSequence: def __init__(self, img): self.img = img def __getitem__(self, ix): try: if ix: self.img.seek(ix) return self.img except EOFError: raise IndexError # end of sequence for frame in ImageSequence(img): # ...do something to frame...
Python Pillow - 在图像上写入文本
您可以通过传递文本的位置、文本本身和文本的颜色来在图像上写入文本。我们可以向此方法传递多个其他参数。
示例
from PIL import Image, ImageDraw img = Image.open(beach1.jpg') d1 = ImageDraw.Draw(img) d1.text((28, 36), "Hello, TutorialsPoint!", fill=(255, 0, 0)) img.show() img.save("images/image_text.jpg")
输入
输出
如果将上述程序保存为 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]]]
原始图像
从数组构建的图像