1. Introduction
PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。 PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL
,其功能和PIL差不多,但是支持python3。本文主要介绍PIL那些最常用的特性与用法,主要参考自:http://www.effbot.org/imagingbook。
2. What PIL can do?
PIL可以做很多和图像处理相关的事情:
- 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
- 图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
- 图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。
3. How to use PIL?
from PIL import Image Image.open("dog.jpg","r") <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=296x299 at 0x7F62BDB5B0F0> im = Image.open("dog.jpg","r") print(im.size,im.format,im.mode) (296, 299) JPEG RGB
Image.open
返回一个Image对象,该对象有size,format,mode
等属性,其中size
表示图像的宽度和高度(像素表示);format
表示图像的格式,常见的包括JPEG,PNG等格式;mode
表示图像的模式,定义了像素类型还有图像深度等,常见的有RGB,HSV等。一般来说'L'(luminance)表示灰度图像,'RGB'表示真彩图像,'CMYK'表示预先压缩的图像。一旦你得到了打开的Image对象之后,就可以使用其众多的方法对图像进行处理了,比如使用im.show()
可以展示上面得到的图像。
- save(filename,format)(保存指定格式的图像)
-
im.save("dog.png",'png')
上面的代码将图像重新保存成png格式
-
thumbnail(size,resample)(创建缩略图)
-
im.thumbnail((50,50),resample=Image.BICUBIC) im.show()
上面的代码可以创建一个指定大小(size)的缩略图,需要注意的是,thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有
Image.BICUBIC
,PIL.Image.LANCZOS
,PIL.Image.BILINEAR
,PIL.Image.NEAREST
这四种采样方法。默认是Image.BICUBIC
。- crop(box)(裁剪矩形区域)
-
im = Image.open("dog.jpg","r") box = (100,100,200,200) region = im.crop(box) region.show() im.crop()
上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来。box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。crop()返回的仍然是一个Image对象。
- transpose(method)(图像翻转或者旋转)
-
im_rotate_180 = im.transpose(Image.ROTATE_180) im_rotate_180.show()
上面的代码将im逆时针旋转180°,然后显示出来,
method
是transpose的参数,表示选择什么样的翻转或者旋转方式,可以选择的值有:
- Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
- Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
- Image.ROTATE_90,表示将图像逆时针旋转90°
- Image.ROTATE_180,表示将图像逆时针旋转180°
- Image.ROTATE_270,表示将图像逆时针旋转270°
- Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
- Image.TRANSVERSE,表示将图像进行转置,再水平翻转- paste(region,box,mask)(将一个图像粘贴到另一个图像)
-
im.paste(region,(100,100),None) im.show()
上面的代码将region图像粘贴到左上角为(100,100)的位置。region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被convert成和region一样的size。
- split()(颜色通道分离)
-
r,g,b = im.split() r.show() g.show() b.show()
split()方法可以原来图像的各个通道分离,比如对于RGB图像,可以将其R,G,B三个颜色通道分离。
-
merge(mode,channels)(颜色通道合并)
-
im_merge = Image.merge("RGB",[b,r,g]) im_merge.show()