笔记PIL 中的 Image 模块

Posted liuyimin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记PIL 中的 Image 模块相关的知识,希望对你有一定的参考价值。

 Image 模块提供了一个同名类(Image),也提供了一些工厂函数,包括从文件中载入图片和创建新图片。例如,以下的脚本先载入一幅图片,将它旋转 45 度角,并显示出来:

1 >>>from PIL import Image
2  >>>im = Image.open("j.jpg")
3  >>>im.rotate(45).show()

    下面这个脚本则创建了当前目录下所有以 .jpg 结尾的图片的缩略图。

技术分享Create thumbnail

    Image 类中的函数

0.    new : 这个函数创建一幅给定模式(mode)和尺寸(size)的图片。如果省略 color 参数,则创建的图片被黑色填充满,如果 color 参数是 None 值,则图片还没初始化。

技术分享new

1.    open : 打开并识别所提供的图像文件。不过,使用这函数的时候,真正的图像数据在你进行数据处理之前并没有被读取出来。可使用 load 函数进行强制加载。 mode 参数可以省略,但它只能是 "r" 值。

技术分享open

2.    blend : 使用两幅给出的图片和一个常量 alpha 创建新的图片。两幅图片必须是同样的 size 和 mode 。

技术分享blend

3.    composite : 使用两幅给出的图片和一个与 alpha 参数相似用法的 mask 参数,其值可为:"1", "L", "RGBA" 。两幅图片的 size 必须相同。

技术分享composite

4.    eval : 使用带一个参数的函数作用于给定图片的每一个像素。如果给定的图片有超过一个的 频段(band),则该函数也会作用于每一个频段。注意,该函数是每一个像素计算一次,所以不能使用一些随机组件或其他的生成器。

技术分享eval

5.    frombuffer : (PIL 1.1.4 中新添加的)使用标准 "raw" 解码器在像素数据或是对象缓存中创建一个图像副本。不是所有的模式都支持这种用法。支持的 mode 有"L", "RGBX", "RGBA", "CMYK"。

技术分享frombuffer

6.    fromstring : 注意,这个函数只对像素数据进行解码,而不是一整张图片。如果你有一整张字符串格式的图片,使用 StringIO 对其进行包装并用 open 函数载入它。

技术分享fromstring

7.    merge : 使用一系列单一频段(band)的图像来创建新的一幅图像。频段是以一些图像组成的元组或列表,所有的 band 必须有相同大小的 size 。

技术分享merge

    Image 类中的方法

0.    convert : 返回一个转换后的图像的副本。

技术分享convert

    下面是一个例子:转换 RGB 为 XYZ 。

技术分享RGB2XYZ

1.    copy : 复制图像。如果你希望粘贴一些东西进图像里面的话可以使用这个方法,但仍然会保留原图像。

技术分享copy

2.    crop : 返回图像某个给定区域。box 是一个 4 元素元组,定义了 left, upper, right, lower 像素坐标。使用这个方法的时候,如果改变原始图像,可能会,也可能不会改变裁剪生成的图像。创建一个完全的复制,裁剪复制的时候使用 load 方法。

技术分享crop

3.    draft : 按给出的 mode 和 size 进行配置。可以使用这个方法将彩色JPEG图片转为灰度图。

技术分享draft

4.    filter : 返回图像使用滤波器后的副本。可以看 这里 获取更多有用的滤波器。

技术分享filter

5.    fromstring : 和前面的函数是一样的功能,不过这个方法是将数据载入到当前图像。

技术分享fromstring

6.    getbands : 返回一个元组,包含每一个 band 的名字,比如,在一幅 RGB 格式的图像上使用 getbands 则返回("R", "G", "B")。

技术分享getbands

7.    getbbox : 计算图像边框值,返回一个 4-元组 ,值为(左,上,右,下)。

技术分享getbbox

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。

技术分享getcolors

9.    getdata : 返回一个图像内容的像素值序列。不过,这个返回值是 PIL 内部的数据类型,只支持确切的序列操作符,包括迭代器和基本序列方法。我们可以通过 list(im.getdata())  为其生成普通的序列。

技术分享getdata

10.    getextrema : 返回一个 2-元组 ,值为图像的最小最大值。在当前PIL版本中,仅支持单一频段(single-band)的图像。

技术分享getextreme

11.    getpixel : 返回指定位置的像素,如果所打开的图像是多层次的图片,那这个方法就返回一个元组。

技术分享getpixel

12.    histogram : 返回图像直方图,值为像素计数组成的列表。如果有参数 mask ,则返回图像所有部分的直方图。

技术分享histogram

13.    load : 版本 1.1.6 新添加的。load 返回对象的像素值,可以用来修改像素值。

技术分享load

14.    paste : 1). 粘贴新图片至图片中,box 参数可以为 2-元组(upper, left)或是 4-元组(left, upper, right, lower),或者是 None(0, 0)。2). 功能同上。不过是将指定位置填充为某种颜色。

技术分享paste

15.    point : 

技术分享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属性读取图像的模式。其返回值是包括上述模式的字符串。

属性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属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。

属性mode的使用如下:

>>> 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的使用如下:

>>>from PIL import Image

>>> 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

(200,112)

这里需要说明的是,方法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类的属性、函数和方法进行介绍。

一、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的基本概念介绍”。

例子:

>>>from PIL import Image

>>> im = Image.open("D:\\Code\\Python\\test\\img\\test.jpg")

>>> im.mode

‘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。

例子:

>>> from PIL import Image

>>> 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()方法,并且以二进制模式打开。

例子:

>>> from PIL import Image

>>> 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的值没有限制。

例子:

>>>from PIL import Image

>>> 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”。所有图像必须有相同的尺寸。

例子:

>>>from PIL import Image

>>> 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 模块的主要内容,如果未能解决你的问题,请参考以下文章

python中PIL模块

Python3 PIL IMAGE 模块和元类

Python PIL模块

Python模块:PIL

PIL 学习

博客系统流程