一. Pillow简介
Pillow作为python的第三方图像处理库,提供了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。
PIL(Python Image Library)是python的第三方图像处理库,因其强大的功能与众多的使用人数,但由于PIL仅支持到Python 2.7,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用Pillow。
需要在命令行下通过pip安装:
pip install Pillow
二. Pillow的基本操作
Pillow中最重要的类是Image,可以通过这个类读取和处理图像,还可以创建图像。
1.使用Image模块中的open函数打开一张图片:
from PIL import Image
# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('cat.jpg')
如果成功,这个函数返回Image对象。您现在可以使用实例属性来检查文件内容:
print(im.format, im.size, im.mode)
JPEG (1920, 1200) RGB
format 定义图像的格式,属为图像来源。如果不是从文件读取就是None。
size属性是一个元组,表示图像的宽度和高度(单位为像素)。
mode属性表示图像的模式,定义了图像中波段的数量和名称,以及像素类型和深度。常见模式为灰度图像为“L”(亮度),真彩色图像为“RGB”,印刷四色为“CMYK”。
如果文件不能打开,则抛出IOError异常。
当有一个Image对象时,就可以利用它来处理操作图像,例如,加载一张图像
2.保存指定格式的图像
save(filename,format) :
上面的代码将图像重新保存成png格式
3.图片转成jpg格式
save函数的第二个参数可以用来指定图片格式,如果文件名中没有给出一个标准的图像格式,那么第二个参数是必须的。
4.剪裁矩形区域 crop(box)
box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。
crop()返回的仍然是一个Image对象。
im = Image.open("cat.jpg","r")
box = (300,300,800,800)
region = im.crop(box)
region.show()
im.crop()
上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来。
5.图像粘贴 paste(region,box,mask)
region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被convert成和region一样的size。
im.paste(region,(100,100),None)
im.show()
上面的代码将region图像粘贴到左上角为(100,100)的位置,效果如图所示:
6.生成缩略图 thumbnail(size,resample)
thumbnail可以创建一个指定大小(size)的缩略图,需要注意的是,thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC。
im.thumbnail((200,200),resample=Image.BICUBIC)
im.show()
上面的代码形成了一个200×200的缩略图。
7.动态图
Pillow支持一些动态图片的格式如FLI/FLC,GIF和其他一些处于实验阶段的格式。TIFF文件同样可以包含数帧图像。
当读取动态图时,PIL自动读取动态图的第一帧,可以使用seek和tell方法读取不同帧。
当读取到最后一帧时,Pillow抛出EOFError异常。
或者可以使用下述迭代器类
动态图迭代器类
class ImageSequence:
def __init__(self, im):
self.im = im
def __getitem__(self, ix):
try:
if ix:
self.im.seek(ix)
return self.im
except EOFError:
raise IndexError # end of sequence
for frame in ImageSequence(im):
# ...do something to frame...
8.旋转和翻转 transpose(method)
method是transpose的参数,表示选择什么样的翻转或者旋转方式,可以选择的值有:
- Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
- Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
- Image.ROTATE_90,表示将图像逆时针旋转90°
- Image.ROTATE_180,表示将图像逆时针旋转180°
- Image.ROTATE_270,表示将图像逆时针旋转270°
- Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
- Image.TRANSVERSE,表示将图像进行转置,再水平翻转
im_rotate_180 = im.transpose(Image.ROTATE_180)
im_rotate_180.show()
上面的代码将im逆时针旋转180°,然后显示出来。
9.分离和合并通道
分离 im.split()
合并 Image.merge(mode,channels), 将多个单一通道的序列合并起来,组成一个多通道的图像,mode是合并之后图像的模式,比如"RGB",channels是多个单一通道组成的序列。
对于单通道图片,split()返回图像本身。为了处理单通道图片,必须先将图片转成RGB。
10.颜色模式转换
convert(mode,matrix,dither,palette,colors)
convert方法可以改变图像的模式(mode),一般是在'RGB'(真彩图)、'L'(灰度图)、'CMYK'(压缩图)之间转换。
im_L = im.convert ("L")
im_L .show()
上面的代码就是将图像转化为灰度图。
11.图像过滤器 filter(filter)
filter方法可以将一些过滤器操作应用于原始图像,比如模糊,边缘增强、浮雕等。filter是过滤器函数,在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(普通模糊),GaussianBlur(高斯模糊) FIND_EDGES(查找边)等
from PIL import Image ImageFilter
im = Image.open('cat.jpg')
# 高斯模糊
im_gaussianblur = im.filter(ImageFilter.GaussianBlur)
im_gaussianblur.show()
# 普通模糊
im_blur = im.filter(ImageFilter.BLUR)
im_blur.show()
# 找到边缘
im_find_edge = im.filter(ImageFilter.FIND_EDGES)
im_find_edges.show()
# 浮雕
im_emboss = im.filter(ImageFilter.EMBOSS)
im_emboss.show()
# 轮廓
im_contour = im.filter(ImageFilter.CONTOUR)
im_contour.show()
# 锐化
im_sharpen = im.filter(ImageFilter.SHARPEN)
im_sharpen.show()
# 平滑
im_smooth = im.filter(ImageFilter.SMOOTH)
im_smooth.show()
# 细节
im_detail = im.filter(ImageFilter.DETAIL)
im_detail.show()
12.图像增强ImageEnhance()
图像增强也是图像预处理中的一个基本技术,Pillow中的图像增强函数主要在ImageEnhance模块下,通过该模块可以调节图像的白平衡(Color)、亮度(Brightness)、对比度(Contrast)和锐化(Sharpness)等。
from PIL import Image
Enhance
brightness = ImageEnhance.Brightness(im)
im_brightness = brightness.enhance(1.5)
im_brightness.show()
上面的代码将原来图像的亮度增加50%。
引自:
https://www.cnblogs.com/apexchu/p/4231041.html
感谢!