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)

 

 

 

原文地址:https://www.cnblogs.com/Lincoln-Wong/p/12699605.html