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 importImage2 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 importImage2 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 importImage2 from PIL importImageFilter3 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 importImage2 from PIL importImageFilter3 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 importImage2 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 whileTrue: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 importImage2 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 defmain():13 im =Image.open(roots)14 WIDTH, HEIGHT = 400, 300
15 im =im.resize((WIDTH, HEIGHT))16 txt = ""
17 for i inrange(HEIGHT):18 for j inrange(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 importimageio2 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 inimg_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)