学习PIL模块笔记(一)

实例:

1、打开、旋转和显示图片操作(使用默认的查看器)

from PIL import Image
im = Image.open("bride.jpg")
im.rotate(45).show()

2、创建缩略图

from PIL import Image
import glob, os

size = 128, 128

for infile in glob.glob("*.jpg"):
    file, ext = os.path.splitext(infile)
    im = Image.open(infile)
    im.thumbnail(size, Image.ANTIALIAS)
    im.save(file + ".thumbnail", "JPEG")

3、新建图片操作

有两种方式:

  Image.new(mode, size)

  Image.new(mode, size, color)

以指定的模式和大小创建一个新图像。大小以2元元组的形式给出。给colour赋单个值,表示要创建单波段图像,元组表示创建多波段图像(每个波段一个值)。如果忽略colour参数,图像将以黑色填充。如果colour设为None,图像不会被初始化。

from PIL import Image
im = Image.new("RGB", (512, 512), "white")

4、打开图片操作
有两种方式:

  Image.open(file)

  Image.open(file, mode)

打开并识别给定图像文件。这是一个偷懒的操作;真正的图像数据只有到处理的时候才会被读入(调用load函数强制加载)。如果给出了模式(mode)参数,它必须设为“r”。 
 
要打开图像,即可以使用字符串(表示文件名)也可以使用文件对象。对后一种情况,文件对象必须实现了read,seek,和 tell 方法,并以二进制模式打开。

5、图片差值操作

  Image.blend(image1, image2, alpha)

通过使用alpha常量,在图像进行差值操作,创建新图像。两个图像必须具有相同的大小和模式。alpha常数取值范围为0.0~1.0,输出为out=image1*(1.0-alpha)+image2*alpha。当alpha为0时,返回值为image1的拷贝值。当alpha为1时,返回值为image2的拷贝值。

6、合并图片操作

  Image.composite(image1, image2, mask)

使用遮罩(mask)作为alpha,通过在两个图像之间进行插值来创建一个新图像。遮罩图像的模式可以是“1”,“L”,或者“RGBA”。所有的图像的大小必须有相同。 

7、eval

Image.eval(image, function)

把函数(function)(应该接收一个参数)应用到所给图像的每一个像素。如果图像有多个波段,相同的函数会应用到每一个波段。注意,该函数对每一个可能的像素值只计算一次,所有不能使用随机组件(components)或者其它发生器(generators)。

8、frombuffer

Image.frombuffer(mode, size, data)

Image.frombuffer(mode, size, data, decoder, parameters)

使用标准的“raw”解码器,把来自字符串或者缓冲区(buffer)对象的图像数据创建为一个图像内存(image memory)。对于某些模式,图像内存会和原来的缓冲区共享内存(这意味着对原始缓冲区对象的修改会影响图像)。不是所有的模式都能共享内存;支持共享内存的模式包括:“L”,“RGBX”,“RGBA”和“CMYK”。对其其它模式,这个函数的作用与fromstring函数类似。

9、fromstring

Image.fromstring(mode, size, data)

使用标准的“raw”解码器从来自字符串的像素数据创建一个图像内存。

Image.fromstring(mode, size, data, decoder, parameters)

也一样,但是允许你使用PIL支持的任何像素解码器。关于可用解码器的更多信息,参见Writing Your Own File Decoder节 .

注意,这个函数只对像素数据解码,而不是整个图像。如果字符串中包含了一个完整的图像文件,可以使用StringIO对象对它进行处理,并使用open函数加载图像。

10、merge

Image.merge(mode, bands)

从几个单波段图像创建一个新图像。bands参数是包含图像的元组或列表,一个图像对应模式中描述的一个波段。所有波段的图像必须有相同的大小。

 

方法

一个Image类的实例具有下列方法。除非另外指出,所有的方法都返回一个新的Image类的实例,包含处理过的图像数据。

1、convert

im.convert(mode) => image
返回图像转换后的副本 ,如果原始图像是调色板图像,这个函数通过调色板转换像素。忽略mode参数,会自动选择一个模式,以保证所有的图像信息和调色板信息在没有调色板的时候也能表示出来。 
从彩色图像转换到黑白图像时,图像库使用ITU-R 601-2 luma转换: 
    L = R * 299/1000 + G * 587/1000 + B * 114/1000
在把图像转换为二值图(bilevel image)(模式“1”)时,源图像首先被转换为黑白图。然后在结果中,值大于127的像素点被设置为白色,图像抖动(and the image is dithered)。使用point方法可以改变阈值。 
im.convert(mode, matrix) => image
使用转换矩阵,把一个 "RGB" 图像转换为 "L" 或者 "RGB" 图像。其中矩阵是一个4元或16元元组。 
下面的例子把一个RGB图像转换(根据ITU-R 709进行线性校正,using the D65 luminant)到CIE XYZ颜色空间: 
Convert RGB to XYZ 

    rgb2xyz = ( 
        0.412453, 0.357580, 0.180423, 0, 
        0.212671, 0.715160, 0.072169, 0, 
        0.019334, 0.119193, 0.950227, 0 ) 
    out = im.convert("RGB", rgb2xyz)

2、copy

im.copy() => image

复制图像。如果你想往图像上粘贴东西,但是又保持源图像不变可以使用这个函数。

3、crop

im.crop(box) => image 
返回当前图像的一个矩形区域。box参数是一个定义了左,上,右,下像素坐标的4元元组。 
这是一个投篮操作。改变源图像可能会也可能不会影响剪裁的图像。要得到一个单独的拷贝,可以在剪裁的副本上应用load函数。
4、draft
im.draft(mode, size)
配置图像文件加载器,使它返回一个与给定模式和大小尽可能匹配的图像。比如,你可以在加载的时候,把一个彩色的JPEG图像转换为一个灰度图,或者从一个PCD文件中提取出一个128x192的版本。 
注意这个方法在适当的时候修改图像对象。如果图像已经加载了,这个方法可能无效。
5、filter
im.filter(filter) => image

返回一个经过滤波器处理过的图像副本。滤波器列表参考ImageFilter模块。
6、fromstring

im.fromstring(data) 
im.fromstring(data, decoder, parameters) 

与fromstring功能相同,但数据加载到当前图像。

7、getbands

im.getbands() => tuple of strings

返回一个包含所有波段名称的元组。例如,在RGB图像中返回('R', 'G', 'B')。

8、getbbox

im.getbbox() ⇒ 4-tuple or None

计算图像中的非零值闭合区域,返回一个元组,包含四个坐标值(left, upper, right, lower)。如果图像为空的,返回None。
9、getcolors 

im.getcolors() => a list of (count, color) tuples or None 
im.getcolors(maxcolors) => a list of (count, color) tuples or None 

返回一个列表,列表的元素为(计数,颜色)的元组,其中计数是表示相应的颜色出现在图像中的次数。

如果maxcolors值超标,该方法停止计数并返回None。maxcolors默认值是256。你如果要确保得到图像中的所有颜色值,你可以通过size[0]*size[1](但是在处理大图像之前,你要确保拥有足够的内存)。
10、getdata 

im.getdata() => sequence
Returns the contents of an image as a sequence object containing pixel values. The sequence object is flattened, so that values for line one follow directly after the values of line zero, and so on. 
 
Note that the sequence object returned by this method is an internal PIL data type, which only supports certain sequence operations, including iteration and basic sequence access. To convert it to an ordinary sequence (e.g. for printing), use list(im.getdata()). 
posted @ 2015-10-07 19:02  jeffkuang  阅读(1265)  评论(0)    收藏  举报