python中pil库_Python 之 PIL库的学习

本文详细介绍了Python的PIL库,用于图像处理,包括图像归档、批处理、模式转换等功能。通过Image类,可以进行图像读取、创建、缩放、旋转、颜色调整等操作。此外,还展示了如何使用PIL进行图像的轮廓和浮雕效果,以及从GIF中提取帧并创建ASCII字符画和GIF动画。
摘要由CSDN通过智能技术生成

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值