PIL库如何为?

摘要:PIL全称Python Image Library,是python官方的图像处理库,包含各种图像处理模块。Pillow是PIL的一个派生分支,包含与PIL相同的功能,并且更灵活。python3.0之后,PIL不再更新,pillow代替了它原
PIL全称Python Image Library,是python官方的图像处理库,包含各种图像处理模块。Pillow是PIL的一个派生分支,包含与PIL相同的功能,并且更灵活。python3.0之后,PIL不再更新,pillow代替了它原有的地位。Pillow的官方文档:   https://pillow.readthedocs.io/en/stable/reference/index.html   在调用pillow时,代码依然是写成PIL,模块导入方式如下: from PIL import Image,ImageFilter   下面介绍基本用法。 Image   Image是pillow最基本的模块,包含用于保存图像对象的类。 图像导入、旋转、显示、保存 from PIL import Image img = Image.open('1.jpg') img = img.rotate(45) img.show() img.save('r.jpg')   图像导入后保存为Image对象,该对象自带各种函数,包括图像处理操作、显示、保存等功能,大部分操作返回的依然是Image对象。需要注意的是,open函数执行的时候并没有立即把图像像素数据导入,仅仅是对图像文件添加占用标记,直到图像真正需要用于计算时,才会把像素数据导入。以上代码结果如下: Numpy.array与Image之间的转换 Image到array import numpy as np from PIL import Image img = Image.open('1.jpg') a = np.array(img) print(a.shape, a.dtype)   对于读取的图像,在Image对象中,图像默认以RGB模式保存,且各个像素值默认用 8bit 的无符号整型来存,不论图像以什么类型保存。因此转换为array后dtype是uint8,不像matplotlib,png是float32,而jpg是uint8。其它图像模式看官方文档:   https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes array到Image import numpy as np from PIL import Image a = np.random.random([256,256,3])*255 a = np.array(a,dtype = np.uint8) img = Image.fromarray(a) img.show()   array必须先将数据类型转换到uint8才能转换成Image,否则会出错,尽管文档中写着能有限地支持浮点类型。 图像模式转换 from PIL import Image img = Image.open('1.jpg').convert('1') img.show()   以上代码将Image模式从RGB转换为1,也就是黑白两色。效果如下:   图像转换后,Image对象所对应的像素值以及对应的数据类型也就变了。显示的时候,Pillow会以对应的模式来显示。可以做如下实验,先将图像转变为YCbCr模式,然后分别直接显示和转变成array后在matplotlib中显示,代码如下: import numpy as np import matplotlib.pyplot as plt from PIL import Image img = Image.open('1.jpg').convert('YCbCr') img.show() # 直接显示 img = np.array(img) plt.imshow(img)# matplotlib中显示 plt.axis('off') plt.show()   两个效果分别如下:   可以看出,pillow 对转换成 YCbCr 模式的图像能以对应的模式显示,而因为 matplotlib 是以RGB模式来显示的,因此 YCbCr 模式的图像会呈现右图效果。 图像缩放 等比例缩放 from PIL import Image size = 80,80 img = Image.open('1.jpg') img.thumbnail(size) img.show()   按等比例缩小图像,长宽都小于等于size。需要注意的是,这个操作是直接作用与原对象上,返回为None。而通常的操作则是返回处理得到的新对象,原对象不改变,比如上面的rotate。所以这个函数的实现有点问题,和其它的特性不同,容易导致出错,最好少用。
阅读全文