python图像处理模块Pillow--Image模块
一、简介
pil:python imaging library,已经是python平台事实上的图像处理标准库了。pil功能非常强大,但api却非常简单易用
由于pil仅支持到python 2.7,加上年久失修,于是一群志愿者在pil的基础上创建了兼容的版本,名字叫pillow,支持最新python 3.x,又加入了许多新特性,因此,我们可以直接安装使用pillow
二、安装
使用 pip 命令安装pillow:
$ pip install pillow
三、 基本概念
1、通道
每张图片都是由一个或者多个数据通道构成,pil允许在单张图片中合成相同维数和深度的多个通道。
以rgb图像为例,每张图片都是由三个数据通道构成,分别为r、g和b通道。而对于灰度图像,则只有一个通道。
对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()是image模块的方法,它会返回一个字符串元组(tuple)。该元组将包括每一个通道的名称
方法getbands()的使用如下:
1 from pil import image 2 3 im = image.open(image_path) # image_path为图像的绝对路径
4 # 返回图像的通道 5 print(im.getbands(), type(im.getbands()))
输出:('r', 'g', 'b', 'a') <class 'tuple'>
2、模式
图像的模式定义了图像的类型和像素的位宽,当前支持如下模式:
1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。 l:8位像素,表示黑和白。 p:8位像素,使用调色板映射到其他模式。 rgb:3x8位像素,为真彩色。 rgba:4x8位像素,有透明通道的真彩色。 cmyk:4x8位像素,颜色分离。 ycbcr:3x8位像素,彩色视频格式。 i:32位整型像素。 f:32位浮点型像素。 pil也支持一些特殊的模式,包括rgbx(有padding的真彩色)和rgba(有自左乘alpha的真彩色)。
可以通过image对象的mode属性读取图像的模式。其返回值是包括上述模式的字符串
属性mode的使用如下:
1 from pil import image 2 3 im = image.open(image_path) 4 print(im.mode, type(im.mode))
输出:rgba <class 'str'>
3、尺寸
通过image对象的size属性可以获取图片的尺寸。图像大小,以像素为单位。大小是一个2元组(宽度、高度)(width, height)
属性size的使用如下:
1 from pil import image 2 3 im = image.open(image_path) 4 # 返回图像尺寸 5 print(im.size, type(im.size))
输出:(750, 1334) <class 'tuple'>
4、坐标系统
pil使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。
坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。
5、调色板
调色板模式 ("p")使用一个颜色调色板为每个像素定义具体的颜色值
6、信息
使用image对象的info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。
存储与图像相关的数据的字典。文件处理程序使用此字典传递从文件中读取的各种非图像信息
属性info的使用如下:
1 from pil import image 2 3 im = image.open(image_path) 4 # 返回图像信息 5 print(im.info, type(im.info))
输出:{} <class 'dict'>
7、滤波器
对于将多个输入像素映射为一个输出像素的几何操作,pil提供了4个不同的采样滤波器:
nearest:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。 bilinear:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:pil的当前版本,做下采样时该滤波器使用了固定输入模板。 bicubic:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:pil的当前版本,做下采样时该滤波器使用了固定输入模板。 antialias:平滑滤波。这是pil 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的pil版本中,这个滤波器只用于改变尺寸和缩略图方法。 注意:在当前的pil版本中,antialias滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。biliear和bicubic滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。
image模块中的方法resize()和thumbnail()用到了滤波器
方法resize()的使用如下:
语法:image.resize(size, resample=0)
参数:size-2元组:(宽度、高度),以像素为单位
resample-可选的重采样过滤器,如果省略,或者图像的模式为“1”或“p”,则将其设置为nearest
1 from pil import image 2 3 course_im = image.open(course_path) 4 print(course_im.size, type(course_im.size)) 5 course_resize = course_im.resize((538, 336)) # 返回此图像的大小调整后的副本 6 print(course_resize.size)
输出:
(750, 400)
(538, 336)
如果要使用其他滤波器可以通过下面的方法来实现:
from pil import image course_im = image.open(course_path) print(course_im.size, type(course_im.size)) course_resize = course_im.resize((538, 336), image.antialias) print(course_resize.size)
方法thumbnail()的使用如下:
语法:image.thumbnail(size, resample=1)
参数:size-2元组:(宽度、高度),以像素为单位
resample-可选的重采样过滤器,如果省略,则默认为pil.image.bicubic
把这个图像做成缩略图
请注意,pil当前版本中的bilinear和bicubic并不适合生成缩略图。你应该用antialias,除非速度比质量重要得多。
from pil import image im = image.open(avtar_path) avtar_im.thumbnail((98, 98)) # 返回none
四、image模块
image模块是pil中最重要的模块,它有一个类叫做image,与模块名称相同。image类有很多函数、方法及属性,接下来将依次对image类的属性、函数和方法进行介绍。
类函数
实例属性
实例方法
1、paste(im, box=none, mask=none) 将另一个图像粘贴到此图像中
参数:
box:要么是一个2元组给出左上角,一个4元组定义左、上、右、下像素坐标,或none(比如(0,0))
mask:可选的掩码图像
注意:如果模式不匹配,则将粘贴的图像转换为此图像的模式