错位的梦寐

Python PIL 简明教程 - 基本用法

2020-05-15


PIL (Python Image Library) 是 Python 平台处理图片的事实标准,兼具强大的功能和简洁的 API

新建一个 Image 类的实例

PIL 的主要功能定义在 Image 类当中,而 Image 类定义在同名的 Image 模块当中。使用 PIL 的功能,一般都是从新建一个 Image 类的实例开始。新建 Image 类的实例有多种方法。你可以用 Image 模块的 open() 函数打开已有的图片档案,也可以处理其它的实例,或者从零开始构建一个实例。

from PIL import Image
sourceFileName = "source.png"
img         = Image.open(sourceFileName)

上述代码引入了 Image 模块,并以 open() 方法打开了 source.png 这个图像,构建了名为 avatar 的实例。如果打开失败,则会抛出 IOError 异常。

接下来你可以使用 show() 方法来查看实例。注意,PIL 会将实例暂存为一个临时文件,而后打开它。

img.show()

查看实例的属性

Image 类的实例有 5 个属性,分别是:

  • format: 以 string 返回图片档案的格式(JPG, PNG, BMP, None, etc.);如果不是从打开文件得到的实例,则返回 None
  • mode: 以 string 返回图片的模式(RGB, CMYK, etc.);完整的列表参见 官方说明·图片模式列表
  • size: 以二元 tuple 返回图片档案的尺寸 (width, height)
  • palette: 仅当 modeP 时有效,返回 ImagePalette 示例
  • info: 以字典形式返回示例的信息
print(avatar.format, avatar.size, avatar.mode)
# JPEG (400, 400) RGB

看到返回了图片的格式 JPEG、图片的大小 (400, 400) 和图片的模式 RGB

转换 Image 格式为 numpy 数组 array 格式

转换 Image 格式为 numpy 数组 array 格式,进行图像处理 上面读出的 img 还是Image格式,不能对其直接处理,需要对其转换为array格式 这里需要注意的是未转换格式之前 img.size为(width,height),转换之后img.shape 为(height,width,3)

img = np.array(img, dtype = np.uint8)

实例的方法

Image 类定义了许多方法,这里无法一一列出(也无必要)。如果有需要,可以参看 官方说明·Image 模块

图片 IO - 转换图片格式

Image 模块提供了 open() 函数打开图片档案,Image 类则提供了 save() 方法将图片实例保存为图片档案。

save() 函数可以以特定的图片格式保存图片档案。比如 save('target.jpg', 'JPG') 将会以 JPG 格式将图片示例保存为 target.jpg。不过,大多数时候也可以省略图片格式。此时,save() 方法会根据文件扩展名来选择相应的图片格式。

import os, sys
from PIL import Image

for infile in sys.argv[1:]:
    f, e = os.path.splitext(infile)
    outfile = f + ".jpg"
    if infile != outfile:
        try:
            Image.open(infile).save(outfile)
        except IOError:
            print "cannot convert", infile

这里,f 是除去扩展名之外的文件名。在 try 语句中,我们尝试打开图片档案,然后以 .jpg 为扩展名保存图片档案。save() 方法会根据扩展名,将图片以 JPG 格式保存为档案。如果图片档案无法打开,则在终端上打印无法转换的消息。

制作缩略图

Image 类的 thumbnail() 方法可以用来制作缩略图。它接受一个二元数组作为缩略图的尺寸,然后将示例缩小到指定尺寸。

import os, sys
from PIL import Image

for infile in sys.argv[1:]:
    outfile = os.path.splitext(infile)[0] + ".thumbnail"
    if infile != outfile:
        try:
            im   = Image.open(infile)
            x, y = im.size
            im.thumbnail((x//2, y//2))
            im.save(outfile, "JPEG")
        except IOError:
            print "cannot create thumbnail for", infile

这里我们用 im.size 获取原图档的尺寸,然后以 thumbnail() 制作缩略图,大小则是原先图档的四分之一。同样,如果图档无法打开,则在终端上打印无法执行的提示。

缩放图像

img = Image.open(os.path.join('images', '000906' + '.jpg'))

img_resized = img.resize((width,height)) #和读入图像的格式相同,也是先width后height

#如果想改变插值算法,可以如下(默认为NEAREST)

im_resized = im.resize((width,height), Image.BILINEAR)

  • NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
  • BILINEAR:双线性滤波。在输入图像的 2x2 矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
  • BICUBIC:双立方滤波。在输入图像的 4x4 矩阵上进行立方插值。注意:PIL 的当前版本,做下采样时该滤波器使用了固定输入模板。

  • ANTIALIAS:平滑滤波。这是 PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的 PIL 版本中,这个滤波器只用于改变尺寸和缩略图方法。

转化为灰度图

gray=img.convert('L')

使用函数 convert() 来进行转换,它是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式,mode 的取值可以是如下几种:

  • 1 (1-bit pixels, black and white, stored with one pixel per byte)
  • L (8-bit pixels, black and white)
  • P (8-bit pixels, mapped to any other mode using a colour palette)
  • RGB (3x8-bit pixels, true colour)
  • RGBA (4x8-bit pixels, true colour with transparency mask)
  • CMYK (4x8-bit pixels, colour separation)
  • YCbCr (3x8-bit pixels, colour video format)
  • I (32-bit signed integer pixels)
  • F (32-bit floating point pixels)

将灰度图转换为array格式,此时大小为 (height,width), 如果是彩色图像,为 (height,width,3)

gray = np.array(img, dtype = np.uint8)

参考

  1. PIL 简明教程 - 基本用法
  2. Python-PIL 图像处理基本操作

Comments

Content