Pillow是Python的一个强大图像处理库,是PIL(Python Imaging Library)的分支,旨在提供更简单、更便捷的图像处理功能。它支持多种图像格式,如JPEG、PNG、GIF等,并提供了丰富的操作工具,包括图像打开、创建、编辑、裁剪、缩放和滤镜应用等。Pillow还支持图像的绘制和文本添加,使得设计和图像生成变得更加灵活。通过Pillow,开发者能够轻松实现图像处理与操作,广泛应用于Web开发、数据可视化和机器学习等领域。
Image类是Pillow库中最为重要的类,该类被定义在和与其同名的Image模块中。
from PIL import Image
Hyplus目录
1 Image对象初始化
1.1 open()
使用Image类的open()
方法,可以根据一个图像文件创建Image对象:
img = Image.open(fp, mode="r")
- fp:文件路径,字符串格式
- mode:可选参数,若出现该参数,则必须设置为 “r”,否则会引发ValueError异常。
【例】打开图像文件并显示
#打开图片文件
img = Image.open("C:/Users/Administrator/Desktop/c-net.png")
#要显示图像需调用show()方法
img.show()
1.2 new()
使用Image类提供的new()
方法可以初始化一个全新的Image对象:
im = Image.new(mode, size, color)
- mode:图像模式,字符串参数,比如
RGB
(真彩图像)、L
(灰度图像)、CMYK
(色彩图打印模式)等; - size:图像大小,元组参数
(width, height)
代表图像的像素大小; - color:图片颜色,默认值为0表示黑色,参数值支持
(R, G, B)
三元组数字格式、颜色的十六进制值以及颜色英文单词。
【例】使用颜色的十六进制格式
#使用颜色的十六进制格式
img = Image.new(mode='RGB', (260, 100), color="#ff0000")
img.show()
2 常用属性
- size:图像的尺寸,为
(width, height)
- format:图片的格式
- readonly:图片是否为只读(1 - 是;0 - 否)
- info:查看图片相关信息,返回值为字典格式
- mode:图像模式,常见的图像模式如下表所示
mode | 描述 |
---|---|
1 | 1位像素(取值范围0~1),0表示黑,1表示白,单色通道 |
L | 8位像素(取值范围0~255),灰度图,单色通道 |
P | 8位像素,使用调色板映射到任何其他模式,单色通道 |
RGB | 3x8位像素,真彩色,三色通道,每个通道取值范围0~255 |
RGBA | 4x8位像素,真彩色+透明通道,四色通道 |
CMYK | 4x8位像素,四色通道,适用于打印图片 |
YCbCr | 3x8位像素,彩色视频格式,三色通道 |
LAB | 3x8位像素,L a b颜色空间,三色通道 |
HSV | 3x8位像素,色相,饱和度,值颜色空间,三色通道 |
I | 32位有符号整数像素,单色通道 |
F | 32位浮点像素,单色通道 |
img = Image.open("loong.jpg")
print(f"图像的宽为{img.width},高为{img.height}")
print(f"图像的尺寸:{img.size}")
print(f"图像的格式:{img.format}")
print(f"图像是否为只读:{img.readonly}")
print(f"图像信息:{img.info}")
print(f"图像模式:{img.mode}")
图像的宽为640,高为640
图像的尺寸:(640, 640)
图像的格式:JPEG
图像是否为只读:1
图像信息:{'jfif': 257, 'jfif_version': (1, 1), 'jfif_unit': 0, 'jfif_density': (1, 1)}
图像模式:RGB
3 图片格式转换
3.1 save()
.save()
方法用于保存图像。当不指定文件格式时,会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片
img.save(fp, format=None)
- fp:图片的存储路径,包含图片的名称,字符串格式
- format:可选参数,可以指定图片的格式
【例】保存为BMP格式图片
img = Image.open("loong.jpg")
img.save("rina.bmp")
3.2 convert() + save()
由于许多图像格式的图像模式不一致,无法直接使用save()
进行格式转换。Image类提供的convert()
方法可以实现图像模式的转换,该函数提供了多个参数,其中最关键的参数是mode,如下所示:
img.convert(mode, **parms)
- mode:将要转换成的图像模式
- params:其他可选参数。
【例】将bmp图像转换为png图像(仅作示例)
img = Image.open("rina.bmp")
img.convert("RGB").save("rina.png")
4 图像缩放操作
4.1 缩放图像:resize()
Image类提供的resize()
方法能够实现任意缩小和放大图像,返回缩放后的图像:
img2 = img.resize(size, resample=image.BICUBIC, box=None, reducing_gap=None)
- size:元组参数
(width, height)
,图片缩放后的尺寸 - resample:可选参数,指图像重采样滤波器,默认为
Image.BICUBIC
(参考thumbnail()
函数) - box:对指定图片区域进行缩放,参数值是长度为4的像素坐标元组,即
(左, 上, 右, 下)
。注意,被指定的区域必须在原图的范围内,如果超出范围就会报错。当不传该参数时,默认对整个原图进行缩放 - reducing_gap:可选参数,浮点参数值,用于优化图片的缩放效果,常用参数值有3.0和5.0
【例1】对图像进行缩放操作
img = Image.open("rina.png")
try:
# 缩放图片
img2 = img.resize((300, 100))
# 保存缩放后的图像
img2.save("data/rina2.png")
print(f"图像的尺寸:{img2.size}")
except IOError:
print("缩放图像失败")
图像的尺寸:(300, 100)
【例2】对图片的局部位置进行缩放操作
img = Image.open("rina.png")
try:
# 选择放大的局部位置,并选择图片重采样方式
# box四元组:像素坐标 (左, 上, 右, 下)
# (0, 0, 500, 500)表示以原图的左上角(0, 0)为原点,选择宽和高分别为(500, 500)的图像区域
img3 = img.resize((300, 100), resample=Image.LANCZOS, box=(0, 0, 500, 500))
img3.save("data/rina3.png")
print(f"图像的尺寸:{img3.size}")
except IOError:
print("缩放图像失败")
图像的尺寸:(300, 100)
4.2 创建缩略图:thumbnail()
缩略图(thumbnail image)指将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览。
Image对象提供了thumbnail()
方法来将图像变成缩略图:
img.thumbnail(size, resample)
- size:元组参数,指缩小后的图像大小
- resample:可选参数,指图像重采样滤波器。有四种过滤方式:Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法【默认】)、PIL.Image.LANCZOS(下采样过滤插值法)
【例】生成图像的缩略图并保存
img = Image.open("rina.png")
img.thumbnail((150, 50))
print(f"缩略图尺寸:{img.size}")
img.save("data/th.jpg")
缩略图尺寸:(50, 50)
注:缩略图的尺寸可能会与指定的尺寸不一致,这是因为 Pillow会对原图像的长、宽进行等比例缩小。当指定的尺寸不符合图像的尺寸规格时,缩略图就会创建失败,比如指定的尺寸超出了原图像的尺寸规格(例如上例)。
4.3 批量修改图片尺寸
在图像处理过程中,对于某些不需要精细处理的环节,往往采用批量处理方法,比如批量转换格式,批量修改尺寸,批量添加水印,批量创建缩略图等,这是一种提升工作效率的有效途径,它避免了单一、重复的操作。通过 Pillow提供的resize()
方法可以批量地修改图片尺寸。
【例】批量修改图片尺寸并保存
import os
from PIL import Image
# 读取图片目录
file_names = os.listdir("data/")
print(file_names)
# 设定尺寸
width = 350
height = 350
# 如果目录不存在则创建目录
new_dir_name = os.path.join("data", "new_images")
if not os.path.exists(new_dir_name):
os.mkdir(new_dir_name)
# 循环读取每一张图片
for file_name in file_names:
og_img = Image.open(os.path.join("data", file_name))
new_img = og_img.resize((width, height), Image.BILINEAR)
print(new_img)
new_img.save(os.path.join(new_dir_name, file_name))
['th.jpg', 'rina3.png', 'rina2.png']
<PIL.Image.Image image mode=RGB size=350x350 at 0x1048905D0>
<PIL.Image.Image image mode=RGB size=350x350 at 0x13387AE10>
<PIL.Image.Image image mode=RGB size=350x350 at 0x133A8BA90>
5 图像分离与合并
Image类提供了用于分离图像和合并图像的方法:split()
和merge()
方法。通常情况下这两个方法一起使用。
5.1 分离颜色通道:split()
split()
的使用方法比较简单,用来分离颜色通道。
r, g, b = img.split()
【例】处理jpg图片,分离R、G、B三色通道
img = Image.open("loong.jpg")
r, g, b = img.split()
r.show()
g.show()
b.show()
5.2 合并图像:merge()
Image类提供的merge()
方法可以实现图像的合并操作,
既能进行单个图像的合并(将颜色通道进行重新组合,从而得到不一样的图片效果),又能进行多个图像的合并(要求两张图片的模式、图像大小必须要保持一致),返回一个新的Image对象。
img = Image.merge(mode, bands)
- mode:指定输出图片的模式
- bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,例如RGB分别代表三种颜色通道,可以表示为
(r, g, b)
。
【例1】将通道重新排列,合并单个图像
img = Image.open("loong.jpg")
r, g, b = img.split()
img_merge = Image.merge("RGB", (b, g, r))
img_merge.show()
img_merge.save(os.path.join("data", "new_images", "img_merge.jpg"))
【例2】将龙图与以下蝴蝶图进行合并
img1 = Image.open("loong.jpg")
img2 = Image.open("butterfly.jpg")
# 统一两张图片尺寸
img2 = img2.resize(img1.size)
# 颜色分离操作
r1, g1, b1 = img1.split()
r2, g2, b2 = img2.split()
# 合并图像
img3 = Image.merge("RGB", [r2, g1, b2])
img3.show()
img3.save(os.path.join("data", "new_images", "multi_merge.jpg"))
5.3 混合图像:blend()
Image类也提供了blend()
方法来混合RGBA模式的图片(PNG 格式)
img = Image.blend(image1, image2, alpha)
- image1,image2:两个Image对象
- alpha:透明度,取值范围为0~1。当取值为0时,输出图像相当于image1的拷贝,而取值为1时,则是image2的拷贝,只有当取值为0.5时,才为两个图像的中合。因此该值的大小决定了两个图像的混合程度。
与RGB模式相比,RGBA在RGB的基础上增加了透明度,通过Alpha取值来决定两个图像的混合程度,其他操作参考merge()函数。
6 图像裁剪、复制、粘贴操作
6.1 图像裁剪操作
Image类提供的crop()
函数允许以矩形区域的方式对原图像进行裁剪,返回一个Image对象。
img2 = img.crop(box=None)
- box:表示裁剪区域,默认为 None,表示拷贝原图像(参考
resize()
函数)
【例】裁剪图像
img = Image.open("rina.png")
box = (0, 0, 400, 500)
img_crop = img.crop(box)
img_crop.show()
img_crop.save(os.path.join("data", "new_images", "img_crop.png"))
6.2 拷贝和粘贴:copy()、paste()
拷贝、粘贴操作几乎是成对出现的,Image类提供了 copy()
和paste()
方法来实现图像的复制和粘贴。其中复制操作比较简单,下面主要介绍paste()
粘贴方法。
img2 = img.copy()
img2.paste(image, box=None, mask=None)
- image:指被粘贴的图片;
- box:指定图片被粘贴的位置或者区域,其参数值是长度为2或者4的元组序列。长度为2时,表示具体的某一点
(x, y)
;长度为4则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致。 - mask:可选参数,为图片添加蒙版效果。
【例】复制一张原图像的副本,对副本进行裁剪、粘贴操作
img = Image.open("rina.png")
# 复制一张图片副本
img_copy = img.copy()
# 对副本进行裁剪
img_crop = img_copy.crop((0, 0, 200, 100))
# 创建一个新的图像作为蒙版,L模式,单颜色值
mask_img = Image.new("L", (200, 100), color=200)
# 将裁剪后的副本粘贴至副本图像上,并添加蒙版
img_copy.paste(img_crop, (100, 100, 300, 200), mask=mask_img)
img_copy.show()
img_copy.save(os.path.join("data", "new_images", "img_copypasta.png"))
7 图像几何变换
图像的几何变换主要包括图像翻转、图像旋转和图像变换操作
7.1 翻转操作:transpose()
transpose()
函数可以实现图像的垂直、水平翻转
img2 = img.transpose(method)
method参数决定了图片要如何翻转,参数值如下:
- Image.FLIP_LEFT_RIGHT:左右水平翻转
- Image.FLIP_TOP_BOTTOM:上下垂直翻转
- Image.ROTATE_90:图像旋转90度
- Image.ROTATE_180:图像旋转180度
- Image.ROTATE_270:图像旋转270度
- Image.TRANSPOSE:图像转置
- Image.TRANSVERSE:图像横向翻转
【例】左右水平翻转图片
img = Image.open("rina.png")
img2 = img.transpose(Image.FLIP_LEFT_RIGHT)
img2.show()
img2.save(os.path.join("data", "new_images", "transposed.png"))
7.2 任意角度旋转:rotate()
rotate()
函数可以实现把图像旋转任意角度
img2 = img.rotate(angle, resample=PIL.Image.NEAREST, expand=None, center=None, translate=None, fillcolor=None)
- angle:任意旋转的角度
- resample:重采样滤波器,默认为 PIL.Image.NEAREST(最近邻插值法)
- expand:可选参数,表示是否对图像进行扩展。如果参数值为True则扩大输出图像;如果为False或者省略,则表示按原图像大小输出
- center:可选参数,指定旋转中心,参数值是长度为2的元组,默认以图像中心进行旋转
- translate:参数值为二元组(可以为负数),表示对旋转后的图像进行平移,以左上角为原点
- fillcolor:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充
【例】将图像旋转45度,并将旋转图之外的区域填充为绿色
img = Image.open("rina.png")
img2 = img.rotate(45, translate=(0, -25), fillcolor="green")
img2.show()
img2.save(os.path.join("data", "new_images", "rotated_img.png"))
7.3 图像变换:transform()
transform()
函数能够对图像进行变换操作,通过指定的变换方式,产生一张规定大小的新图像
img2 = img.transform(size, method, data=None, resample=0)
- size:指定新图片的大小
- method:指定图片的变化方式,例如 Image.EXTENT(表示矩形变换)
- data:为变换方式提供所需数据
- resample:图像重采样滤波器,默认参数值为 PIL.Image.NEAREST
【例】设置图像大小为250×250,截取原图像的区域,生成新图像
img = Image.open("rina.png")
# 设置图像大小为250*250,并根据data参数截取原图像的区域,进行矩形变换
img2 = img.transform((250, 205), Image.EXTENT, data=[0, 0, 30 + img.width // 4, img.height // 3])
img2.show()
img2.save(os.path.join("data", "new_images", "transformed.png"))
8 图像降噪处理:filter()
由于成像设备、传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信息统称为“噪声”,比如数字图像中常见的“椒盐噪声”,指的是图像会随机出现的一些白、黑色的像素点。图像噪声既影响了图像的质量,又妨碍人们的视觉观赏。因此,噪声处理是图像处理过程中必不可少的环节之一,我们把处理图像噪声的过程称为“图像降噪”。
随着数字图像技术的不断发展,图像降噪方法也日趋成熟,通过某些算法来构造滤波器是图像降噪的主要方式。滤波器能够有效抑制噪声的产生,并且不影响被处理图像的形状、大小以及原有的拓扑结构。
Pillow通过ImageFilter类达到图像降噪的目的,该类中集成了不同种类的滤波器,通过调用它们从而实现图像的平滑、锐化、边界增强等图像降噪操作。
from PIL import Image, ImageFilter
常见的降噪滤波器如下表所示:
名称 | 说明 |
---|---|
ImageFilter.BLUR | 模糊滤波,即均值滤波 |
ImageFilter.CONTOUR | 轮廓滤波,寻找图像轮廓信息 |
ImageFilter.DETAIL | 细节滤波,使得图像显示更加精细 |
ImageFilter.FIND_EDGES | 寻找边界滤波(找寻图像的边界信息) |
ImageFilter.EMBOSS | 浮雕滤波,以浮雕图的形式显示图像 |
ImageFilter.EDGE_ENHANCE | 边界增强滤波 |
ImageFilter.EDGE_ENHANCE_MORE | 深度边缘增强滤波 |
ImageFilter.SMOOTH | 平滑滤波 |
ImageFilter.SMOOTH_MORE | 深度平滑滤波 |
ImageFilter.SHARPEN | 锐化滤波 |
ImageFilter.GaussianBlur() | 高斯模糊 |
ImageFilter.UnsharpMask() | 反锐化掩码滤波 |
ImageFilter.Kernel() | 卷积核滤波 |
ImageFilter.MinFilter(size) | 最小值滤波器,从size参数指定的区域中选择最小像素值,然后将其存储至输出图像中 |
ImageFilter.MedianFilter(size) | 中值滤波器,从size参数指定的区域中选择中值像素值,然后将其存储至输出图像中 |
ImageFilter.MaxFilter(size) | 最大值滤波器 |
ImageFilter.ModeFilter() | 模式滤波 |
使用filter()
对图像进行填充各种ImageFilter。
img2 = img.filter(imageFilter)
【例】生成图像轮廓图
img = Image.open("rina.png")
img2 = img.filter(ImageFilter.CONTOUR)
img2.show()
img2.save(os.path.join("data", "new_images", "contour.png"))
9 图像颜色处理
Pillow提供了颜色处理模块ImageColor,该模块支持不同格式的颜色,比如RGB格式的颜色三元组、十六进制的颜色名称(#ff0000
)以及颜色英文单词(red
,大小写不敏感)。同时,它还可以将CSS风格的颜色转换为RGB格式。
from PIL import Image, ImageColor
9.1 颜色命名
ImageColor支持多种颜色模式的的命名(即使用固定的格式对颜值进行表示),比如人尽皆知的RGB色彩模式,除此之外还有HSL (色调-饱和度-明度)、HSB (又称 HSV,色调-饱和度-亮度)色彩模式。下面对HSL做简单介绍:
- H(Hue,色调):取值范围0~360,其中0表示
red
,120表示green
,240表示blue
- S(Saturation,饱和度):代表色彩的纯度,取值 0~100%,其中0代表灰色(grey),100%表示色光最饱和
- L(Lightness,明度):取值为0~100%,其中0表示黑色(black),50%表示正常颜色,100%则表示白色
【例】使用HSL色彩模式表示“纯红色”,相当于RGB(255, 0, 0)
HSL(0,100%,50%)
9.2 获取颜色的RGB值:getrgb()
顾名思义,getrgb()
函数用来得到颜色的RGB值
ImageColor.getrgb(color)
【例1】获取RGB值
color1 = ImageColor.getrgb("blue")
print(color1)
color2 = ImageColor.getrgb('#DCDCDC')
print(color2)
# 使用HSL模式红色
color3 = ImageColor.getrgb('HSL(0,100%,50%)')
print(color3)
(0, 0, 255)
(220, 220, 220)
(255, 0, 0)
【例2】在使用new()
新建图像时使用getrgb()
img = Image.new("RGB", (200, 200), ImageColor.getrgb("#EEB4B4"))
img.show()
img.save(os.path.join("data", "new_images", "new_rgb.jpg"))
9.3 获取指定色彩模式的颜色值:getcolor()
与getrgb()
类似,getcolor()
同样用来获取颜色值,不过它多了一个mode参数,因此该函数可以获取指定色彩模式的颜色值。
ImageColor.getcolor(color, mode)
- color:一个颜色名称,字符串格式,可以是颜色的英文单词,或者十六进制颜色名。如果是不支持的颜色,会报ValueError错误
- mode:指定色彩模式,如果是不支持的模式,会报KeyError错误。
【例】获取指定色彩模式的颜色值
color1 = ImageColor.getcolor('#EEA9B8','L')
print(color1)
color2 = ImageColor.getcolor('yellow','RGBA')
print(color2)
191
(255, 255, 0, 255)
10 为图片添加水印
为图片添加水印能够在一定程度上避免其他人滥用图片,这是保护图片版权的一种有效方式。Pillow提供了ImageDraw和ImageFont模块来实现添加水印。
10.1 ImageDraw
PIL.ImageDraw模块提供了一系列的绘图方法,通过该模块可以创建一个新的图形,或者在现有的图像上再绘制一个图形,从而起到对原图注释和修饰的作用。初始化方法如下:
draw = ImageDraw.Draw(im)
上述方法会返回一个ImageDraw对象,参数im表示 Image对象。这里可以把Image对象理解成画布,通过调用ImageDraw对象的一些方法,实现了在画布上绘制出新的图形目的。ImageDraw对象的常用方法如下表所示:
方法 | 说明 |
---|---|
text() |
在图像上绘制文字。需要与ImageFont模块一起使用,详见下文 |
line() |
绘制直线、线段 |
eclipse() |
绘制椭圆形 |
rectangle() |
绘制矩形 |
polygon() |
绘制多边形 |
绘制矩形图的语法格式如下:
draw.rectangle(xy, fill=None, outline=None)
- xy:元组参数值,以图像的左上角为坐标原点,表示矩形图的位置、图形大小的坐标序列,形如
(x1, y1, x2, y2)
- fill:矩形图的背景填充色
- outline:矩形图的边框线条颜色
【例】使用rectangle()
绘制矩形图
# 创建Image对象,当做背景图
im = Image.new('RGB', (200, 200), color='gray')
# 创建ImageDraw对象
draw = ImageDraw.Draw(im)
# 以左上角为原点,绘制矩形。元组坐标序列表示矩形的位置、大小;fill设置填充色为红色,outline设置边框线为黑色
draw.rectangle((50, 100, 100, 150), fill=(255, 0, 0), outline=(0, 0, 0))
# 查看原图片
im.show()
10.2 ImageFont
PIL.ImagreFont模块通过加载不同格式的字体文件,从而在图像上绘制出不同类型的文字,比如TrueType和OpenType类型的字体。
创建字体对象的语法格式如下:
font = ImageFont.truetype(font='字体文件路径', size=字体大小)
如果想要在图片上添加文本,还需要使用ImageDraw的text()
方法,语法格式如下:
draw.text((x,y), "text", font, fill)
(x,y)
:表示添加文本的起始坐标位置(图像左上角为坐标原点)text
:字符串格式,要添加的文本内容font
:ImageFont对象fill
:文本填充颜色
【例1】在其他图像上添加文本
from PIL import Image, ImageFont, ImageDraw
#打开图片,返回 Image对象
img = Image.open("unavailable.png")
#创建画布对象
draw = ImageDraw.Draw(img)
#加载计算机本地字体文件
font = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', size=36)
#在原图像上添加文本
draw.text(xy=(80, 50),t ext='Testing', fill=(255, 0, 0), font=font)
img.show()
img.save("my_new_image.png")
【例2】为图片添加水印的函数
"""
添加水印(函数式编程)
"""
from PIL import Image, ImageFont, ImageDraw
font = ImageFont.truetype('C:/Windows/Fonts/msyh.ttc', size=30)
def creating_watermark(im, text, font=font):
#给水印添加透明度,因此需要转换图片的格式
img_rgba = im.convert('RGBA')
img_text_canvas = Image.new('RGBA', img_rgba.size, (255,255,255,0))
print(img_rgba.size[0])
draw = ImageDraw.Draw(img_text_canvas)
#设置文本文字大小
text_x_width, text_y_height = draw.textsize(text, font=font)
print(text_x_width, text_y_height)
text_xy = (img_rgba.size[0] - text_x_width, img_rgba.size[1] - text_y_height)
print(text_xy)
#设置文本颜色(绿色)和透明度(半透明)
draw.text(text_xy, text, font=font, fill=(255, 255, 255, 128))
#将原图片与文字复合
img_text = Image.alpha_composite(img_rgba, img_text_canvas)
return img_text
image = Image.open("unavailable.png")
image.show()
image_water = creating_watermark(image, '@Akira37')
image_water.show()
image_water.save("akiras_image.png")
11 Pillow图像和NumPy数组
ndarray是NumPy中的数组类型,该数组可以与Pillow的Image对象实现相互转化。
11.1 NumPy数组创建Image图像
使用Image.fromarray()
将NumPy数组转换为Image图像并返回
img = Image.fromarray(array)
【例】通过NumPy数组构建一个Image对象,并显示图像
from PIL import Image
import numpy as np
# 创建300*400的图像,3个颜色通道
array = np.zeros([300, 400, 3], dtype=np.uint8)
# rgb色彩模式
array[:, :200] = [255, 0, 0]
array[:, 200:] = [255, 255, 0]
img = Image.fromarray(array)
img.show()
11.2 Image图像转化为NumPy数组
使用np.array()
将Image图像转化为NumPy数组
np.array(img)`
【例】将第一张龙图以NumPy数组的形式进行输出
from PIL import Image
import numpy as np
img = Image.open("rina.png")
# Image图像转换为NumPy数组
arr = np.array(img)
print(arr)
# NumPy数组转换为Image图像
img_arr = Image.fromarray(arr)
img_arr.show()
[[[105 105 105]
[105 105 105]
[105 105 105]
...
[112 99 67]
[112 99 67]
[112 99 67]]
[[254 254 254]
[254 254 254]
[254 254 254]
...
[250 237 203]
[251 236 203]
[250 237 203]]
[[255 255 255]
[255 255 255]
[255 255 255]
...
[251 237 198]
[252 237 198]
[251 237 198]]
...
[[252 251 246]
[252 251 246]
[253 252 247]
...
[254 254 252]
[254 254 252]
[254 254 252]]
[[252 251 246]
[253 252 247]
[253 252 247]
...
[254 254 252]
[254 254 252]
[254 254 252]]
[[252 251 246]
[253 252 247]
[254 253 248]
...
[254 254 252]
[254 254 252]
[254 254 252]]]
Pillow还可用于生成GIF图(略)