pil_pillow - CSDN
pil 订阅
太平船务有限公司(PIL)由张允中先生于1967年在新加坡成立。公司成立初期,以经营区域性的散杂货运输为主,从1983年起,首次推出了集装箱运输服务。 展开全文
太平船务有限公司(PIL)由张允中先生于1967年在新加坡成立。公司成立初期,以经营区域性的散杂货运输为主,从1983年起,首次推出了集装箱运输服务。
信息
公司名称
太平船务有限公司
总部地点
新加坡
外文名称
PIL
成立时间
1967年
PIL简介
太平船务有限公司(PIL)由张允中先生于1 967年在新加坡成立。公司成立初期,以经营区域性的散杂货运输为主,从1983年起,首次推出了集装箱运输服务。公司还积极发展多样化的物流经营,如仓储、货运及码头。
收起全文
  • PIL (Python Imaging Library) 教程

    万次阅读 2016-10-19 23:48:35
    来自 http://effbot.org/imagingbook/introduction.htm简介PIL (Python Imaging Library)...使用Image类PIL中最重要的类是Image类,该类在Image模块中定义。从文件加载图像:import Image im = Image.open("lena.ppm")

    来自 http://effbot.org/imagingbook/introduction.htm

    简介

    PIL (Python Imaging Library)

    Python图像处理库,该库支持多种文件格式,提供强大的图像处理功能。

    使用Image类

    PIL中最重要的类是Image类,该类在Image模块中定义。

    从文件加载图像:

    import Image
    im = Image.open("lena.ppm")

    如果成功,这个函数返回一个Image对象。现在你可以使用该对象的属性来探索文件的内容。

    print im.format, im.size, im.mode
    # PPM (512, 512) RGB

    format属性指定了图像文件的格式,如果图像不是从文件中加载的则为None
    size属性是一个2个元素的元组,包含图像宽度和高度(像素)。
    mode属性定义了像素格式,常用的像素格式为:“L” (luminance) - 灰度图, “RGB” , “CMYK”。

    如果文件打开失败, 将抛出IOError异常。

    一旦你拥有一个Image类的实例,你就可以用该类定义的方法操作图像。比如:显示

    im.show()

    (show()的标准实现不是很有效率,因为它将图像保存到一个临时文件,然后调用外部工具(比如系统的默认图片查看软件)显示图像。该函数将是一个非常方便的调试和测试工具。)

    接下来的部分展示了该库提供的不同功能。

    读写图像

    PIL支持多种图像格式。从磁盘中读取文件,只需使用Image模块中的open函数。不需要提供文件的图像格式。PIL库将根据文件内容自动检测。

    如果要保存到文件,使用Image模块中的save函数。当保存文件时,文件名很重要,除非指定格式,否则PIL库将根据文件的扩展名来决定使用哪种格式保存。

    * 转换文件到JPEG *

    import os, sys
    import Image
    
    for infile in sys.argv[1:]:
        f, e = os.path.splitext(infile)
        outfile = f + ".jpg"
        if infile != outfile:
            try:
                Image.open(infile).save(outfile)
            except IOError:
                print "cannot convert", infile

    save函数的第二个参数可以指定使用的文件格式。如果文件名中使用了一个非标准的扩展名,则必须通过第二个参数来指定文件格式。

    * 创建JPEG缩略图 *

    import os, sys
    import Image
    
    size = 128, 128
    
    for infile in sys.argv[1:]:
        outfile = os.path.splitext(infile)[0] + ".thumbnail"
        if infile != outfile:
            try:
                im = Image.open(infile)
                im.thumbnail(size)
                im.save(outfile, "JPEG")
            except IOError:
                print "cannot create thumbnail for", infile

    需要注意的是,PIL只有在需要的时候才加载像素数据。当你打开一个文件时,PIL只是读取文件头获得文件格式、图像模式、图像大小等属性,而像素数据只有在需要的时候才会加载。

    这意味着打开一个图像文件是一个非常快的操作,不会受文件大小和压缩算法类型的影响。

    * 获得图像信息 *

    import sys
    import Image
    
    for infile in sys.argv[1:]:
        try:
            im = Image.open(infile)
            print infile, im.format, "%dx%d" % im.size, im.mode
        except IOError:
            pass

    剪切、粘贴、合并图像

    Image类提供了某些方法,可以操作图像的子区域。提取图像的某个子区域,使用crop()函数。

    * 复制图像的子区域 *

    box = (100, 100, 400, 400)
    region = im.crop(box)

    定义区域使用一个包含4个元素的元组,(left, upper, right, lower)。坐标原点位于左上角。上面的例子提取的子区域包含300x300个像素。

    该区域可以做接下来的处理然后再粘贴回去。

    * 处理子区域然后粘贴回去 *

    region = region.transpose(Image.ROTATE_180)
    im.paste(region, box)

    当往回粘贴时,区域的大小必须和参数匹配。另外区域不能超出图像的边界。然而原图像和区域的颜色模式无需匹配。区域会自动转换。

    * 滚动图像 *

    def roll(image, delta):
        "Roll an image sideways"
    
        xsize, ysize = image.size
    
        delta = delta % xsize
        if delta == 0: return image
    
        part1 = image.crop((0, 0, delta, ysize))
        part2 = image.crop((delta, 0, xsize, ysize))
        image.paste(part2, (0, 0, xsize-delta, ysize))
        image.paste(part1, (xsize-delta, 0, xsize, ysize))
    
        return image

    paste()函数有个可选参数,接受一个掩码图像。掩码中255表示指定位置为不透明,0表示粘贴的图像完全透明,中间的值表示不同级别的透明度。

    PIL允许分别操作多通道图像的每个通道,比如RGB图像。split()函数创建一个图像集合,每个图像包含一个通道。merge()函数接受一个颜色模式和一个图像元组,然后将它们合并为一个新的图像。接下来的例子交换了一个RGB图像的三个通道。

    * 分离和合并图像通道 *

    r, g, b = im.split()
    im = Image.merge("RGB", (b, g, r));

    对于单通道图像,split()函数返回图像本身。如果想处理各个颜色通道,你可能需要先将图像转为RGB模式。

    几何变换

    resize()函数接受一个元组,指定图像的新大小。
    rotate()函数接受一个角度值,逆时针旋转。

    * 基本几何变换 *

    out = im.resize((128, 128))
    out = im.rotate(45) # degrees counter-clockwise

    图像旋转90度也可以使用transpose()函数。transpose()函数也可以水平或垂直翻转图像。

    * transpose *

    out = im.transpose(Image.FLIP_LEFT_RIGHT)
    out = im.transpose(Image.FLIP_TOP_BOTTOM)
    out = im.transpose(Image.ROTATE_90)
    out = im.transpose(Image.ROTATE_180)
    out = im.transpose(Image.ROTATE_270)

    transpose()rotate()函数在性能和结果上没有区别。

    更通用的图像变换函数为transform()

    颜色模式变换

    PIL可以转换图像的像素模式。

    * 转换颜色模式 *

    im = Image.open("lena.ppm").convert("L")

    PIL库支持从其他模式转为“L”或“RGB”模式,其他模式之间转换,则需要使用一个中间图像,通常是“RGB”图像。

    图像增强(Image Enhancement)

    过滤器

    ImageFilter模块包含多个预定义的图像增强过滤器用于filter()函数。

    * 应用过滤器 *

    import ImageFilter
    out = im.filter(ImageFilter.DETAIL)

    点操作

    point()函数用于操作图像的像素值。该函数通常需要传入一个函数对象,用于操作图像的每个像素:

    * 应用点操作 *

    # 每个像素值乘以1.2
    out = im.point(lambda i: i * 1.2)

    使用以上技术可以快速地对图像像素应用任何简单的表达式。可以结合point()函数和paste函数修改图像。

    * 处理图像的各个通道 *

    # split the image into individual bands
    source = im.split()
    
    R, G, B = 0, 1, 2
    
    # select regions where red is less than 100
    mask = source[R].point(lambda i: i < 100 and 255)
    
    # process the green band
    out = source[G].point(lambda i: i * 0.7)
    
    # paste the processed band back, but only where red was < 100
    source[G].paste(out, None, mask)
    
    # build a new multiband image
    im = Image.merge(im.mode, source)

    注意用于创建掩码图像的语法:

    imout = im.point(lambda i: expression and 255)

    Python计算逻辑表达式采用短路方式,即:如果and运算符左侧为false,就不再计算and右侧的表达式,而且返回结果是表达式的结果。比如a and b如果a为false则返回a,如果a为true则返回b,详见Python语法。

    增强

    对于更多高级的图像增强功能,可以使用ImageEnhance模块中的类。

    可以调整图像对比度、亮度、色彩平衡、锐度等。

    * 增强图像 *

    import ImageEnhance
    
    enh = ImageEnhance.Contrast(im)
    enh.enhance(1.3).show("30% more contrast")

    图像序列

    PIL库包含对图像序列(动画格式)的基本支持。支持的序列格式包括FLI/FLCGIF和一些实验性的格式。TIFF文件也可以包含多个帧。

    当打开一个序列文件时,PIL库自动加载第一帧。你可以使用seek()函数tell()函数在不同帧之间移动。

    * 读取序列 *

    import Image
    
    im = Image.open("animation.gif")
    im.seek(1) # skip to the second frame
    
    try:
        while 1:
            im.seek(im.tell() + 1)
            # do something to im
    except EOFError:
        pass # end of sequence

    如例子中展示的,当序列到达结尾时,将抛出EOFError异常。

    注意当前版本的库中多数底层驱动只允许seek到下一帧。如果想回到前面的帧,只能重新打开图像。

    以下迭代器类允许在for语句中循环遍历序列:

    * 一个序列迭代器类 *

    class ImageSequence:
        def __init__(self, im):
            self.im = im
        def __getitem__(self, ix):
            try:
                if ix:
                    self.im.seek(ix)
                return self.im
            except EOFError:
                raise IndexError # end of sequence
    
    for frame in ImageSequence(im):
        # ...do something to frame...

    Postscript打印

    PIL库包含一些函数用于将图像、文本打印到Postscript打印机。以下是一个简单的例子。

    * 打印到Postscript *

    import Image
    import PSDraw
    
    im = Image.open("lena.ppm")
    title = "lena"
    box = (1*72, 2*72, 7*72, 10*72) # in points
    
    ps = PSDraw.PSDraw() # default is sys.stdout
    ps.begin_document(title)
    
    # draw the image (75 dpi)
    ps.image(box, im, 75)
    ps.rectangle(box)
    
    # draw centered title
    ps.setfont("HelveticaNarrow-Bold", 36)
    w, h, b = ps.textsize(title)
    ps.text((4*72-w/2, 1*72-h), title)
    
    ps.end_document()

    读取图像进阶

    如前所述,可以使用open()函数打开图像文件,通常传入一个文件名作为参数:

    im = Image.open("lena.ppm")

    如果打开成功,返回一个Image对象,否则抛出IOError异常。

    也可以使用一个file-like object代替文件名(暂可以理解为文件句柄)。该对象必须实现read,seek,tell函数,必须以二进制模式打开。

    * 从文件句柄打开图像 *

    fp = open("lena.ppm", "rb")
    im = Image.open(fp)

    如果从字符串数据中读取图像,使用StringIO类:

    * 从字符串中读取 *

    import StringIO
    
    im = Image.open(StringIO.StringIO(buffer))

    如果图像文件内嵌在一个大文件里,比如tar文件中。可以使用ContainerIO或TarIO模块来访问。

    * 从tar文档中读取 *

    import TarIO
    
    fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
    im = Image.open(fp)

    控制解码器

    * 该小节不太理解,请参考原文 *

    有些解码器允许当读取文件时操作图像。通常用于在创建缩略图时加速解码(当速度比质量重要时)和输出一个灰度图到激光打印机时。

    draft()函数。

    * Reading in draft mode *

    im = Image.open(file)
    print "original = ", im.mode, im.size
    
    im.draft("L", (100, 100))
    print "draft = ", im.mode, im.size

    输出类似以下内容:

    original = RGB (512, 512)
    draft = L (128, 128) 

    注意结果图像可能不会和请求的模式和大小匹配。如果要确保图像不大于指定的大小,请使用thumbnail函数。

    扩展阅读

    Python2.7 教程 PIL
    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140767171357714f87a053a824ffd811d98a83b58ec13000

    Python 之 使用 PIL 库做图像处理
    http://www.cnblogs.com/way_testlife/archive/2011/04/17/2019013.html

    展开全文
  • PIL模块使用

    千次阅读 2019-05-28 23:57:05
    PIL/Pillow 是 Python强大的图像处理库,功能包括:基本图像操作(创建缩略图、几何变换、图像裁剪、图像分离与合并、粘贴图片)图像存储、图像显示、格式转换、截屏操作、图像绘制功能、图像滤镜功能以及其他常用...


    PIL模块内容结构

    PIL模块 - Python图像处理
    来自http://www.tpleina.com/2019/05/2487951348.html

    介绍PIL、Pillow

    PIL(Python Imaging Library)是Python图像处理库,PIL模块于2009年9月发布,最新版本是1.1.7,仅支持Python1.5.2 - 2.7
    目前PIL项目已经停止开发,最后一次更新是在2011年

    强调一下:PIL不支持Python3.x

    而Pillow也是Python的图像处理库,与PIL区别:Pillow是PIL特定版本Fork代码,Pillow兼容PIL绝大多数用法,开发活跃,更主要是Pillow库支持Python3.x,所以推荐使用Pillow

    现在说的PIL,一般都指Pillow,包括文章下面说的PIL,都是Pillow模块

    本节使用演示图片:
    PIL操作图片

    • 图片大小:1680x1050
    • 图片格式:JPEG
    • 图片颜色模式:RGB

    Image类

    Image是PIL最重要的类,PIL大部分功能都是从Image类实例开始的

    Image实例有5个属性:

    • format : 返回图像格式(PNG,JPG,…),如果图像不是从文件读取的,则值None
    • mode : 返回图像的模式,常用模式有:
      • L (luminance) 灰度图像,8位像素,表示黑和白
      • RGB 3x8位像素,为真彩色图像
      • RGBA 4x8位像素,有透明通道的真彩色
      • CMYK 4x8位像素,颜色分离,出版图像
      • P 8位像素,使用调色板映射到其他模式
      • 1 1位像素,表示黑和白,但是存储的时候每个像素存储为8bit
      • YCbCr:3x8位像素,彩色视频格式
      • I 32位整型像素
      • F 32位浮点型像素
      • PIL支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)
    • size : 是一个二元tuple,包含width和height(宽度和高度,单位是px)
    • palette : 仅当 mode 为 P 时有效,返回 ImagePalette 实例
    • info : info信息,返回/设置图像一些额外信息,一个字典结构对象

    示例代码

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        # 打开图片
        im = Image.open('xiana.jpg')
        # 得到图片大小
        print(im.size)
        # 图片格式
        print(im.format)
        # 图片色彩模式
        print(im.mode)
        # 返回 ImagePalette 实例
        print(im.palette)
        # 实例信息(dict)
        print(im.info)
        # 打开,并查看图片
        im.show()
    

    说一下最后一个方法show() 查看图片,原理是将图片暂存为一个临时文件,然后调用操作系统默认图片浏览软件打开图片文件

    Pillow库不会直接解码或者加载全部图像数据
    当用Image.open打开一个图片文件,只会读取文件头信息来确定格式、颜色模式、大小等,文件其他数据不会处理,这种方式保证了图片操作性能
    可以说Image.open是一个懒操作(只读文件头信息,直到图像操作才会读取整个图像数据),因此调用load()方法可以强行加载图像数据

    额外说一下“通道”概念
    每张图片都是由一个或多个数据通道构成,例如RGB图像是由三个数据通道构成,分别为R、G和B通道
    获得图片通道数及通道名称:Image.getbands()

    图像操作

    创建缩略图

    Image.thumbnail()方法可以制作缩略图,接受一个二元数组作为缩略图的尺寸,然后将实例图片缩小到指定尺寸

    生成JPG缩略图,示例如下:

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        # 打开图片
        im = Image.open('xiana.jpg')
        print(im.size)
        x, y = im.size
        # 缩略图大小
        im.thumbnail((x//2, y//2))
        print(im.size)
        # 打开,查看图片
        im.show()
    

    裁剪图片

    Image.crop() 能从图像中提取一个子矩形选区

    Pillow库以图像左上角为坐标原点 (0,0),矩形选区区域由一个元组决定,元组信息包括 (左,上,右,下) 的坐标

    裁剪图片示例:

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        # 打开图片
        im = Image.open('test.png')
        # (左,上,右,下)
        selected = (610,140,1100,820) 
        # 得到400x680px图片
        region = im.crop(selected)
        region.show()
    

    裁剪得到图片:
    PIL裁剪图片

    几何变换

    • Image.resize() 设置图像大小
    • Image.rotate() 旋转图像,按照给定角度顺时钟沿图像中心旋转图像
    • Image.transpose(method) 翻转、旋转图像,method取值:
      • FLIP_LEFT_RIGHT 左右颠倒
      • FLIP_TOP_BOTTOM 上下颠倒
      • ROTATE_90 旋转90°
      • ROTATE_180 旋转180°
      • ROTATE_270 旋转270°

    示例代码:

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        out = im.resize((2180, 1300))
        # 顺时针选择45度
        out = im.rotate(45)
        # 旋转图像
        # 左右颠倒
        out = im.transpose(Image.FLIP_LEFT_RIGHT)
        # 上下颠倒
        out = im.transpose(Image.FLIP_TOP_BOTTOM)
        out.show()
        # 旋转90°
        out = im.transpose(Image.ROTATE_90)
        # 旋转180°
        out = im.transpose(Image.ROTATE_180)
        # 旋转270°
        out = im.transpose(Image.ROTATE_270) 
    

    图像格式转换

    PIL支持不同图像格式转换,使用 Image.open() 从磁盘中读取图片文件,它会根据图像信息自动确定图像格式
    可使用save(filename, format) 将图片指定格式保存本地,若不指定图像格式,save()会根据文件扩展名指定图像格式

    将图片转换为png格式示例

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        # 打开图片
        im = Image.open('xiana.jpg')
        # 保存指定格式
        im.save("xiana.png")
        # 打开,并查看图片
        Image.open('xiana.png').show()
    

    图像模式转换

    使用convert()方法,进行图像模式转换

    这个库支持 “L” 模式和 “RGB” 模式的互相转换. 要想转换到其它的模式, 可能需要使用一个中介模式, 比如 “RGB”.

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        im = Image.open('xiana.jpg')
        print(im.mode)
        # 彩色变黑白
        im = im.convert("L")
        im.show()
    

    将“RGB”模式的xiana.jpg图像转换为“L”模式的图像,图像效果:

    PIL模式转换

    粘贴图片

    Image.paste(image, box) 将一个Image实例粘贴到另一个Image实例上

    • box 一个元组 定义了左,上,右和下像素坐标,如果给定box值,被粘贴的图像的尺寸必须与区域尺寸一致
    • 如果图像模式不匹配,被粘贴的图像将被转换为当前图像模式
    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        w, h = im.size
        right_im = im.crop((w//2,0,w, h))
        left_im = im.crop((0,0,w//2, h))
        im.paste(left_im, (w//2,0,w, h))
        im.paste(right_im, (0,0,w//2, h))
        im.show()
    

    把一个图片一份两半,右半部分粘贴到左边,左半部分粘贴到右边,最后效果:

    PIL粘贴图片

    Image.paste(colour, box) 可以把颜色填充到box对应的区域,对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        w, h = im.size
        im.paste((1, 149, 200), (w//4,h//4,w*3//4, h*3//4))
        im.show()
    

    效果:
    PIL区域填充

    分离和合并颜色通道

    对于多通道图像,有时候能够分别对每个数据通道进行处理,处理完成重新整合

    • Image.split()将图像各通道进行分离,每个通道即是一个图像
    • Image.merge()将多个单通道图像合并,创建新图像
    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        r,g,b = im.split()
        # 单通道图像展示
        b.show()
        # 大量通道次序,合并
        im1 = Image.merge("RGB", (g, b, r))
        im1.show()
    

    单通道图像效果:
    PIL单通道图片

    合并图像效果:
    PIL合并图片

    ImageDraw模块

    ImageDraw 模块提供了 Draw 类,它能在 Image 实例上进行简单的2D绘画

    Draw类绘画函数:

    • chord 画弦
    • arc 画弧
    • pieslice 画扇形
    • ellipse 画椭圆
    • line 画线段/多段线
    • point 点
    • polygon 画多边形
    • rectangle 画矩形
    • text 文字

    各绘制函数详细使用可见[官方文档API](https://pillow.readthedocs.io/en/4.2.x/reference/ImageDraw.html 官方文档API)

    画直线

    Draw.line(xy,options) 函数绘制直线

    其中 xy 表示坐标列表,它可以是[(x,y),…]或者[x,y,…]的形式:

    • [(x1, y1), (x2, y2), …] :包含若干个元组的列表
    • [x1, y1, x2, y2, …] :按照顺序包含坐标信息的列表
    • [x1, y1, (x2, y2), …] :以上两种情况的混合
    • ((x1, y1), (x2, y2), …) :包含若干个元组的元组
    • (x1, y1, x2, y2, …) :按照顺序包含坐标信息的元组
    • (x1, y1, (x2, y2), …) :以上两种情况的混合

    options 可用的选项:

    • fill = (R,G,B) :指定线条颜色
    • width = integer :指定线条宽度,单位是px
    from PIL import Image,ImageDraw
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        w,h = im.size
        # 三等分位置
        dr_im.line([0, 0.33 * h, w, 0.33 * h], fill = (0, 0, 0), width = 6)
        # 左下角到中心点,右下角到中心点
        dr_im.line([(0, h), (0.5 * w, 0.5 * h), (w, h)], fill = (0, 0, 0), width = 6)
        im.show()
    

    画直线效果:
    PIL画直线

    画弧线

    Draw.arc(xy, start, end, options) 函数来绘制弧线

    • xy 是个长度为4的列表,如[x0, y0, x1, y1],表示 弧线最左侧距离左边、弧线最顶点距离上边、弧线最右侧距离左边、弧线最低点距离上边的距离
    • start 和 end 则是弧的起止角度,其中水平向右的方向为 0°,竖直向下的方向为 90°,水平向左的方向为 180°,竖直向上的方向为 270°
    • options 中可用选项:
      • fill = (R, G, B) :指定线条颜色
    from PIL import Image,ImageDraw
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        dr_im.arc([10,20,100,300],0,270,fill=(255,0,0))
        im.show()
    

    在图片上写字

    Draw.text(xy, text, options) 函数可以在Image实例上写字

    • xy 指定的是文本左上角的顶点
    • options 中可用选项:
      • fill = (R, G, B) :指定线条颜色
      • font = ImageFont实例 :指定字体,接收一个ImageFont的实例
    # -*- coding:utf-8 -*-
    from PIL import Image,ImageDraw,ImageFont
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        w,h = im.size
        # 引入字体库
        myFont = ImageFont.truetype('1.ttf',80)
        # 如果不适用myFont字体实例,则使用PIL默认字体
        dr_im.text([0.1 * w,0.8 * h], u"灼眼的夏娜", fill = (255,0,0), font=myFont)
        im.show()
    

    字体效果:
    PIL字体效果

    ImageFont模块

    PIL可以使用OpenType/TrueType字体

    ImageFont.truetype(fontfile, fontsize) 函数可以加载 OpenType/TrueType 字体,后缀名为.ttf,.otf,.ttc字体库文件

    注意使用这个函数需要额外安装_imageingft模块

    还是上面的例子

    # -*- coding:utf-8 -*-
    from PIL import Image,ImageDraw,ImageFont
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        w,h = im.size
        # 引入字体库
        myFont = ImageFont.truetype('1.ttf', 80)
        # 如果不适用myFont字体实例,则使用PIL默认字体
        dr_im.text([0.1 * w,0.8 * h], u"灼眼的夏娜", fill = (255,0,0), font=myFont)
        im.show()
    

    ImageFilter模块

    ImageFilter是PIL滤镜模块,提供了滤波器的相关定义,这些滤波器主要用于Image.filter()方法

    滤镜名称和含义说明:

    • ImageFilter.BLUR :模糊滤镜
    • ImageFilter.CONTOUR :只显示轮廓
    • ImageFilter.EDGE_ENHANCE :边界加强
    • ImageFilter.EDGE_ENHANCE_MORE :边界加强(阀值更大)
    • ImageFilter.EMBOSS :浮雕滤镜
    • ImageFilter.FIND_EDGES :边界滤镜
    • ImageFilter.SMOOTH :平滑滤镜
    • ImageFilter.SMOOTH_MORE :平滑滤镜(阀值更大)
    • ImageFilter.SHARPEN :锐化滤镜

    使用示例:

    # -*- coding:utf-8 -*-
    from PIL import Image,ImageFilter
    
    if __name__ == '__main__':
        im = Image.open('cj_xiana.jpg')
        # 平滑滤镜
        im = im.filter(ImageFilter.SMOOTH)
        im.show()
        # 图像模糊
        im = im.filter(ImageFilter.BLUR)
        im.show()
        # 线条边界加强
        im = im.filter(ImageFilter.EDGE_ENHANCE_MORE)
        im.show()
        # 浮雕滤镜
        im = im.filter(ImageFilter.EMBOSS)
        im.show()
    

    其中浮雕滤镜效果
    PIL浮雕滤镜效果

    全屏截图,区域截图

    ImageGrab.grab方法,可实现全屏截图,区域截图

    可截取屏幕box范围内的图片,默认截取全屏

    示例代码:

    # -*- coding:utf-8 -*-
    from PIL import ImageGrab
    
    # 全屏截屏
    im = ImageGrab.grab()
    im.show()
    # 区域截屏,1000x600图形区域
    ImageGrab.grab((400,100, 1400,700)).show()
    
    

    PIL.ImageGrab.grabclipboard() 方法获取剪切板内的图片

    示例代码:

    from PIL import ImageGrab
    im = ImageGrab.grab()
    im.show()
    im = ImageGrab.grab((10,10,400,400))
    im.show()
    ImageGrab.grabclipboard().show()
    

    一些类方法

    创建图像

    Image.new(mode, size, color) 该方法可以创建指定图像,可在上面进行一些图像操作

    • mode 图像色彩模式
    • size 图像大小
    • color 图像初始颜色

    示例:

    # -*- coding:utf-8 -*-
    from PIL import Image,ImageFont,ImageDraw
    
    if __name__ == '__main__':
        im= Image.new("RGB", (128, 128), "#FFF")
        # 创建Draw类的实例
        dr_im = ImageDraw.Draw(im)
        w,h = im.size
        myFont = ImageFont.truetype('1.ttf', 25)
        dr_im.text([0.1 * w,0.4 * h], u"雷那网", fill = (0,0,0), font=myFont)
        im.show()
    

    图像混合

    Image.blend(image1,image2, alpha) 将两张图像混合, 前提两种图片尺寸和模式一致

    合成方式:out = image1 *(1.0 - alpha) + image2 * alpha

    • 如果变量alpha为0.0,将返回第一张图像的拷贝
    • 如果变量alpha为1.0,将返回第二张图像的拷贝
    # -*- coding:utf-8 -*-
    from PIL import Image
    
    if __name__ == '__main__':
        im1 = Image.open("paste_xiana.jpg")
        im2 = Image.open("m_xiana.jpg")
        im = Image.blend(im1, im2, 0.5)
        im.show()
    

    操作图片像素

    Image.eval(image,function) 使用回调函数处理image图像中每一个像素点

    如果变量image有多个通道,那回调函数将作用于每一个通道

    # -*- coding:utf-8 -*-
    from PIL import Image
    
    def deffun(c):
        # 亮度增强
        return c*1.5
    
    if __name__ == '__main__':
        im = Image.open("cj_xiana.jpg")
        im = Image.eval(im,deffun)
        im.show()
    

    亮度增强效果:
    亮度增强效果

    图像拷贝

    Image.copy()函数

    # -*- coding:utf-8 -*-
    from PIL import Image
    im1 = Image.open("cj_xiana.jpg")
    im2 = im1.copy()
    im2.save("xiana_cp.jpg")
    

    获得图像指定位置像素值

    Image.getpixel(xy)函数,返回给定位置的像素值,如果图像为多通道,则返回一个元组

    # -*- coding:utf-8 -*-
    from PIL import Image
    im1 = Image.open("cj_xiana.jpg")
    print(im1.getpixel((1,1)))
    print(im1.getpixel((649,649)))
    # 输出:
    # (41, 183, 197)
    # (236, 210, 153)
    

    判断文件是否损坏

    Image.getpixel(xy)函数,尝试判断文件是否损坏,如果这个方法发现了任何问题,它将产生对应的异常

    这个方法不能捕获所有的错误,要检查所有错误,必须加载整个图像

    # -*- coding:utf-8 -*-
    
    from PIL import Image
    im = Image.open("cj_xiana.png")
    im.verify()
    # 注:没有任何输出,表示图像im没有损坏
    
    展开全文
  • 安装Python及PIL类库步骤小结

    万次阅读 2016-10-13 22:18:01
    安装Python及PIL类库步骤小结 PIL和Numpy官方暂时没有发布针对python3.x的版本,所以要装这两个类库时注意选择2.x版本。 一、安装Python 1、下载安装软件 https://www.python.org/downloads/release/python-2712/ ...

    安装Python及PIL类库步骤小结

    PIL和Numpy官方暂时没有发布针对python3.x的版本,所以要装这两个类库时注意选择2.x版本。

    一、安装Python

    1、下载安装软件

    https://www.python.org/downloads/release/python-2712/

    根据自己的机器系统版本选择合适的python版本。我是WIN7 64位操作系统,所以选择的是


    安装时注意勾选add python.exe to path.前的小叉叉去掉。同时注意安装好PIP。

    2、打开命令窗口,敲入python后,出现


     安装成功。

    二、安装第三方库

           注意,在windows下安装时,注意电脑系统是多少位的。

    系统32位,python环境也是32位

    系统64位,python环境也要是64位。有人说32位也可以。但我下的是64位。

    然后,确认你的pip是否成功安装。在命令行cmd中输入


    说明pip已经正常安装。

    以后安装库,只需要在命令行输入

    pip install packagename

    若是python 3.x,当然换成输入

    pip3 install packagename


    1、安装Numpy

    命令行窗口输入

    pip install Numpy



    PIP安装Numpy库的时候,提示pip版本比较旧,需要更新版本根据提示更新即可。

    2、安装PIL

           因为官网上http://www.pythonware.com/products/pil/没有win7 64位的版本,所以网友们推荐到http://www.lfd.uci.edu/~gohlke/pythonlibs/


    其实这时已经有了python3.x的版本了。

    命令行窗口键入(假设我下载的PIL文件存放在E盘下,文件名叫Pillow-3.3.1-cp27-cp27m-win_amd64.whl)

    pip  install e:\Pillow-3.3.1-cp27-cp27m-win_amd64.whl

    安装完毕,需要检查一下安装是否成功。

    如下图所示,打开python后,输入importimage,会提示没有这个模块。因为使用pillow库需要使用from PIL import Image代替import Image。按照图中的处理,即可验证PIL是否安装成功。


    有网友说到.jpg文件读取的问题,我安装时还没有遇到。到此为止,算是成功安装了目前学习computervision必备的工具软件了。

    补充:在学习《Python计算机视觉编程》的第一章,可以看见学习此书还涉及Matplotlib、ScriPy(先安装Numpy后再装它),安装方法雷同。皆可以在http://www.lfd.uci.edu/~gohlke/pythonlibs/ 找到上述两个软件包。

    结果后面运行PCV一书中1.4节的例题时,发现问题来了。
    代码运行提示我:require MKL
    方才发现我原来安装的Numpy不带MKL,只得重新到http://www.lfd.uci.edu/~gohlke/pythonlibs/
    下载numpy-1.11.2+mkl-cp27-cp27m-win_amd64.whl至E盘。
    1)重新安装Numpy。
    pip  install e:\ numpy-1.11.2+mkl-cp27-cp27m-win_amd64.whl
    2)重新安装Scipy
    pip  install e:\ scipy-0.18.1-cp27-cp27m-win_amd64.whl
    但是电脑提醒我已经安装过,需要进行升级安装。重新键入:
    pip  install e:\ scipy-0.18.1-cp27-cp27m-win_amd64.whl   --upgrade
    搞定!

    展开全文
  • Python图像处理PIL各模块详细介绍

    万次阅读 多人点赞 2018-01-23 09:13:30
    Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。 open类 Image.open(file) ⇒ image Image.open(file, mode) ⇒ image...

    Image模块

    Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如opensaveconvershow…等功能。

    open类

    Image.open(file) ⇒ image
    Image.open(file, mode) ⇒ image

    要从文件加载图像,使用 open() 函数, 在 Image 模块:

        @zhangziju
        from PIL import Image             ##调用库
        im = Image.open("E:\mywife.jpg")  ##文件存在的路径
        im.show()                         

    我老婆

    需要知道的是在win的环境下im.show的方式为win自带的图像显示应用。打开并确认给定的图像文件。这个是一个懒操作;该函数只会读文件头,而真实的图像数据直到试图处理该数据才会从文件读取(调用load()方法将强行加载图像数据)。如果变量mode被设置,那必须是“r”。用户可以使用一个字符串(表示文件名称的字符串)或者文件对象作为变量file的值。文件对象必须实现read(),seek()和tell()方法,并且以二进制模式打开。

    Save类

    im.save(outfile,options…)
    im.save(outfile, format, options…)

    若要保存文件,则使用 Image 类的 save() 方法,此时保存文件的文件名就变得十分重要了,除非指定格式,否则这个库将会以文件名的扩展名作为格式保存。使用给定的文件名保存图像。如果变量format缺省,如果可能的话,则从文件名称的扩展名判断文件的格式。该方法返回为空。关键字options为文件编写器提供一些额外的指令。如果编写器不能识别某个选项,它将忽略它。用户可以使用文件对象代替文件名称。在这种情况下,用户必须指定文件格式。文件对象必须实现了seek()、tell()和write()方法,且其以二进制模式打开。如果方法save()因为某些原因失败,这个方法将产生一个异常(通常为IOError异常)。如果发生了异常,该方法也有可能已经创建了文件,并向文件写入了一些数据。如果需要的话,用户的应用程序可以删除这个不完整的文件。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im)
    im.save("E:\mywife.png")     ## 将"E:\mywife.jpg"保存为"E:\mywife.png"
    im = Image.open("E:\mywife.png")  ##打开新的png图片
    print(im.format, im.size, im.mode)

    这里写图片描述
    如下图,在指定路径下可看到新保存的png格式的图片。
    新的png图片

    format类

    im.format ⇒ string or None

    这个属性标识了图像来源,如果图像不是从文件读取它的值就是None。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.format) ## 打印出格式信息
    im.show()

    如下图可以看到其format为”JPEG”。

    format

    Mode类

    im.mode ⇒ string

    图像的模式,常见的mode 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像,表明图像所使用像素格式。如下表为常见的nodes描述:

    modes 描述
    1 1位像素,黑和白,存成8位的像素
    L 8位像素,黑白
    P 8位像素,使用调色板映射到任何其他模式
    RGB 3× 8位像素,真彩
    RGBA 4×8位像素,真彩+透明通道
    CMYK 4×8位像素,颜色隔离
    YCbCr 3×8位像素,彩色视频格式
    I 32位整型像素
    F 32位浮点型像素
    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.mode) ## 打印出模式信息
    im.show()

    如下图为图片的mode为“RGB”模式。

    mode

    convert类

    im.convert(mode)⇒ image

    将当前图像转换为其他模式,并且返回新的图像。当从一个调色板图像转换时,这个方法通过这个调色板来转换像素。如果不对变量mode赋值,该方法将会选择一种模式,在没有调色板的情况下,使得图像和调色板中的所有信息都可以被表示出来。当从一个颜色图像转换为黑白图像时,PIL库使用ITU-R601-2 luma转换公式:

    L = R * 299/1000 + G * 587/1000 + B * 114/1000

    当转换为2位图像(模式“1”)时,源图像首先被转换为黑白图像。结果数据中大于127的值被设置为白色,其他的设置为黑色;这样图像会出现抖动。如果要使用其他阈值,更改阈值127,可以使用方法point()。为了去掉图像抖动现象,可以使用dither选项。

    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    new_im = im.convert('P')
    print(new_im.mode)
    new_im.show()

    如下,将图像转换为“P”模式。

    这里写图片描述
    对比原始图像。

    这里写图片描述

    im.convert(“P”,**options) ⇒ image

    这个与第一个方法定义一样,但是当“RGB”图像转换为8位调色板图像时能更好的处理。可供选择的选项为:

    Dither=. 控制颜色抖动。默认是FLOYDSTEINBERG,与邻近的像素一起承担错误。不使能该功能,则赋值为NONE。

    Palette=. 控制调色板的产生。默认是WEB,这是标准的216色的“web palette”。要使用优化的调色板,则赋值为ADAPTIVE。

    Colors=. 当选项palette为ADAPTIVE时,控制用于调色板的颜色数目。默认是最大值,即256种颜色

    im.convert(mode,matrix) ⇒ image

    使用转换矩阵将一个“RGB”图像转换为“L”或者“RGB”图像。变量matrix为4或者16元组。

    
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.mode)
    rgb2xyz = (0.412453,0.357580, 0.180423, 0,
               0.212671,0.715160, 0.072169, 0,
               0.019334,0.119193, 0.950227, 0 )
    new_im = im.convert("L", rgb2xyz)
    print(new_im.mode)
    new_im.show()

    这里写图片描述
    转换后效果

    这里写图片描述

    Size类

    im.size ⇒ (width, height)

    图像的尺寸,按照像素数计算,它的返回值为宽度和高度的二元组(width, height)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size) ## 打印出尺寸信息
    im.show()

    如下图所示为图片的尺寸信息,750*560。

    这里写图片描述

    Palette类

    im.palette ⇒ palette or None

    颜色调色板表格。如果图像的模式是“P”,则返回ImagePalette类的实例;否则,将为None。
    如下为对非“P”模式下的图像进行palette信息显示。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.palette)

    易知,返回值为空,none

    这里写图片描述
    对图像进行convert操作,转换成“P”模式

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    new_im = im.convert('P')
    print(new_im.mode)
    print(new_im.palette)

    则返回值为ImagePalette类的实例。如下:

    这里写图片描述

    Info类

    im.info ⇒ dictionary

    存储图像相关数据的字典。文件句柄使用该字典传递从文件中读取的各种非图像信息。大多数方法在返回新的图像时都会忽略这个字典;因为字典中的键并非标准化的,对于一个方法,它不能知道自己的操作如何影响这个字典。如果用户需要这些信息,需要在方法open()返回时保存这个字典。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.info)

    这里写图片描述

    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。这对向该图像复制或绘制某些内容是有用的。

    如下为将图像设置为128x128大小的红色图像。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128), "#FF0000")
    n_im.show()

    显示效果如下:

    这里写图片描述
    如下图像为128x128大小的黑色图像,因为变量color不赋值的话,图像内容被设置为0,即黑色。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128))
    n_im.show()

    黑
    图像为128x128大小的绿色图像。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128),"green")
    n_im.show()

    这里写图片描述

    Copy类

    im.copy() ⇒ image

    拷贝这个图像。如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。

    
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im_copy = im.copy()

    图像im_copy和im完全一样。

    Crop类

    im.crop(box) ⇒ image

    从当前的图像中返回一个矩形区域的拷贝。变量box是一个四元组,定义了左、上、右和下的像素坐标。用来表示在原始图像中截取的位置坐标,如box(100,100,200,200)就表示在原始图像中以左上角为坐标原点,截取一个100*100(像素为单位)的图像,为方便理解,如下为示意图box(b1,a1,b2,a2)。作图软件为Visio2016。这是一个懒操作。对源图像的改变可能或者可能不体现在裁减下来的图像中。为了获取一个分离的拷贝,对裁剪的拷贝调用方法load()。

    box区域示意图

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    box = (300, 100, 700, 700)              ##确定拷贝区域大小
    region = im.crop(box)                   ##将im表示的图片对象拷贝到region中,大小为box
    region.show()

    如下图为box截取的图像区域显示。

    box区域图

    Paste类

    im.paste(image,box)

    将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    box=[0,0,100,100]
    im_crop = im.crop(box)
    print(im_crop.size,im_crop.mode)
    im.paste(im_crop, (100,100))             ##(100,100,0,0)
    im.paste(im_crop, (400,400,500,500))
    im.show()

    如下图为paste操作:

    这里写图片描述

    Filter类

    im.filter(filter) ⇒ image

    返回一个使用给定滤波器处理过的图像的拷贝。具体参考图像滤波在ImageFilter 模块的应用,在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。

    @zhangziju
    from PIL import Image
    from PIL import ImageFilter                         ## 调取ImageFilter
    imgF = Image.open("E:\mywife.jpg")
    bluF = imgF.filter(ImageFilter.BLUR)                ##均值滤波
    conF = imgF.filter(ImageFilter.CONTOUR)             ##找轮廓
    edgeF = imgF.filter(ImageFilter.FIND_EDGES)         ##边缘检测
    imgF.show()
    bluF.show()
    conF.show()
    edgeF.show()

    滤波处理下的gakki~

    滤波

    Blend类

    Image.blend(image1,image2, alpha) ⇒ image

    使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式。

    合成公式为:out = image1 (1.0 - alpha) + image2 alpha

    若变量alpha为0.0,返回第一张图像的拷贝。若变量alpha为1.0,将返回第二张图像的拷贝。对变量alpha的值无限制。

    @zhangziju
    from PIL import Image
    im1 = Image.open("E:\mywife.jpg")
    im2 = Image.open("E:\mywife2.jpg")
    print(im1.mode,im1.size)
    print(im2.mode,im2.size)
    im = Image.blend(im1, im2, 0.2)
    im.show()

    需保证两张图像的模式和大小是一致的,如下为显示im1和im2的具体信息。

    这里写图片描述
    im1和im2按照第一张80%的透明度,第二张20%的透明度,合成为一张。
    这里写图片描述

    Split

    im.split() ⇒ sequence

    返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)。

    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r,g,b = im.split()
    print(r.mode)
    print(r.size)
    print(im.size)

    这里写图片描述

    Composite类

    Image.composite(image1,image2, mask) ⇒ image

    复合类使用给定的两张图像及mask图像作为透明度,插值出一张新的图像。变量mask图像的模式可以为“1”,“L”或者“RGBA”。所有图像必须有相同的尺寸。

    @zhangziju
    from PIL import Image
    im1 = Image.open("E:\mywife.jpg")
    im2 = Image.open("E:\mywife2.jpg")
    r,g,b = im1.split()             ##分离出r,g,b
    print(b.mode)
    print(im1.mode,im1.size)
    print(im2.mode,im2.size)
    im = Image.composite(im1,im2,b)
    im.show()

    b.mode为”L”,两图尺寸一致。

    这里写图片描述
    最终效果

    这里写图片描述

    Eval类

    Image.eval(image,function) ⇒ image

    使用变量function对应的函数(该函数应该有一个参数)处理变量image所代表图像中的每一个像素点。如果变量image所代表图像有多个通道,那变量function对应的函数作用于每一个通道。注意:变量function对每个像素只处理一次,所以不能使用随机组件和其他生成器。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    def fun01(x):
        return x*0.3
    def fun02(y):
        return y*2.0
    im1_eval = Image.eval(im, fun01)
    im2_eval = Image.eval(im, fun02)
    im1_eval.show()
    im2_eval.show()
    

    在函数fun01和fun02下的图像显示。

    这里写图片描述

    Merge类

    Image.merge(mode,bands) ⇒ image

    合并类使用一些单通道图像,创建一个新的图像。变量bands为一个图像的元组或者列表,每个通道的模式由变量mode描述。所有通道必须有相同的尺寸。
    变量mode与变量bands的关系:

    len(ImageMode.getmode(mode).bands)= len(bands)

    @zhangziju
    from PIL import Image
    im1 = Image.open("E:\mywife.jpg")
    im2 = Image.open("E:\mywife2.jpg")
    r1,g1,b1 = im1.split()
    r2,g2,b2 = im2.split()
    print(r1.mode,r1.size,g1.mode,g1.size)
    print(r2.mode,r2.size,g2.mode,g2.size)
    new_im=[r1,g2,b2]
    print(len(new_im))
    im_merge = Image.merge("RGB",new_im)
    im_merge.show()

    打印信息显示

    这里写图片描述
    merge操作

    这里写图片描述

    Draft类

    im.draft(mode,size)

    配置图像文件加载器,使得返回一个与给定的模式和尺寸尽可能匹配的图像的版本。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size,im.mode)
    new_im = im.draft("L", (200,200))
    print(new_im.size,new_im.mode)
    new_im.show()

    关键信息显示

    这里写图片描述
    转换效果

    这里写图片描述

    Getbands类

    im.getbands()⇒ tuple of strings

    返回包括每个通道名称的元组。例如,对于RGB图像将返回(“R”,“G”,“B”)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getbands())
    

    这里写图片描述

    Getbbox类

    im.getbbox() ⇒ 4-tuple or None

    计算图像非零区域的包围盒。这个包围盒是一个4元组,定义了左、上、右和下像素坐标。如果图像是空的,这个方法将返回空。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getbbox())

    这里写图片描述

    Getdata类

    im.getdata() ⇒ sequence

    以包含像素值的sequence对象形式返回图像的内容。这个sequence对象是扁平的,以便第一行的值直接跟在第零行的值后面,等等。这个方法返回的sequence对象是PIL内部数据类型,它只支持某些sequence操作,包括迭代和基础sequence访问。使用list(im.getdata()),将它转换为普通的sequence。Sequence对象的每一个元素对应一个像素点的R、G和B三个值。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    sequ = im.getdata()
    sequ0 = list(sequ)
    print(sequ0[0])
    print(sequ0[1])
    print(sequ0[2])

    可视化显示sequence0里面的数据。

    这里写图片描述
    打印显示结果,与前面对比。

    这里写图片描述

    Getextrema类

    im.getextrema() ⇒ 2-tuple

    返回一个2元组,包括该图像中的最小和最大值。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getextrema())

    该方法返回了R/G/B三个通道的最小和最大值的2元组。

    这里写图片描述

    Getpixel类

    im.getpixel(xy) ⇒ value or tuple

    返回给定位置的像素值。如果图像为多通道,则返回一个元组。该方法执行比较慢;如果用户需要使用python处理图像中较大部分数据,可以使用像素访问对象(见load),或者方法getdata()。

    @zahngziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getpixel((0,0)))
    print(im.getpixel((4,0)))
    r,g,b = im.split()
    print(b.getpixel((11,8)))   

    这里写图片描述

    Histogram类

    im.histogram()⇒ list

    返回一个图像的直方图。这个直方图是关于像素数量的list,图像中的每个象素值对应一个成员。如果图像有多个通道,所有通道的直方图会连接起来(例如,“RGB”图像的直方图有768个值)。二值图像(模式为“1”)当作灰度图像(模式为“L”)处理。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    imhis = im.histogram()
    print(len(imhis))
    print(imhis[0])
    print(imhis[150])
    print(imhis[300])

    这里写图片描述

    im.histogram(mask)⇒ list

    返回图像中模板图像非零地方的直方图。模板图像与处理图像的尺寸必须相同,并且要么是二值图像(模式为“1”),要么为灰度图像(模式为“L”)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r,g,b = im.split()
    imhis = im.histogram()
    print(r.mode)
    print(len(imhis))
    print(imhis[0])
    print(imhis[150])
    print(imhis[300])

    这里写图片描述

    Load类

    im.load()

    为图像分配内存并从文件中加载它(或者从源图像,对于懒操作)。正常情况下,用户不需要调用这个方法,因为在第一次访问图像时,Image类会自动地加载打开的图像。在1.1.6及以后的版本,方法load()返回一个用于读取和修改像素的像素访问对象。这个访问对象像一个二维队列,如:

    pix = im.load()
    print pix[x, y]
    pix[x, y] =value

    通过这个对象访问比方法getpixel()和putpixel()快很多。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    pix = im.load()
    print(pix[0,2])

    这里写图片描述

    im.paste(colour,box)

    使用同一种颜色填充变量box对应的区域。对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.paste((256,256,0),(0,0,100,100))  ##(256,256,0)表示黄色
    im.show()

    这里写图片描述

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.paste("blue",(0,0,100,100))   ##或者“blue”
    im.show()

    这里写图片描述

    im.paste(image,box, mask)

    使用变量mask对应的模板图像来填充所对应的区域。可以使用模式为“1”、“L”或者“RGBA”的图像作为模板图像。模板图像的尺寸必须与变量image对应的图像尺寸一致。如果变量mask对应图像的值为255,则模板图像的值直接被拷贝过来;如果变量mask对应图像的值为0,则保持当前图像的原始值。变量mask对应图像的其他值,将对两张图像的值进行透明融合,如果变量image对应的为“RGBA”图像,即粘贴的图像模式为“RGBA”,则alpha通道被忽略。用户可以使用同样的图像作为原图像和模板图像

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    box=[300,300,400,400]
    im_crop =im.crop(box)
    r,g,b =im_crop.split()
    im.paste(im_crop, (200,200,300,300), r)
    im.show()

    这里写图片描述

    Putdata类

    im.putdata(data)
    im.putdata(data, scale, offset)

    从sequence对象中拷贝数据到当前图像,从图像的左上角(0,0)位置开始。变量scale和offset用来调整sequence中的值:

    pixel = value*scale + offset

    如果变量scale忽略,则默认为1.0。如果变量offset忽略,则默认为0.0。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r, g, b = im.split()
    print(
    r.getpixel((0, 0)),
    r.getpixel((1, 0)),
    r.getpixel((2, 0)),
    r.getpixel((3, 0)),
    r.putdata([1, 2, 3, 4]),
    r.getpixel((0, 0)),
    r.getpixel((1, 0)),
    r.getpixel((2, 0)),
    r.getpixel((3, 0)),
    )

    这里写图片描述

    Resize类

    im.resize(size) ⇒ image
    im.resize(size, filter) ⇒ image

    返回改变尺寸的图像的拷贝。变量size是所要求的尺寸,是一个二元组:(width, height)。变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。在当前的版本中bilinear和bicubic滤波器不能很好地适应大比例的下采样(例如生成缩略图)。用户需要使用ANTIALIAS,除非速度比质量更重要。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    region = im.resize((400, 400))     ##重新设定大小
    region.show()

    很明显由于大小的重新设定,图片的显示效果有所转变,gakki依然美腻~
    设定大小

    Rotate类

    im.rotate(angle) ⇒ image
    im.rotate(angle,filter=NEAREST, expand=0) ⇒ image

    返回一个按照给定角度顺时钟围绕图像中心旋转后的图像拷贝。变量filter是NEAREST、BILINEAR或者BICUBIC之一。如果省略该变量,或者图像模式为“1”或者“P”,则默认为NEAREST。变量expand,如果为true,表示输出图像足够大,可以装载旋转后的图像。如果为false或者缺省,则输出图像与输入图像尺寸一样大。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im_45 = im.rotate(45)
    im_30 = im.rotate(30, Image.NEAREST,1)
    print(im_45.size,im_30.size)
    im_45.show()
    im_30.show()

    这里写图片描述

    这里写图片描述

    Seek类

    im.seek(frame)

    在给定的文件序列中查找指定的帧。如果查找超越了序列的末尾,则产生一个EOFError异常。当文件序列被打开时,PIL库自动指定到第0帧上。

    @zhangziju
    from PIL import Image
    im_gif = Image.open("E:\mywife.gif")
    print(im_gif.mode)
    im_gif.show()    ##第0帧
    im_gif.seek(3)
    im_gif.show()
    im_gif.seek(9)
    im_gif.show()

    来来来~这是gakki原图欣赏下~

    这里写图片描述
    查找帧seek()的效果如下:

    这里写图片描述

    Tell类

    im.tell() ⇒ integer

    返回当前帧所处位置,从0开始计算。

    @zhangziju
    from PIL import Image
    im_gif = Image.open("E:\mywife.gif")
    print(im_gif.tell())
    im_gif.seek(8)
    print(im_gif.tell())

    这里写图片描述

    Thumbnail类

    im.thumbnail(size)
    im.thumbnail(size, filter)

    修改当前图像,使其包含一个自身的缩略图,该缩略图尺寸不大于给定的尺寸。这个方法会计算一个合适的缩略图尺寸,使其符合当前图像的宽高比,调用方法draft()配置文件读取器,最后改变图像的尺寸。变量filter应该是NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果省略该变量,则默认为NEAREST。注意:在当前PIL的版本中,滤波器bilinear和bicubic不能很好地适应缩略图产生。用户应该使用ANTIALIAS,图像质量最好。如果处理速度比图像质量更重要,可以选用其他滤波器。这个方法在原图上进行修改。如果用户不想修改原图,可以使用方法copy()拷贝一个图像。这个方法返回空。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.thumbnail((100,100))

    Transform类

    im.transform(size,method, data) ⇒ image
    im.transform(size, method, data, filter) ⇒ image

    使用给定的尺寸生成一张新的图像,与原图有相同的模式,使用给定的转换方式将原图数据拷贝到新的图像中。在当前的PIL版本中,参数method为EXTENT(裁剪出一个矩形区域),AFFINE(仿射变换),QUAD(将正方形转换为矩形),MESH(一个操作映射多个正方形)或者PERSPECTIVE。变量filter定义了对原始图像中像素的滤波器。在当前的版本中,变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.EXTENT, (0, 0, 500, 500))
    print(imtra.size)
    imtra.show()

    这里写图片描述

    这里写图片描述

    im.transform(size,EXTENT, data) ⇒ image
    im.transform(size, EXTENT, data, filter) ⇒ image

    从图像中裁剪一个区域。变量data为指定输入图像中两个坐标点的4元组(x0,y0,x1,y1)。输出图像为这两个坐标点之间像素的采样结果。例如,如果输入图像的(x0,y0)为输出图像的(0,0)点,(x1,y1)则与变量size一样。这个方法可以用于在当前图像中裁剪,放大,缩小或者镜像一个任意的长方形。它比方法crop()稍慢,但是与resize操作一样快。

    im.transform(size, AFFINE, data) ⇒ image
    im.transform(size, AFFINE,data, filter) ⇒ image

    对当前的图像进行仿射变换,变换结果体现在给定尺寸的新图像中。变量data是一个6元组(a,b,c,d,e,f),包含一个仿射变换矩阵的第一个两行。输出图像中的每一个像素(x,y),新值由输入图像的位置(ax+by+c, dx+ey+f)的像素产生,使用最接近的像素进行近似。这个方法用于原始图像的缩放、转换、旋转和裁剪。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.AFFINE, (1,2,3,2,1,4))
    print(imtra.size)
    imtra.show()

    这里写图片描述
    这里写图片描述

    im.transform(size,QUAD, data) ⇒ image
    im.transform(size, QUAD, data, filter) ⇒ image

    输入图像的一个四边形(通过四个角定义的区域)映射到给定尺寸的长方形。变量data是一个8元组(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四边形的左上,左下,右下和右上四个角。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.QUAD, (0,0,0,500,600,500,600,0))
    print(imtra.size)
    imtra.show()

    这里写图片描述
    这里写图片描述

    im.transform(size,PERSPECTIVE, data) ⇒ image
    im.transform(size, PERSPECTIVE, data, filter) ⇒ image

    对当前图像进行透视变换,产生给定尺寸的新图像。变量data是一个8元组(a,b,c,d,e,f,g,h),包括一个透视变换的系数。对于输出图像中的每个像素点,新的值来自于输入图像的位置的(a x + b y + c)/(g x + h y + 1), (d x+ e y + f)/(g x + h y + 1)像素,使用最接近的像素进行近似。这个方法用于原始图像的2D透视。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.PERSPECTIVE, (1,2,3,2,1,6,1,2))
    print(imtra.size)
    imtra.show()

    这里写图片描述
    wocao!!!gakki不见了!!!

    这里写图片描述

    Transpose类

    im.transpose(method)⇒ image

    返回当前图像的翻转或者旋转的拷贝。变量method的取值为:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,或ROTATE_270。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.rotate(45)                             #逆时针旋转 45 度角。
    im.transpose(Image.FLIP_LEFT_RIGHT)       #左右对换。
    im.transpose(Image.FLIP_TOP_BOTTOM)       #上下对换。
    im.transpose(Image.ROTATE_90)             #旋转 90 度角。
    im.transpose(Image.ROTATE_180)            #旋转 180 度角。
    im.transpose(Image.ROTATE_270)            #旋转 270 度角。
    展开全文
  • Python图像库PIL的类Image及其方法介绍

    万次阅读 多人点赞 2018-11-29 19:10:59
    Python图像库PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PILPIL历史悠久,原来是只支持python2.x的...
  • PIL 的详细用法

    2018-10-30 15:46:53
    https://blog.csdn.net/zhangziju/article/details/79123275 pip install --user pillow
  • pip安装PIL模块的辛酸

    万次阅读 2015-08-31 14:20:27
    了解到PIL模块是一个图像处理模块库,也没有深入了解,就想着安装上用着试试,结果就掉入了一个坑,话说自己选的路,流着泪也要走完。走完路后,记下这辛酸的过程,装一下。。。 如果已经出错,先卸载pip uninstall...
  • python PIL 打开\显示\保存图像

    千次阅读 2019-05-12 18:55:02
    使用python进行数字图片处理,还...虽然python里面自带一个PIL(python images library), 但这个库现在已经停止更新了,所以使用Pillow, 它是由PIL发展而来的。 pip install Pillow 一、图片的打开与显示 fro...
  • PIL简介

    2017-03-23 20:14:57
    PIL是图像归档和批处理应用程序的理想选择。 您可以使用该库创建缩略图(create thumbnails),在文件格式之间进行转换(convert between file formats),打印图像(print images)等。 当前版本标识并读取大量格式...
  • Python图像处理库PIL中图像格式转换(一)

    万次阅读 多人点赞 2016-03-10 08:16:10
    本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”...
  • python3 怎么安装 PIL

    万次阅读 多人点赞 2019-03-28 21:11:56
    关于Pillow与PIL PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比较大。不过只支持到Python 2.7。 PIL官方网站:http://www.pythonware.com/products/pil/ Pillow是PIL的一个派生分支,...
  • 基于Python的PIL库学习(一)

    万次阅读 多人点赞 2017-04-09 19:14:15
    基于Python的PIL库的学习(一)摘要对于图像识别,大量的工作在于图像的处理,处理效果好,那么才能很好地识别,因此,良好的图像处理是识别的基础。在Python中,有一个优秀的图像处理框架,就是PIL库,本博文会分...
  • Python3.6 安装PIL

    万次阅读 2018-07-17 10:33:52
    PIL是Python平台事实上的图像处理标准库,支持多种格式,并提供强大的图形与图像处理功能。目前PIL的官方最新版本为1.1.7,支持的版本为python 2.5, 2.6, 2.7,并不支持python3,因此我们用pillow代替,进入DOS...
  • Python 利用PIL将图片转为字符

    万次阅读 2016-02-02 20:35:28
    Python 利用PIL将图片转为字符PIL(Python Imaging Library)是Python语言的一个图像处理库,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,而且API非常简单易用,可以用它实现很多图像处理功能。这里...
  • import cv2 import cv2 as cv ...from PIL import Image, ImageFont, ImageDraw import time def paint_chinese_opencv(im, chinese, pos, color): img_PIL = Image.fromarray(cv2.cvtColor(im...
  • 1.从pyCharm提示下载PIL包  http://www.pythonware.com/products/pil/   2.解压后,进入到目录下 cd /Users/jianan/Downloads/Imaging-1.1.7 3.python setup.py install  安装在/Library/Python/2.7/site-...
  • OpenCV、Skimage、PIL图像处理的细节差异

    万次阅读 多人点赞 2018-04-14 20:12:16
    上一篇博客中介绍了caffe实现多label输入,其中有一些图片处理的操作(训练验证数据),当时我选择了PIL库,但是在测试中用了caffe官网demo的代码,它使用了caffe提供的一些python接口,而它调用的是skimage这个库,...
  • from PIL import ImageFont,ImageDraw,Image image=Image.open(‘djjd.jpg’) drawobj=ImageDraw.Draw(image) text=‘hello world’ #位置 文本 颜色 drawobj.text([300,500],text,‘red’) image.show() ....
  • python --- 之pil图像转换的一些方式

    万次阅读 多人点赞 2020-05-31 11:26:44
    本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换。对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。...
  • PIL与Opencv的相互转换

    2020-07-15 19:43:57
    在许多的官方Demo中可以看到有许多图片的处理方式是使用PIL进行的。 在性能比较上,Opencv要比PIL快很多。在得到PIL的Demo后建议修改为Opencv的函数提高效率。 一、函数转换 读取图像 #cv img = cv2.imread(path)...
1 2 3 4 5 ... 20
收藏数 44,996
精华内容 17,998
关键字:

pil