• Python 之 PIL库的学习


      PIL(Python Image Library)是python的第三方图像处理库,支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。

     

    PIL库可以做很多和图像处理相关的事:

    • 图像归档:图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
    • 图像处理:PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。

     

    Image类

      在PIL中,任何一个图像文件都可以用Image对象表示Image类的图像读取和创建方法:

    方法 描述
    Image.open(filename) 根据参数加载图像文件
    Image.open(StringIO.StringIO(buffer))

    从字符串中获取图像

    Image.new(mode, size, color)

    根据给定参数创建一个新的图像

    Image.frombytes(mode, size, data)

    根据像素点data创建图像

    Image.verify()

    对图像文件完整性进行检查,返回异常

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

     

    from PIL import Image             ##调用库,包含图像类
    im = Image.open("3d.jpg")      ##文件存在的路径,如果没有路径就是当前目录下文件
    im.show()

     处理图片的常用属性:

      

    属性 描述

    Image.format

    标识图像格式或来源,如果图像不是从文件读取,值是None

    Image.mode

    图像的色彩模式,"L"灰度图像、"RGB"真彩色图像、"CMYK"出版图像

    Image.size

    图像宽度和高度,单位是像素(px),返回值是二元元组(tuple)

    Image.palette

    调色板属性,返回一个ImagePalette类型

     

     图像转换和保存方法:

     

    方法 描述

    Image.save(filename, format)

    将图像保存为filename文件名,format是图片格式

    Image.convert(mode)

    使用不同的参数,转换图像为新的模式

    Image.thumbnail(size)

    创建图像的缩略图,size是缩略图尺寸的二元元组

     这里附上创建缩略图的方法......

    1 from PIL import Image
    2 roots = "c:\Users\Administrator\Desktop\scene1.jpg"     #我这里用的是图片的绝对路径, 也可以使用相对于当前py文件所在文件夹的相对路径
    3 im = Image.open(roots)         #读取照片
    4 im.thumbnail((128, 128))       #生成尺寸为(128, 128)的缩略图
    5 im.save("c:\Users\Administrator\Desktop\scene1_tb.jpg")       #缩略图保存名为scene1_tb的jpg图片文件

     这样就将一张图片变成尺寸较小的缩略图了......

     

            

      图像缩放、旋转以及对每个像素点或者一幅RGB图像的每个通道单独进行操作:

     

    方法 描述
    Image.resize(size) 按size大小调整图像,生成副本

    Image.rotate(angle)

    按angle角度旋转图像,生成副本

    Image.point(func)

    根据函数func功能对每个元素进行运算,返回图像副本

    Image.split()

    提取RGB图像的每个颜色通道,返回图像副本

    Image.merge(mode,bands)

    合并通道 ,采用mode色彩,bands是新色的色彩通道

    Image.blend(im1,im2,alpha)

    将两幅图片im1和im2按照如下公式插值后生成新的图像: im1 * (1.0-alpha) + im2 * alpha

     

     

     这张是原图,以下要对这张图片进行改变颜色,轮廓,浮雕操作......

     

     

     改变颜色:

    1 from PIL import Image
    2 roots = "c:\Users\Administrator\Desktop\scene2.jpg"     #图片的路径
    3 im = Image.open(roots)         #读取照片
    4 r, g, b = im.split()           #获得RGB各通道数据
    5 r_new = r.point(lambda x: x*1.2)             #将R通道颜色值变为原来的1.5倍
    6 b_new = b.point(lambda x: x*0.8)             #将B通道颜色值变为原来的0.8倍
    7 merge = Image.merge(im.mode, (r_new, g, b_new))            #合并通道, 形成新图像
    8 merge.save("c:\Users\Administrator\Desktop\scene2_mg.jpeg")     #保存为jpeg图片文件

    轮廓与浮雕等操作需要使用ImageFilter类和ImageEnhance类(PIL库的ImageFilter类和ImageEnhance类提供了过滤图像和增强图像的方法) 

    from PIL import ImageFilter

     

    利用Image类的filter()方法可以使用ImageFilter类,如下: Image.filter(ImageFilter.fuction) 

    • ImageFilter.CONTOUR:图像的轮廓效果

     

    1 from PIL import Image
    2 from PIL import ImageFilter
    3 roots = "c:\Users\Administrator\Desktop\scene2.jpg"     #图片的路径
    4 im = Image.open(roots)         #读取照片
    5 om = im.filter(ImageFilter.CONTOUR)
    6 om.save("c:\Users\Administrator\Desktop\scene2_CT.jpg")     #保存为jpg图片文件

     

    • ImageFilter.EMBOSS:图像的浮雕效果

    1 from PIL import Image
    2 from PIL import ImageFilter
    3 roots = "c:\Users\Administrator\Desktop\scene2.jpg"     #图片的路径
    4 im = Image.open(roots)         #读取照片
    5 om = im.filter(ImageFilter.EMBOSS)                  #浮雕
    6 om.save("c:\Users\Administrator\Desktop\scene2_EB.jpg")     #保存为jpg图片文件

    提取GIF每一帧的图像:

     

     1 from PIL import Image
     2 roots = "c:\Users\Administrator\Desktop\pic1.gif"     #gif路径
     3 im = Image.open(roots)           #读取gif文件
     4 try:
     5     im.save("c:\Users\Administrator\Desktop\picframe{:02d}.png".format(im.tell()))
     6     while True:
     7         im.seek(im.tell()+1)     #tell()函数用于判断文件指针当前所处的位置,而seek()函数用于移动文件指针到文件的指定位置。
     8         im.save("c:\Users\Administrator\Desktop\picframe{:02d}.png".format(im.tell()))
     9 except:
    10     print('处理结束')

    图像字符画绘制

     1 from PIL import Image
     2 roots = "c:\Users\Administrator\Desktop\pic2.jpg"     #图片的路径
     3 ascii_char =list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjf
     4 1234568795t/|()1{}[]?-_+~<>i!;:,"^`'.")
     5 
     6 def get_char(r, b, g, alpha=256):
     7     if alpha == 0:
     8         return ' '
     9     gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)    
    10     unit = 256 / len(ascii_char)
    11     return ascii_char[int(gray//unit)]
    12 def main():
    13     im = Image.open(roots)
    14     WIDTH, HEIGHT = 400, 300
    15     im = im.resize((WIDTH, HEIGHT))
    16     txt = ""
    17     for i in range(HEIGHT):
    18         for j in range(WIDTH):
    19             txt += get_char(*im.getpixel((j, i))) #getpixel函数是用来获取图像中某一点的像素的RGB颜色值,getpixel的参数是一个坐标点。对于图象的不同的模式,getpixel函数返回的值有所不同。
    20         txt += '
    '
    21     fo = open("pic_char.txt","w")
    22     fo.write(txt)
    23     fo.close()
    24 main()

         

    制作一个有趣的gif文件(为了方便我就直接使用以上提取出来的每帧图像来生成gif)

     

     1 import imageio
     2 img_paths = []                #源图像列表, 作为gif动图的每一帧
     3 gif_images = []               #创建一个空列表,用来存源图像
     4 imgs = ''
     5 duration = 0.15                #两帧之间的时间间隔,秒为单位
     6 for i in range(6):
     7     imgs = 'c:\Users\Administrator\Desktop\' + 'picframe0' + str(i) + '.png'
     8     img_paths.append(imgs)                  
     9 
    10 for path in img_paths:
    11     gif_images.append(imageio.imread(path))          #利用方法append把自己收集的图片挨个存进列表
    12 
    13 #保存为gif格式的图(注意: 源图像仅仅支持png格式的图片)
    14 imageio.mimsave('c:\Users\Administrator\Desktop\new_gif.gif', gif_images, duration = duration)

     

     

     

  • 相关阅读:
    HDU 1285 确定比赛名次(拓扑排序模板)
    POJ 1679 The Unique MST(次小生成树)
    POJ 3026 Borg Maze(Prim+bfs求各点间距离)
    POJ 2349 Arctic Network(最小生成树+求第k大边)
    POJ 3169 Layout (spfa+差分约束)
    给定两个list A ,B,请用找出 A ,B中相同的元素,A ,B中不同的元素 ??
    什么是http协议??
    Python2中range 和xrange的区别??
    死锁 ??
    调度算法 ??
  • 原文地址:https://www.cnblogs.com/Lincoln-Wong/p/12699605.html
Copyright © 2020-2023  润新知