Python图像处理库:PIL中Image,ImageDraw等基本模块介绍

常用操作


合成 Image.blend(i1,i2,a)/Image.composite(i1,i2,mask)

缩略图 thumbnail(size,filter=None)  
Modifies in-place,Preserves aspect ratio
>>> myImage.thumbnail ((128, 128), Image.ANTIALIAS)
剪切 crop(bbox)

>>> bounds = (100, 100, 400, 400)
>>> cutoutIm = myImage.crop (bounds)
粘贴 paste(i2,where,mask=None)/paste(color,box=None,mask=None)

旋转 rotate(theta)
rotated around its center

翻转旋转 transpose(method)
ROTATE_90/180/270(clockwise), FLIP_TOP_BOTTOM(horizontal), FLIP_RIGHT_LEFT(vertical)
>>> fixedIm = myImage.transpose (ROTATE_90)

 

The Image Module


The Image module provides

  • a class with the same name which is used to represent a PIL p_w_picpath.

  • The module also provides a number of factory functions(including functions to load p_w_picpaths from files, and to create new p_w_picpaths)

图像对象 Image – from file or newly created

所有的图片操作必须有一个操作对象,例如Pil提供open(filename)进行这个过程,此后,一切关于图片的操作均基于这个对象。有以下几种创建p_w_picpath对象的方式:

1 Image.open(f)

>>> import Image
>>>
>>> Im = Image.open("lena.jpg")
>>> print Im.mode,Im.size,Im.format
RGB (256, 256) JPEG
>>> Im.show()

lena

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

可以查看p_w_picpath对象的format,mode,size,palette,info几个属性。

调用im.show()会在图片查看工具中显示当前操作的p_w_picpath对象。

标准版本的show方法的实现不太高效,因为它先把p_w_picpath保存到一个临时文件,然后调用xy工具来显示图像。如果你没有安装xy,那么它就无法工作了。不过如果它可以工作,倒还是非常方便用来debug和测试。

2 Image.new(mode,size,color=None)

color的默认值是黑色,这里我们新建一个红色的图像。

>>> newIm = Image.new (“RGBA”, (640, 480), (255, 0, 0)) #新建一个p_w_picpath对象creating p_w_picpaths from scratch

3 Image.blend(i1,i2,a)  -- (p1 x (1 - a) + p2 x a)

选一张灰度图(L)做背景,和雷娜图(RGB)做blend操作

background1

>>> Im2 = Image.open("background.jpg").convert(Im.mode)
>>> Im2 = Im2.resize(Im.size)
>>> Im2.show()
>>>
>>> img = Image.blend(Im,Im2,0.2)
>>> img.show()

 tmpmprtrp

操作完毕后save(filename)用以保存这个临时的p_w_picpath对象img到硬盘。

4 Image.composite(i1,i2,mask)   --equal-sized p_w_picpaths i1 ,i2 and mask("1", "L", or "RGBA") (p1 x (1 - m) + p2 x m)

5 Image.eval(f,i)  -- applying a function f to each pixel of p_w_picpath i

6 Image.merge(mode,bandList)  --Creates a multi-band p_w_picpath from a sequence of single-band p_w_picpaths of equal size

以下是Image对象的全部方法:

save(f,format=None)保存如果f是一个file对象,必须指定format(format codes)
convert(mode)转换mode
copy()

crop(bbox)剪切原图中bbox区域
filter(name)滤镜the name of predefined p_w_picpath enhancement filters
滤镜名字需要import ImageFilter
getbands()通道的字符串序列如RGB图返回('R', 'G', 'B')
getbbox()包含非零区域的最小bbox
getextrema()最大最小像素点值min&max pixel value
单通道图:返回元组(min,max)
多通道图:返回各个通道的元组组成的元组
getpixel(xy)取像素点值坐标xy处的pixel value or a sequence of pixel values
histogram(mask=None)

统计直方图

单通道图:返回列表[c0, c1, ...],ci是值为i的像素数

多通道图:a single sequence that is the concatenation of the sequences for all bands

mask参数:a same-sized mask p_w_picpath of mode "1" or "L"(include only those pixels correspond to nonzero pixels in the mask argument)

offset(dx,dy=None)

平移

Returns a new p_w_picpath the same size as the original, but with all pixels rotated dx in the +x direction,and dy in the +y direction.

If dy is omitted, it defaults to the same value as dx.

paste(i2,where,mask=None)粘贴图片where参数可以是
1 (x,y)坐标对:i2的像素点(0,0)对齐原图中的(x,y)粘贴,i2超过原图边界的部分被抛弃
2 bbox:i2必须和该bounding box大小一致
3 None:i2必须和原图大小一致
如果i2的mode和原图不一致,粘贴前会被转换。
mask参数:a same-sized mask p_w_picpath of mode "1","L" or “RGBA ”(control which pixels get replaced)
paste(color,box=None,mask=None)填充颜色如果box省略,整个图被填充为color色;mask参数同上
point(function)改变像素点(函数)Returns a new p_w_picpath with each pixel modified.
point(table)改变像素点(查表)To translate pixels using a table(a sequence of 256n values, where n is the number of bands in the p_w_picpath) lookup
putalpha(band)

改变alpha通道

The pixels of the band p_w_picpath(same-sized,"L" or "1") replace the alpha band(A) of the original p_w_picpath(RGBA) in place.

putpixel(xy, color)改变单个像素点颜色Note that this method is relatively slow. For more extensive changes, use paste or theImageDraw module instead.
resize(size,filter=None)调整大小
rotate(theta)

旋转(围绕图片中心)

 

Any pixels that are not covered by rotation of the original p_w_picpath are set to black.

show()

显示图片

On Unix systems, this method runs the xv p_w_picpath viewer to display the p_w_picpath. 
On Windows boxes,the p_w_picpath is saved in BMP format and can be viewed using Paint. 
This can be useful for debugging.

split()

分离通道

返回各个通道的灰度图组成的元组
Returns a tuple containing each band of the original p_w_picpath as an p_w_picpath of mode "L". 
For example, applying this method to an "RGB" p_w_picpath produces a tuple of three p_w_picpaths, one each for the red, green, and blue bands.

thumbnail(size,filter=None)缩略图Modifies in-place,Preserves aspect ratio
transform(xs, ys, Image.EXTENT, (x0,y0,x1,y1))

Returns a transformed copy of the p_w_picpath. In the transformed p_w_picpath, the point originally at (x0,y0) will appear at (0,0), and point (x1,y1) will appear at (xs, ys).

transform(xs, ys, Image.AFFINE, (a,b,c,d,e,f))affine变换

The values a through f are the first two rows of an affine transform matrix.
Each pixel at (x,y) in the resulting p_w_picpath comes from position (ax+by+c,dx+ey+f) in the input
p_w_picpath, rounded to the nearest pixel.

transpose(method)翻转旋转ROTATE_90/180/270(clockwise), FLIP_TOP_BOTTOM(horizontal), FLIP_RIGHT_LEFT(vertical)

 

The ImageDraw Module


支持2D图像 The ImageDraw module provide basic 2D graphics support for Image objects.
It can for example be used to

  • create new p_w_picpaths,

  • annotate or retouch existing p_w_picpaths, and to generate graphics on the fly for web use.

For a more advanced drawing library for PIL, see The aggdraw Module.

创建绘画对象 ImageDraw module creates drawing surface for p_w_picpath

import Image, ImageDraw
im = Image.open(“vacation.jpeg")
drawSurface = ImageDraw.Draw(im)

基本绘画操作 Basic methods of drawing surface

  • 弧/弦/扇形 chord arc pieslice (bbox, strtAng, endAng)

  • 椭圆 ellipse (bbox)

  • 线段/多段线 line (L)  draw.line(((60,60),(90,60), (90,90), (60,90), (60,60))) #draw a square

  • 点 point (xy)  #单像素点很小看不清,实际中可用实心小圆代替

  • 多边形 polygon (L) draw.polygon([(60,60), (90,60), (90,90), (60,90)]) #draw a square

  • 矩形 rectangle (bbox)       # first coord属于矩形, second coord不属于

  • 文字 text(xy,message,font=None) 绘制文字message,文本区域左上角坐标为xy
          drawable.text((10, 10), "Hello", fill=(255,0,0), font=None)

  • 文字大小 textsize(message,font=None)  给定文字message,返回所占像素(width,height)

可选参数 Common optional args for these methods

  • fill=fillColor

  • outline=outlineColor

矢量字体支持 TrueType Font support

import ImageFont
ttFont = ImageFont.truetype (“arial.ttf”, 16)
drawable.text ((10, 10), “Hello”, fill=(255,0,0), font=ttFont)

例子:Draw a Grey Cross Over an Image

复制代码

import Image, ImageDraw im = Image.open("lena.pgm") # Creates an object that can be used to draw in the given p_w_picpath.draw = ImageDraw.Draw(im) # draw.line(xy, options) => Draws a line between the coordinates in the xy list.# The coordinate list can be any sequence object containing either 2-tuples [ (x, y), ... ] # or numeric values [ x, y, ... ]. # The fill option gives the color to use for the line.draw.line((0, 0) + im.size, fill=128) draw.line((0, im.size[1], im.size[0], 0), fill=128) del draw # write to stdoutim.save(sys.stdout, "PNG")

复制代码

 

The ImageChops module


a number of arithmetical p_w_picpath operations, called channel operations ("chops" 通道操作).

These can be used for various purposes, including special effects 特殊效果, p_w_picpath compositions 图像合成, algorithmic painting 算法绘画, and more.

At this time, channel operations are only implemented for 8-bit p_w_picpaths (e.g. "L" and "RGB").

例子:比较两幅图像

Exact Comparison:

The quickest way to determine if two p_w_picpaths have exactly the same contents is to get the difference between the two p_w_picpaths, and then calculate the bounding box of the non-zero regions in this p_w_picpath. If the p_w_picpaths are identical, all pixels in the difference p_w_picpath are zero, and the bounding box function returns None.

import ImageChops def equal(im1, im2): return ImageChops.difference(im1, im2).getbbox() is None

To get a measure of how similar two p_w_picpaths are, you can calculate the root-mean-square (RMS) value of the difference between the p_w_picpaths. If the p_w_picpaths are exactly identical, this value is zero. The following function uses the difference function, and then calculates the RMS value from the histogram of the resulting p_w_picpath.

RMS Difference:

To get a measure of how similar two p_w_picpaths are, you can calculate the root-mean-square (RMS) value of the difference between the p_w_picpaths. If the p_w_picpaths are exactly identical, this value is zero. The following function uses the difference function, and then calculates the RMS value from the histogram of the resulting p_w_picpath.

复制代码

# Example: File: p_w_picpathdiff.pyimport ImageChops import math, operator def rmsdiff(im1, im2): "Calculate the root-mean-square difference between two p_w_picpaths" h = ImageChops.difference(im1, im2).histogram() # calculate rms
    return math.sqrt(reduce(operator.add, map(lambda h, i: h*(i**2), h, range(256)) ) / (float(im1.size[0]) * im1.size[1]))

复制代码