Pillow 一文读懂

Pillow 简介、特点和安装

Pillow 简介

Pillow作为python的第三方图像处理库,提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

PIL(Python Image Library)是python的第三方图像处理库,因其强大的功能与众多的使用人数,但由于PIL仅支持到Python 2.7,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。

Pillow 特点

1) 支持广泛的文件格式

Pillow 支持广泛的图像格式,比如 "jpeg","png","bmp","gif","ppm","tiff" 等。同时,它也支持图像格式之间的相互转换。总之, Pillow 几乎能够处理任何格式的图像。

2) 提供了丰富的功能

Pillow 提供了丰富的图像处理功能,可概括为两个方面:

  • 图像归档
  • 图像处理

图像归档,包括创建缩略图、生成预览图像、图像批量处理等;而图像处理,则包括调整图像大小、裁剪图像、像素点处理、添加滤镜、图像颜色处理等。

3) 配合GUI工具使用

Pillow 库可以配合 Python GUI(图形用户界面)工具 Tkinter 一起使用。

除上述特点之外,Pillow 库还能实现一些较为复杂的图像处理操作,比如给图像添加水印、合成 GIF 动态效果图等等。

Pillow 安装

在命令行下通过pip安装:

复制代码
pip install pillow

Pillow 使用指南

pillow 官方文档地址:https://pillow.readthedocs.io/en/stable/handbook/tutorial.html#using-the-image-class

Pillow 基本操作

1.使用Image模块中的open函数打开一张图片

复制代码
from PIL import Image

# 第一章节:Pilow 基础功能:读取/属性值/显示
# 加载图片
im = Image.open("img/1.png")

如果成功,这个函数返回Image对象。您现在可以使用实例属性来检查文件内容:

复制代码
# 图片属性
print(im.format, im.size, im.mode)

# format = 图片格式类型
# siz = 图片长*宽
# mode = 显示模式 RGB模式、CMYK模式、HSB模式、Lab模式、位图模式、灰度模式、索引颜色模式、双色调模式和多通道模式

如果文件不能打开,则抛出IOError异常。

2.图像显示

存在Image对象时,就可以利用它来处理操作图像,例如,加载一张图像。

复制代码
# 图片显示
im.show()

3.保存指定格式的图像

复制代码
im.save("img/2.png")

Pillow 图像读取和写入/图片转换

复制代码
from PIL import Image

# 第二章节:Pilow 基础功能:图像格式转换
try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 保存为PNG格式,如果格式不一致会提示异常。
        im.save("img/2.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

图片格式之间的转换主要方法

save():

save() 方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片。

save() 的语法格式如下:

复制代码
Image.save(fp, format=None)

参数说明如下:

  • fp:图片的存储路径,包含图片的名称,字符串格式;
  • format:可选参数,可以指定图片的格式。

Pillow 图像缩略图

缩略图(thumbnail image)指的是将原图缩小至一个指定大小(size)的图像。通过创建缩略图可以使图像更易于展示和浏览。

Image 对象提供了一个 thumbnail() 方法用来生图像的缩略图,该函数的语法格式如下:

复制代码
thumbnail(size,resample)
  • size:元组参数,指的是缩小后的图像大小;

  • resample:可选参数,指图像重采样滤波器,有四种过滤方式,分别是 Image.BICUBIC(双立方插值法)、PIL.Image.NEAREST(最近邻插值法)、PIL.Image.BILINEAR(双线性插值法)、PIL.Image.LANCZOS(下采样过滤插值法),默认为 Image.BICUBIC。

    from PIL import Image

    第三章节:Pilow 基础功能:图像缩略图

    try:
    # 打开图片
    with Image.open('img/1.png') as im:
    # 设定缩放的大小
    size = (128, 128)
    # 使用Pillow创建缩略图
    im.thumbnail(size)
    # 保存为PNG格式,如果格式不一致会提示异常。
    im.save('img/3.png')
    except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 图像剪裁、粘贴和合并

Pillow 图像剪裁

Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪,函数的语法格式如下:

复制代码
crop(box=None)

box:表示裁剪区域,默认为 None,表示拷贝原图像。

注意:box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位。

复制代码
from PIL import Image
# 第四章节:Pilow 基础功能:图像截取
try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 设定截取区域
        box = (100, 100, 400, 400)
        # 图像截取
        region = im.crop(box)
        # 保存为PNG格式,如果格式不一致会提示异常。
        region.save('img/4.png')
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 图像粘贴

拷贝、粘贴操作几乎是成对出现的,Image 类提供了 copy() 和 paste() 方法来实现图像的复制和粘贴。其中复制操作(即 copy() 方法)比较简单,下面主要介绍 paste() 粘贴方法,语法格式如下所示:

复制代码
paste(image, box=None, mask=None)

该函数的作用是将一张图片粘贴至另一张图片中。注意,粘贴后的图片模式将自动保持一致,不需要进行额外的转换。参数说明如下:

  • image:指被粘贴的图片;

  • box:指定图片被粘贴的位置或者区域,其参数值是长度为 2 或者 4 的元组序列,长度为 2 时,表示具体的某一点 (x,y);长度为 4 则表示图片粘贴的区域,此时区域的大小必须要和被粘贴的图像大小保持一致。

  • mask:可选参数,为图片添加蒙版效果。

    from PIL import Image

    第五章节:Pilow 基础功能:图像粘贴

    try:
    # 打开图片
    with Image.open('img/1.png') as im:
    # 设定截取区域
    box = (100, 100, 200, 200)
    # 图像截取
    region = im.crop(box)
    # 图像粘贴
    im.paste(region, box)
    # 保存为PNG格式,如果格式不一致会提示异常。
    im.save('img/5.png')
    except OSError as e:
    # 打印错误日志记录
    print(e)

通过图像粘贴实现图像合并

复制代码
from PIL import Image
# 第七章节:Pilow 基础功能:图像合并


def merge(im1, im2):
    w = im1.size[0] + im2.size[0]
    h = max(im1.size[1], im2.size[1])
    im = Image.new("RGBA", (w, h))

    im.paste(im1)
    im.paste(im2, (im1.size[0], 0))

    return im


try:
    # 合并图片
    mergeImg = merge(Image.open('img/1.png'),Image.open('img/2.png'))
    # 图片保存
    mergeImg.save("img/7.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

通过图像粘贴实现图像滚动

复制代码
from PIL import Image
# 第六章节:Pilow 基础功能:图像滚动


def roll(img, delta):
    """Roll an image sideways."""
    xsize, ysize = img.size

    delta = delta % xsize
    if delta == 0:
        return im

    part1 = img.crop((0, 0, delta, ysize))
    part2 = img.crop((delta, 0, xsize, ysize))
    img.paste(part1, (xsize - delta, 0, xsize, ysize))
    img.paste(part2, (0, 0, xsize - delta, ysize))

    return img


try:
    # 打开图片
    with Image.open('img/1.png') as im:
        # 图像滚动方法
        rollImg = roll(im, 100)
        # 保存为PNG格式,如果格式不一致会提示异常。
        rollImg.save('img/6.png')
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 图像合并

Image 类提供了用于分离图像和合并图像的方法 split() 和 merge() 方法,通常情况下,这两个方法会一起使用。

merge()

Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像。

merge() 方法的语法格式如下:

复制代码
Image.merge(mode, bands)

参数说明如下:

  • mode:指定输出图片的模式
  • bands:参数类型为元组或者列表序列,其元素值是组成图像的颜色通道,比如 RGB 分别代表三种颜色通道,可以表示为 (r,g,b)。

温馨注意,该函数会返回一个新的 Image 对象。

复制代码
from PIL import Image
im=Image.open("img/1.png")
#修改图像大小,以适应图像处理
image=im.resize((450,400))
image.save("img/1-1.png")
#分离颜色通道,产生三个 Image对象
r,g,b = image.split()
#重新组合颜色通道,返回先的Image对象
image_merge=Image.merge('RGB',(b,g,r))
image_merge.show()
#保存图像至桌面
image_merge.save("img/1-2.png")

Pillow 几何变换

图像的几何变换主要包括图像翻转、图像旋转和图像变换操作,Image 类提供了处理这些操作的函数 transpose()、rotate() 和 transform(),下面分别对它们进行讲解。

transpose()翻转操作

该函数可以实现图像的垂直、水平翻转,语法格式如下:

复制代码
Image.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:图像横向翻转。

复制代码
from PIL import Image
# 第九章节:Pilow 几何变换:转换

try:
    # 打开图片
    with Image.open('img/1.png') as im:
        out = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
        out.save("img/9-1.png")
        out = im.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
        out.save("img/9-2.png")
        out = im.transpose(Image.Transpose.ROTATE_90)
        out.save("img/9-3.png")
        out = im.transpose(Image.Transpose.ROTATE_180)
        out.save("img/9-4.png")
        out = im.transpose(Image.Transpose.ROTATE_270)
        out.save("img/9-5.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

rotate()任意角度旋转

当我们想把图像旋转任意角度时,可以使用 rotate() 函数,语法格式如下:

复制代码
Image.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:可选参数,填充颜色,图像旋转后,对图像之外的区域进行填充。

    from PIL import Image

    第八章节:Pilow 几何变换:基础

    try:
    # 打开图片
    with Image.open('img/1.png') as im:
    # 图像设置大小
    out = im.resize((145, 145))
    out.save('img/8.png')
    # 图像旋转角度
    rotateImg = im.rotate(45)
    # 保存为PNG格式,如果格式不一致会提示异常。
    rotateImg.save('img/8-1.png')
    except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 相等调整大小

复制代码
PIL.ImageOps.contain(image, size, method=Image.Resampling.BICUBIC):

返回图像的调整大小版本,设置为最大宽度和高度,在要求的尺寸内,同时保持原始的纵横比。

参数说明:

  • image -- 要调整大小和裁剪的图像

  • size -- 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。

  • method - 默认使用Image.Resampling.BICUBIC,详见过滤器

    PIL.ImageOps.cover(image, size, method=Image.Resampling.BICUBIC)

返回图像的调整大小版本,同时保持原始的纵横比。

参数说明:

  • image -- 要调整大小和裁剪的图像

  • size -- 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。

  • method - 默认使用Image.Resampling.BICUBIC,详见过滤器

    PIL.ImageOps.fit(image, size, method=Image.Resampling.BICUBIC, bleed=0.0, centering=(0.5, 0.5)):

返回图像的调整大小和裁剪版本,裁剪为要求的长宽比和尺寸。

参数说明:

  • image -- 要调整大小和裁剪的图像
  • size -- 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。
  • method - 默认使用Image.Resampling.BICUBIC,详见过滤器
复制代码
bleed-图像移除四周边框,该数值为百分比,默认值为0
复制代码
centering-控制裁剪位置。 使用 (0.5, 0.5) 表示中心裁剪
复制代码
PIL.ImageOps.pad(image, size, method=3, color=None, centering=0.5, 0.5)​

返回图像的大小和填充版本,展开以填充请求的纵横比和大小。

参数说明:

  • image -- 要调整大小和裁剪的图像。

  • size -- 请求的输出大小(以像素为单位),以(宽度、高度)元组的形式给出。

  • method -- 使用什么样的重采样方法。默认是 PIL.Image.BICUBIC . 见过滤器 :

  • color -- 填充图像的背景色。

  • centering -- 控制原始图像在填充版本中的位置。(0.5,0.5)将使图像居中(0,0)将使图像与左上角对齐(1,1)将使图像与右下角对齐

    from PIL import Image, ImageOps

    第十章节:Pilow 几何变换:相对调整

    try:
    # 打开图片
    size = (100, 150)
    with Image.open('img/1.png') as im:
    ImageOps.contain(im, size).save("imageops_contain.png")
    ImageOps.cover(im, size).save("imageops_cover.png")
    ImageOps.fit(im, size).save("imageops_fit.png")
    ImageOps.pad(im, size, color="#f00").save("imageops_pad.png")

    复制代码
          # thumbnail() can also be used,
          # but will modify the image object in place
          im.thumbnail(size)
          im.save("imageops_thumbnail.png")

    except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 颜色模式转换

复制代码
convert(mode,matrix,dither,palette,colors)

convert方法可以改变图像的模式(mode),一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。

复制代码
from PIL import Image, ImageOps

# 第十一章节:Pilow 转换:通道转换

try:
    with Image.open('img/1.png') as im:
        print(im.format)
        imgConvert = im.convert("L")
        imgConvert.save("img/11.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow图像过滤器 filter

filter方法可以将一些过滤器操作应用于原始图像,比如模糊,边缘增强、浮雕等。filter是过滤器函数,在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(普通模糊),GaussianBlur(高斯模糊) FIND_EDGES(查找边)等。

Pillow 通过 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() 模式滤波
[图像降噪滤波器]
复制代码
from PIL import Image, ImageFilter

# 第十二章节:Pilow 增强:滤波器

try:
    with Image.open('img/1.png') as im:
        out = im.filter(ImageFilter.DETAIL)
        out.save("img/12.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

from PIL import Image, ImageFilter
im = Image.open('cat.jpg')

# 高斯模糊

im_gaussianblur = im.filter(ImageFilter.GaussianBlur)

im_gaussianblur.show()

# 普通模糊

im_blur = im.filter(ImageFilter.BLUR)

im_blur.show()

# 找到边缘

im_find_edge = im.filter(ImageFilter.FIND_EDGES)

im_find_edges.show()

# 浮雕

im_emboss = im.filter(ImageFilter.EMBOSS)

im_emboss.show()

# 轮廓

im_contour = im.filter(ImageFilter.CONTOUR)

im_contour.show()

# 锐化

im_sharpen = im.filter(ImageFilter.SHARPEN)

im_sharpen.show()

# 平滑

im_smooth = im.filter(ImageFilter.SMOOTH)

im_smooth.show()

# 细节

im_detail = im.filter(ImageFilter.DETAIL)

im_detail.show()

Pillow 画笔操作

point()方法可用于转换图像的像素值。point()方法接受函数方法对象用户放大/缩放像素值。

复制代码
from PIL import Image

# 第十三章节:Pilow 增强:画笔
try:
    with Image.open('img/1.png') as im:
        # 每个像素点扩大 1.2倍
        out = im.point(lambda i: i * 1.2)
        out.save("img/13.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 各个波段操作

复制代码
from PIL import Image

# 第十四章节:Pilow 增强:通道加强
try:
    with Image.open('img/1.png') as im:
        # 图像通道分离
        source = im.split()
        # 通道下标
        R, G, B = 0, 1, 2
        # select regions where red is less than 100
        mask = source[R].point(lambda i: i < 100 and 255)

        # process the green band
        out = source[G].point(lambda i: i * 0.7)

        # paste the processed band back, but only where red was < 100
        source[G].paste(out, None, mask)

        # build a new multiband image
        im = Image.merge(im.mode, source)

        im.save("img/14.png")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 强化

图像增强也是图像预处理中的一个基本技术,Pillow中的图像增强函数主要在ImageEnhance模块下,通过该模块可以调节图像的白平衡(Color)、亮度(Brightness)、对比度(Contrast)和锐化(Sharpness)等。

复制代码
from PIL import Image, ImageEnhance

# 第十五章节:Pilow 高级增强:对比度、亮度、色彩平衡和锐度
try:
    with Image.open('img/1.png') as im:
        enh = ImageEnhance.Contrast(im)
        enh.enhance(1.5).show("30% more contrast")
except OSError as e:
    # 打印错误日志记录
    print(e)

Pillow 动态图

Pillow支持一些动态图片的格式如FLI/FLC,GIF和其他一些处于实验阶段的格式。TIFF文件同样可以包含数帧图像。

当读取动态图时,PIL自动读取动态图的第一帧,可以使用seek和tell方法读取不同帧。

复制代码
from PIL import Image

with Image.open("animation.gif") as im:
    im.seek(1)  # skip to the second frame

    try:
        while 1:
            im.seek(im.tell() + 1)
            # do something to im
    except EOFError:
        pass  # end of sequence

温馨提示:当读取到最后一帧时,Pillow抛出EOFError异常。 解决办法:通过动态图迭代器

动态图迭代器类

复制代码
# _*_ coding : UTF-8_*_
# 开发者 : zhuozhiwengang
# 开发时间 : 2024/3/20 0:20
# 文件名称 : pillowDemo16
# 开发工具 : PyCharm
from PIL import Image, ImageEnhance, ImageSequence

# 第十六章节:Pilow 图像序列
im = Image.open("img/1.gif")

# 使用ImageSequence迭代器访问每一帧
for frame in (ImageSequence.Iterator, im):
    print(frame)

class ImageSequence:
    def __init__(self, im):
        self.im = im
    def __getitem__(self, ix):
        try:
            if ix:
                self.im.seek(ix)
            return self.im
        except EOFError:
            raise IndexError # end of sequence
 
for frame in ImageSequence(im):
    # ...do something to frame...

Pillow 图片添加水印

ImageDraw

PIL.ImageDraw 模块提供了一系列的绘图方法,通过该模块可以创建一个新的图形,或者在现有的图像上再绘制一个图形,从而起到对原图注释和修饰的作用。

下面创建一个 ImageDraw 对象,并对该对象的使用方法做简单介绍:

复制代码
draw = ImageDraw.Draw(im)

上述方法会返回一个 ImageDraw 对象,参数 im 表示 Image 对象。这里我们可以把 Image 对象理解成画布,通过调用 ImageDraw 对象的一些方法,实现了在画布上绘制出新的图形目的。ImageDraw 对象的常用方法如下表所示:

方法 说明
text 在图像上绘制文字
line 绘制直线、线段
eclipse 绘制椭圆形
rectangle 绘制矩形
polygon 绘制多边形
[ImageDraw常用方法]
复制代码
# 第十七章节:Pilow 图像绘制
from PIL import Image, ImageDraw

# 创建 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()
# 保存图片
im.save('img/17.png')

ImageFont

PIL.ImagreFont 模块通过加载不同格式的字体文件,从而在图像上绘制出不同类型的文字,比如 TrueType 和 OpenType 类型的字体。

创建字体对象的语法格式如下:

复制代码
font = ImageFont.truetype(font='字体文件路径', size=字体大小)

如果想要在图片上添加文本,还需要使用 ImageDraw.text() 方法,语法格式如下:

复制代码
d.text((x,y), "text", font, fill)

参数说明如下:

  • (x,y):图像左上角为坐标原点,(x,y) 表示添加文本的起始坐标位置;

  • text:字符串格式,要添加的文本内容;

  • font:ImageFont 对象;

  • fill:文本填充颜色。

    第十八章节:Pilow 图像绘制

    from PIL import Image, ImageDraw, ImageFont

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

    加载计算机本地字体文件

    font = ImageFont.truetype('C:\Windows\Fonts\STHUPO.TTF', size=36)

    在原图像上添加文本

    draw.text(xy=(80, 50), text='字体文本', fill=(255, 0, 0), font=font)

    查看原图片

    im.show()

    保存图片

    im.save('img/17.png')

Pillow和ndarray数组

NumPy 是 Python 科学计算的基础数据包,它被大量的应用于机器学习领域,比如图像识别、自然语言处理、数据挖掘等。

ndarray 是 NumPy 中的数组类型,也称为 ndarray 数组,该数组可以与 Pillow 的 PIL.Image 对象实现相互转化。

ndarray数组创建图像

下面通过 ndarray 数组构建一个 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数组

下面将图像以 ndarray 数组的形式进行输出,示例如下:

复制代码
from PIL import Image
import numpy as np
img = Image.open("img/1.png")
img.show()
# Image图像转换为ndarray数组
img_2 = np.array(img)
print(img_2)
# ndarray转换为Image图像
arr_img = Image.fromarray(img_2)
# 显示图片
arr_img.show()

Pillow 读取图像资源总结

  • 基本模式

    from PIL import Image
    with Image.open("图片相对/绝对路径地址") as im:

  • 读取来源于open图像资源

    from PIL import Image

    with open("图像相对/绝对路径地址", "rb") as fp:
    im = Image.open(fp)

  • 读取二进制图像资源

    from PIL import Image
    import io

    im = Image.open(io.BytesIO(buffer))

  • 读取基于图像URL地址

    from PIL import Image
    from urllib.request import urlopen
    url = "https://python-pillow.org/assets/images/pillow-logo.png" # 图片URL地址
    img = Image.open(urlopen(url))

  • 读取压缩文件

    from PIL import Image, TarIO

    fp = TarIO.TarIO("压缩包相对/绝对路径地址", "解压图像资源名称")
    im = Image.open(fp)

Pillow批量处理

复制代码
import glob
from PIL import Image


def compress_image(source_path, dest_path):
    with Image.open(source_path) as img:
        if img.mode != "RGB":
            img = img.convert("RGB")
        img.save(dest_path, "JPEG", optimize=True, quality=80)


paths = glob.glob("*.png")
for path in paths:
    compress_image(path, path[:-4] + ".jpg")
相关推荐
万粉变现经纪人3 天前
如何解决 pip install pillow-simd 报错 需要 AVX2/特定编译器 支持 问题
python·scrapy·beautifulsoup·aigc·pandas·pillow·pip
MoRanzhi120310 天前
Pillow 图像分割、切片与拼接处理
图像处理·人工智能·python·计算机视觉·pillow·图像拼接·网格分块
MoRanzhi120310 天前
pillow 图像合成、透明叠加与蒙版处理
python·计算机视觉·pillow·图片处理·图像合成·透明叠加·多图层叠加
MoRanzhi120311 天前
Pillow 图像算术运算与通道计算
图像处理·人工智能·python·计算机视觉·pillow·图像差异检测·图像算术运算
MoRanzhi120311 天前
Pillow 灰度化、二值化与阈值处理
图像处理·python·pillow·二值化·图像预处理·阈值处理·灰度化
MoRanzhi120311 天前
Pillow 图像颜色模式与颜色空间转换
图像处理·python·数学建模·pillow·颜色空间转换·颜色模式·图像通道
MoRanzhi120312 天前
Pillow 图像滤波、卷积与边缘处理
图像处理·python·计算机视觉·pillow·卷积·边缘检测·图像滤波
代码小书生1 个月前
pillow,一个实用的 Python 库!
开发语言·python·pillow
开源技术2 个月前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow