PIL-python-imaging-library

越来越觉得PIL的重要性,决定认认真真地学上一两天,嗯~ o( ̄▽ ̄)o!

PIL

内容基本都是从文档上来的。
文档链接
下面这个网站对PIL的介绍很详细,想了解更多可以看这个。
PIL

使用Image类

从文件载入,或者句柄载入

1
2
import Image
im = Image.open("lena.ppm")
1
2
3
import Image
fp = open("lena.ppm","rb")
im = Image.open(fp)

查看一些对象属性

1
2
print im.format,im.size,im.mode
PPM (512,512) RGB

mode如果是L,代表灰度图像,RGB是彩色图像,CMYK是pre-press图像,这个图像是啥,我还不太清楚。

显示图像

1
im.show()

对图像进行读写

保存图像

1
im.save(outfile,format,options...)

format如果省略,则python自动按插件识别结果保存。如果没有安装扩展插件,需要明确保存格式。

保存为jpeg格式

1
2
3
4
5
6
7
8
9
10
11
import os,sys
import Image

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

上述代码将把命令行读入的所有指定文件保存为jpg格式,不能保存的抛出异常。

图像缩放

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys
import Image

size = 128,128

for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + ".thumbnail"
try:
im = Image.open(infile)
im.thumbnail(size)
im.save(outfile,"jpeg")
except:
print "cannot create thumbnail for",infile

截取,粘贴,融合图像

截取图像的一部分

使用crop方法从一张图片上截取子矩形

1
2
box = (100,100,400,400)
region = im.crop(box)

从左上角到右下角

旋转180,再贴回去

1
2
region = region.transpose(Image.ROTATE_180)
im.paste(region,box)

滚动图像(交换图像位置)

1
2
3
4
5
6
7
8
9
10
11
12
13
def roll(image,delta):

xsize,ysize = image.size

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

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

return image

分割RGB

1
2
r,g,b = im.split()
im = Image.merge("RGB",(b,g,r))

几何变换

简单变换

1
2
out = im.resize(128,128)
out = im.rotate(45) #逆时针旋转

变换图像

1
2
3
4
5
out = im.transpose(Image.FLIP_LEFT_RIGHT) #水平翻转
out = im.transpose(Image.FLIP_TOP_BOTTOM) #垂直翻转
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)

颜色变换(在不同mode下转换)

1
im = Image.open("lena.ppm").convert("L")

滤镜

1
2
import ImageFilter
out = im.filter(ImageFilter.DETAIL)

有很多滤镜的功能,在ImageFilter模块里,具体可以参考文档。
ImageFilter

点操作(提取不同通道像素)

读取每一帧

1
2
3
4
5
6
7
8
import Image

im = Image.open("animation.gif")
try:
im.seek(im.tell() + 1)
im.save(str(im.tell()) + ".jpg")
except EOFError:
pass