• 【笔记】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

  • 相关阅读:
    day18:正则表达式和re模块
    finance1:专业词汇
    Iterator & Iterable 和 Comparable&Comparator
    pandas中三种索引方式(.loc.iloc.ix)
    XML序列化与反序列化
    控件蓝图里控件绑定问题
    Mouse Properties(鼠标属性)
    cSV
    从父控件移除控件
    是否显示鼠标指针
  • 原文地址:https://www.cnblogs.com/liuyimin/p/7637336.html
Copyright © 2020-2023  润新知