笔记PIL 中的 Image 模块
Posted liuyimin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记PIL 中的 Image 模块相关的知识,希望对你有一定的参考价值。
Image 模块提供了一个同名类(Image),也提供了一些工厂函数,包括从文件中载入图片和创建新图片。例如,以下的脚本先载入一幅图片,将它旋转 45 度角,并显示出来:
2 >>>im = Image.open("j.jpg")
3 >>>im.rotate(45).show()
下面这个脚本则创建了当前目录下所有以 .jpg 结尾的图片的缩略图。
Image 类中的函数。
0. new : 这个函数创建一幅给定模式(mode)和尺寸(size)的图片。如果省略 color 参数,则创建的图片被黑色填充满,如果 color 参数是 None 值,则图片还没初始化。
1. open : 打开并识别所提供的图像文件。不过,使用这函数的时候,真正的图像数据在你进行数据处理之前并没有被读取出来。可使用 load 函数进行强制加载。 mode 参数可以省略,但它只能是 "r" 值。
2. blend : 使用两幅给出的图片和一个常量 alpha 创建新的图片。两幅图片必须是同样的 size 和 mode 。
3. composite : 使用两幅给出的图片和一个与 alpha 参数相似用法的 mask 参数,其值可为:"1", "L", "RGBA" 。两幅图片的 size 必须相同。
4. eval : 使用带一个参数的函数作用于给定图片的每一个像素。如果给定的图片有超过一个的 频段(band),则该函数也会作用于每一个频段。注意,该函数是每一个像素计算一次,所以不能使用一些随机组件或其他的生成器。
5. frombuffer : (PIL 1.1.4 中新添加的)使用标准 "raw" 解码器在像素数据或是对象缓存中创建一个图像副本。不是所有的模式都支持这种用法。支持的 mode 有"L", "RGBX", "RGBA", "CMYK"。
6. fromstring : 注意,这个函数只对像素数据进行解码,而不是一整张图片。如果你有一整张字符串格式的图片,使用 StringIO 对其进行包装并用 open 函数载入它。
7. merge : 使用一系列单一频段(band)的图像来创建新的一幅图像。频段是以一些图像组成的元组或列表,所有的 band 必须有相同大小的 size 。
Image 类中的方法:
0. convert : 返回一个转换后的图像的副本。
下面是一个例子:转换 RGB 为 XYZ 。
1. copy : 复制图像。如果你希望粘贴一些东西进图像里面的话可以使用这个方法,但仍然会保留原图像。
2. crop : 返回图像某个给定区域。box 是一个 4 元素元组,定义了 left, upper, right, lower 像素坐标。使用这个方法的时候,如果改变原始图像,可能会,也可能不会改变裁剪生成的图像。创建一个完全的复制,裁剪复制的时候使用 load 方法。
3. draft : 按给出的 mode 和 size 进行配置。可以使用这个方法将彩色JPEG图片转为灰度图。
4. filter : 返回图像使用滤波器后的副本。可以看 这里 获取更多有用的滤波器。
5. fromstring : 和前面的函数是一样的功能,不过这个方法是将数据载入到当前图像。
6. getbands : 返回一个元组,包含每一个 band 的名字,比如,在一幅 RGB 格式的图像上使用 getbands 则返回("R", "G", "B")。
7. getbbox : 计算图像边框值,返回一个 4-元组 ,值为(左,上,右,下)。
8. getcolors : 在 1.1.5 版本中新添加的。返回一个未排序列表,其元素是元组(count, color)。the count is the number of times the corresponding color occurs in the image 。If the maxcolors value is exceeded, the method stops counting and returns None。
9. getdata : 返回一个图像内容的像素值序列。不过,这个返回值是 PIL 内部的数据类型,只支持确切的序列操作符,包括迭代器和基本序列方法。我们可以通过 list(im.getdata()) 为其生成普通的序列。
10. getextrema : 返回一个 2-元组 ,值为图像的最小最大值。在当前PIL版本中,仅支持单一频段(single-band)的图像。
11. getpixel : 返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组。
12. histogram : 返回图像直方图,值为像素计数组成的列表。如果有参数 mask ,则返回图像所有部分的直方图。
13. load : 版本 1.1.6 新添加的。load 返回对象的像素值,可以用来修改像素值。
14. paste : 1). 粘贴新图片至图片中,box 参数可以为 2-元组(upper, left)或是 4-元组(left, upper, right, lower),或者是 None(0, 0)。2). 功能同上。不过是将指定位置填充为某种颜色。
15. point :
------------
Python图像处理库PIL的基本概念
PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。
1、 通道
每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。
以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道。
对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()是Image模块的方法,它会返回一个字符串元组(tuple)。该元组将包括每一个通道的名称。
Python的元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
方法getbands()的使用如下:
>>>from PIL import Image
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.getbands()
(‘R‘, ‘G‘, ‘B‘)
>>>im_bands = im.getbands()
>>>len(im_bands)
3
>>>print im_bands[0]
R
>>>print im_bands[1]
G
>>>print im_bands[2]
B
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的真彩色)。
可以通过mode属性读取图像的模式。其返回值是包括上述模式的字符串。
>>> from PIL importImage
>>> im =Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>> im.mode
‘RGB‘
>>> md = im.mode
>>> print md
RGB
3、 尺寸
通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。
>>> from PIL importImage
>>> im =Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>>im_size = im.size
>>>print im_size[0]
800
>>>print im_size[1]
450
4、 坐标系统
PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。
坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。
5、 调色板
调色板模式 ("P")使用一个颜色调色板为每个像素定义具体的颜色值
6、 信息
使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。
属性info的使用如下:
>>> im =Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.info
{‘jfif_version‘:(1, 1), ‘jfif‘: 257, ‘jfif_unit‘: 1, ‘jfif_density‘: (96, 96), ‘dpi‘: (96, 96)}
>>>im_info = im.info
>>>im_info
{‘jfif_version‘:(1, 1), ‘jfif‘: 257, ‘jfif_unit‘: 1, ‘jfif_density‘: (96, 96), ‘dpi‘: (96, 96)}
>>>print im_info[‘jfif_version‘]
(1, 1)
>>>print im_info[‘jfif‘]
257
7、 滤波器
对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了4个不同的采样滤波器:
NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。它忽略了所有其他的像素。
BILINEAR:双线性滤波。在输入图像的2x2矩阵上进行线性插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
BICUBIC:双立方滤波。在输入图像的4x4矩阵上进行立方插值。注意:PIL的当前版本,做下采样时该滤波器使用了固定输入模板。
ANTIALIAS:平滑滤波。这是PIL 1.1.3版本中新的滤波器。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。在当前的PIL版本中,这个滤波器只用于改变尺寸和缩略图方法。
注意:在当前的PIL版本中,ANTIALIAS滤波器是下采样(例如,将一个大的图像转换为小图)时唯一正确的滤波器。BILIEAR和BICUBIC滤波器使用固定的输入模板,用于固定比例的几何变换和上采样是最好的。
Image模块中的方法resize()和thumbnail()用到了滤波器。
方法resize()的使用如下:
方法resize()的定义为:resize(size, filter=None)=> image
>>>from PIL import Image
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>>im_resize = im.resize((256,256))
>>> im_resize.size
(256, 256)
对参数filter不赋值的话,方法resize()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:
>>>im_resize0 = im.resize((256,256), Image.BILINEAR)
>>>im_resize0.size
(256, 256)
>>>im_resize1 = im.resize((256,256), Image.BICUBIC)
>>>im_resize1.size
(256, 256)
>>>im_resize2 = im.resize((256,256), Image.ANTIALIAS)
>>>im_resize2.size
(256, 256)
方法thumbnail ()的使用如下:
方法thumbnail ()的定义为:im.thumbnail(size, filter=None)
>>>from PIL import Image
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>>im.thumbnail((200,200))
>>>im.size
这里需要说明的是,方法thumbnail()需要保持宽高比,对于size=(200,200)的输入参数,其最终的缩略图尺寸为(200, 112)。
对参数filter不赋值的话,方法thumbnail()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>> im.thumbnail((200,200),Image.BILINEAR)
>>> im.size
(200, 112)
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>> im.thumbnail((200,200), Image.BICUBIC)
>>> im.size
(200, 112)
>>> im= Image.open(‘D:\\Code\\Python\\test\\img\\1.jpg‘)
>>>im.size
(800, 450)
>>> im.thumbnail((200,200), Image.ANTIALIAS)
>>> im.size
(200, 112)
IMAGE模块0x1
Image模块是PIL中最重要的模块,它有一个类叫做image,与模块名称相同。Image类有很多函数、方法及属性,接下来将依次对image类的属性、函数和方法进行介绍。
1、 Format
定义:im.format ? string or None
含义:源文件的文件格式。如果是由PIL创建的图像,则其文件格式为None。
例子:
>>>from PIL import Image
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>>im.format
‘JPEG‘
注:test.jpg是JPEG图像,所以其文件格式为JPEG。
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>>im.format
‘GIF‘
注:test.gif为GIF文件,所以其文件格式为GIF。
2、 Mode
定义:im.mode ? string
含义:图像的模式。这个字符串表明图像所使用像素格式。该属性典型的取值为“1”,“L”,“RGB”或“CMYK”。对于图像模式的介绍,可以参考我的blog“Python图像处理库PIL的基本概念介绍”。
例子:
>>> im = Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
‘RGB‘
>>> im = Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>> im.mode
‘P‘
3、 Size
定义:im.size ? (width, height)
含义:图像的尺寸,按照像素数计算。它的返回值为宽度和高度的二元组(width, height)。
例子:
>>>from PIL import Image
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>>im.size
(800, 450)
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>> im.size
(400, 220)
4、 Palette
定义:im.palette ? palette or None
含义:颜色调色板表格。如果图像的模式是“P”,则返回ImagePalette类的实例;否则,将为None。
例子:
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>> im.mode
‘RGB‘
>>>im.palette
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>> im.mode
‘P‘
>>>im.palette
<PIL.ImagePalette.ImagePaletteobject at 0x035E7AD0>
>>> pl= im.palette
Pl为ImagePalette类的实例。
5、 Info
定义:im.info ? dictionary
含义:存储图像相关数据的字典。文件句柄使用该字典传递从文件中读取的各种非图像信息。大多数方法在返回新的图像时都会忽略这个字典;因为字典中的键并非标准化的,对于一个方法,它不能知道自己的操作如何影响这个字典。如果用户需要这些信息,需要在方法open()返回时保存这个字典。
例子:
>>>from PIL import Image
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>>im.info
{‘jfif_version‘:(1, 1), ‘jfif‘: 257, ‘jfif_unit‘: 1, ‘jfif_density‘: (96, 96), ‘dpi‘: (96, 96)}
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.gif")
>>>im.info
{‘duration‘:100, ‘version‘: ‘GIF89a‘, ‘extension‘: (‘NETSCAPE2.0‘, 795L), ‘background‘: 0,‘loop‘: 0}
IMAGE模块0x1
二、Image类的函数
1、 New
定义:Image.new(mode,size) ? image
Image.new(mode, size, color) ? image
含义:使用给定的变量mode和size生成新的图像。Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。在版本1.1.4及其之后,用户也可以用颜色的名称,比如给变量color赋值为“red”。如果没有对变量color赋值,图像内容将会被全部赋值为0(图像即为黑色)。如果变量color是空,图像将不会被初始化,即图像的内容全为0。这对向该图像复制或绘制某些内容是有用的。
例子:
>>>from PIL import Image
>>> im= Image.new("RGB", (128, 128), "#FF0000")
>>>im.show()
图像im为128x128大小的红色图像。
>>> im= Image.new("RGB", (128, 128))
>>>im.show()
图像im为128x128大小的黑色图像,因为变量color不赋值的话,图像内容被设置为0,即黑色。
>>> im= Image.new("RGB", (128, 128), "red")
>>>im.show
图像im为128x128大小的红色图像。
2、 Open
定义:Image.open(file) ? image
Image.open(file, mode) ? image
含义:打开并确认给定的图像文件。这个是一个懒操作;该函数只会读文件头,而真实的图像数据直到试图处理该数据才会从文件读取(调用load()方法将强行加载图像数据)。如果变量mode被设置,那必须是“r”。
用户可以使用一个字符串(表示文件名称的字符串)或者文件对象作为变量file的值。文件对象必须实现read(),seek()和tell()方法,并且以二进制模式打开。
例子:
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg")
>>>im.show()
>>> im= Image.open("D:\\Code\\Python\\test\\img\\test.jpg", "r")
>>>im.show()
3、 Blend
定义:Image.blend(image1,image2, alpha) ? image
含义:使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式。
合成公式为:out = image1 *(1.0 - alpha) + image2 * alpha
如果变量alpha为0.0,将返回第一张图像的拷贝。如果变量alpha为1.0,将返回第二张图像的拷贝。对变量alpha的值没有限制。
例子:
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> im02 =Image.open("D:\\Code\\Python\\test\\img\\test02.jpg")
>>> im =Image.blend(im01, im02, 0.3)
>>> im.show()
Test01.jpg和test02.jpg两张图像size都为1024x768,mode为“RGB”。它们按照第一张70%的透明度,第二张30%的透明度,合成为一张。
4、 Composite
定义:Image.composite(image1,image2, mask) ? image
含义:使用给定的两张图像及mask图像作为透明度,插值出一张新的图像。变量mask图像的模式可以为“1”,“L”或者“RGBA”。所有图像必须有相同的尺寸。
例子:
>>> im01 =Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> im02 =Image.open("D:\\Code\\Python\\test\\img\\test02.jpg")
>>>r,g,b = im01.split()
>>> g.mode
‘L‘
>>> g.size
(1024, 768)
>>> im= Image.composite(im01, im02, g)
>>>im.show()
5、 Eval
定义:Image.eval(image,function) ? image
含义:使用变量function对应的函数(该函数应该有一个参数)处理变量image所代表图像中的每一个像素点。如果变量image所代表图像有多个通道,那变量function对应的函数作用于每一个通道。注意:变量function对每个像素只处理一次,所以不能使用随机组件和其他生成器。
例子:
>>>from PIL import Image
>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>> deffun(x):
return x * 0.5
>>>im_eval = Image.eval(im01, fun)
>>>im_eval.show()
>>>im01.show()
图像im01如下图:
图像im_eval如下图:
图像im_eval与im01比较,其像素值均为im01的一半,则其亮度自然也会比im01暗一些。
6、 Frombuffer
定义:Image.frombuffer(mode,size, data) ? image
Image.frombuffer(mode, size,data, decoder, parameters) ? image
含义:(New in PIL 1.1.4)使用标准的“raw”解码器,从字符串或者buffer对象中的像素数据产生一个图像存储。对于一些模式,这个图像存储与原始的buffer(这意味着对原始buffer对象的改变体现在图像本身)共享内存。并非所有的模式都可以共享内存;支持的模式有“L”,“RGBX”,“RGBA”和“CMYK”。对于其他模式,这个函数与fromstring()函数一致。
注意:版本1.1.6及其以下,这个函数的默认情况与函数fromstring()不同。这有可能在将来的版本中改变,所以为了最大的可移植性,当使用“raw”解码器时,推荐用户写出所有的参数,如下所示:
im =Image.frombuffer(mode, size, data, "raw", mode, 0, 1)
函数Image.frombuffer(mode,size, data, decoder, parameters)与函数fromstring()的调用一致。
例子:
7、 Fromstring
定义:Image.fromstring(mode,size, data) ? image
Image.fromstring(mode, size,data, decoder, parameters) ? image
含义:函数Image.fromstring(mode,size, data),使用标准的“raw”解码器,从字符串中的像素数据产生一个图像存储。
函数Image.fromstring(mode,size, data, decoder, parameters)也一样,但是允许用户使用PIL支持的任何像素解码器。更多信息可以参考:Writing YourOwn File Decoder.
注意:这个函数只对像素数据进行解码,而不是整个图像。如果用户的字符串包含整个图像,可以将该字符串包裹在StringIO对象中,使用函数open()来加载。
例子:
8、 Merge
定义:Image.merge(mode,bands) ? image
含义:使用一些单通道图像,创建一个新的图像。变量bands为一个图像的元组或者列表,每个通道的模式由变量mode描述。所有通道必须有相同的尺寸。
变量mode与变量bands的关系:
len(ImageMode.getmode(mode).bands)= len(bands)
例子:
>>>from PIL import Image
>>>im01 = Image.open("D:\\Code\\Python\\test\\img\\test01.jpg")
>>>im02 = Image.open("D:\\Code\\Python\\test\\img\\test02.jpg")
>>>r1,g1,b1 = im01.split()
>>>r2,g2,b2 = im02.split()
>>>r1.mode
‘L‘
>>>r1.size
(1024, 768)
>>>g1.mode
‘L‘
>>>g1.size
(1024, 768)
>>>r2.mode
‘L‘
>>>g2.size
(1024, 768)
>>>imgs=[r1,g2,b2]
>>>len(ImageMode.getmode("RGB").bands)
3
>>>len(imgs)
3
>>>im_merge = Image.merge("RGB", imgs)
>>>im_merge.show()
图像im_merge如下所示:
IMAGE模块0x1
以上是关于笔记PIL 中的 Image 模块的主要内容,如果未能解决你的问题,请参考以下文章