PIL全称Python Image Library,是python官⽅的图像处理库,包含各种图像处理模块。Pillow是PIL的⼀个派⽣分⽀,包含与PIL相同的功能,并且更灵活。python3.0之后,PIL不再更新,pillow代替了它原有的地位。Pillow的官⽅⽂档: 在调⽤pillow时,代码依然是写成PIL,模块导⼊⽅式如下:
from PIL import Image,ImageFilter
下⾯介绍基本⽤法。
Image
Image是pillow最基本的模块,包含⽤于保存图像对象的类。
图像导⼊、旋转、显⽰、保存
from PIL import Imageimg = 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 npfrom PIL import Imageimg = Image.open('1.jpg') a = np.array(img)
print(a.shape, a.dtype)
对于读取的图像,在Image对象中,图像默认以RGB模式保存,且各个像素值默认⽤ 8bit 的⽆符号整型来存,不论图像以什么类型保存。因此转换为array后dtype是uint8,不像matplotlib,png是float32,⽽jpg是uint8。其它图像模式看官⽅⽂档:
array到Image
import numpy as npfrom PIL import Image
a = np.random.random([256,256,3])*255a = 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 pltfrom 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。所以这个函数的实现有点问题,和其它的特性不同,容易导致出错,最好少⽤。
直接缩放
img = img.resize([128,128],Image.BICUBIC,box = (10,50,1200,1000))
三个参数分别表⽰:⽬标⼤⼩ (宽,⾼),采样⽅式,⽤于缩放的图像区域。
图像混合
⽆透明通道
from PIL import Image
img1 = Image.open('1.jpg') img2 = Image.open('2.jpg')
img = Image.blend(img1,img2,0.5)img.show()
将两张图像按α:(1−α)的透明度混合,α可以不在(0,1)内,结果像素值会裁剪到合理范围内。显⽰结果如下:
有透明通道
img = Image.alpha_composite(img1,img2)
其中两张图像必须都有α通道。
⾃定义混合
import numpy as npfrom PIL import Image
img1 = Image.open('1.jpg')
img2 = Image.open('2.jpg')
mask = np.ones([img1.size[1],img1.size[0]],dtype=np.uint8)mask[:,img1.size[0]//2:] *= 175mask[:,:img1.size[0]//2] *= 80mask = Image.fromarray(mask)
img = Image.composite(img1,img2,mask)img.show()
composite函数使⽤mask对两张图像进⾏混合,从⽽不同的位置可以定义不同的透明度,以上代码效果如下:
单像素处理
from PIL import Imageimport numpy as np
img = Image.open('1.jpg')
img = Image.eval(img, lambda x : x*np.random.rand()*2)img.show()
eval第⼆个参数传⼊对单⼀像素的操作,这个操作会作⽤在整张图像的每个像素值上。效果如下:
旋转、镜像
from PIL import Imageimg = Image.open('1.jpg') img = img.transpose(1)img.show()
transpose 有0~6共7个输⼊,代表图像7个旋转、镜像⽅向,加上原图,⼀共8个⽅向。
ImageFilter
这个模块⽤于图像的滤波处理。⽤法也是基于Image模块。基本⽤法如下:
from PIL import Image,ImageFilter
img = Image.open('1.jpg')
img = img.filter(ImageFilter.GaussianBlur(5)) img.show()
将ImageFilter的函数作为参数输⼊filter中。还有很多种滤波⽅式,不⼀⼀列举。
其它模块
ImageEnhance:⽤于图像增强,如锐化、增亮。 ImageGrab:⽤于截屏或读取剪贴板获取图像。 ImageDraw:⽤于绘制简单的线条和标记。
还有很多模块,但感觉⽤起来还不如numpy+matplotlib⽅便,不在此记录,有需要请看官⽅⽂档。
Processing math: 100%
因篇幅问题不能全部显示,请点此查看更多更全内容