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 += '\n' 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)