⬆︎
×
TOC
CHAT

Pillow(PIL)图像处理库入门教程

Pillow是Python的一个强大图像处理库,是PIL(Python Imaging Library)的分支,旨在提供更简单、更便捷的图像处理功能。它支持多种图像格式,如JPEG、PNG、GIF等,并提供了丰富的操作工具,包括图像打开、创建、编辑、裁剪、缩放和滤镜应用等。Pillow还支持图像的绘制和文本添加,使得设计和图像生成变得更加灵活。通过Pillow,开发者能够轻松实现图像处理与操作,广泛应用于Web开发、数据可视化和机器学习等领域。

Image类是Pillow库中最为重要的类,该类被定义在和与其同名的Image模块中。

from PIL import Image

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

test red


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)

resized-img

【例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)

rina3

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

rina rgc

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

img_merge

【例2】将龙图与以下蝴蝶图进行合并

butterfly

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

multi-merge

5.3 混合图像:blend()

Image类也提供了blend()方法来混合RGBA模式的图片(PNG 格式)

img = Image.blend(image1, image2, alpha)
  • image1image2:两个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"))

img_crop

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

img_copypasta


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

transposed_image

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

rotated_image

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

transformed


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

contour


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

new_rgb

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提供了ImageDrawImageFont模块来实现添加水印。

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

ndarray

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图(略)

发表评论