使用python完成图像处理或者计算机视觉的任务时,常常需要一个封装好的图像读取和简单处理的库。很多朋友会使用opencv的python接口或者skimage等等模块,不过还有一个很不错的选择,那就是PIL(Python Image Library)。在python3中提供PIL功能的是Pillow模块,如果还没安装的话,可以直接使用pip指令安装。一些大型的机器学习库其实已经依赖了这个模块,所以在安装那些机器学习模块的时候就自动安装了Pillow。从目前一些著名的第三方库源码中可以看到,PIL的使用是非常广泛的,所以PIL也成为了事实上的python图像处理标准模块。如果需要在项目中使用图像,但是有不便于使用opencv这种庞大的库,那么PIL就是个非常不错的选择。本文根据Pillow的文档,简要介绍一些PIL中几个常用的操作接口,更多的功能可以直接查看文档。本文的所有代码都是在notebook下运行,使用的demo图像是图像处理领域的著名样本lena。
1. 读写图像
如果只是需要读写图像,使用opencv的话就显得太沉重,在发布和部署时也不方便。这一功能需求完全可以使用PIL这个更加轻量级的模块实现。除了基本的读取图像文件和保存图像到文件这两个操作外,PIL还提供了缩略图生成的功能,这在一些图像展示的应用中比较常用。毕竟展示大量图片时,没有必要浪费存储空间来保留完整的分辨率信息,只需使用缩略图展示图片大体的内容即可。
from PIL import Image# 读取图像img = Image.open('../../data/lena.png')print('img.format={}, img.size={}, img.mode={}'.format( img.format, img.size, img.mode))# 显示图像img.show()img.save('../../output/res_lena.png')
输出结果如下:
img.format=PNG, img.size=(885, 885), img.mode=RGBA
生成缩略图的代码演示如下:
# 获取缩略图img.thumbnail((100, 100))# 保存图像到jpg文件img.save('../../output/res_lena_thumbnail.png')# 查看保存结果路径!tree ../../output/ | grep "lena"
在notebook中运行,显示输入:
├── res_lena.png├── res_lena_thumbnail.png
2. 简单图像操作
简单的图像操作包括截图、粘贴以及合并通道。PIL提供了比较方便和直观的操作接口来完成这些简单的图像操作。
# 截取一个区域img = Image.open('../../data/lena.png')box = (150, 150, 650, 650)reg = img.crop(box)# 旋转180度reg = reg.transpose(Image.ROTATE_180)# 粘贴到指定位置img.paste(reg, box)img.show()# 通道分离r,g,b,_ = img.split()# 合并RGB通道img = Image.merge('RGB', (r,g,b))img.save('../../output/res_lena_crop.jpg', 'JPEG')
经过这一轮简单操作后得到的图像如下:
3. 图像变换
图像处理中常常需要进行几何变换和图像滤波,这种通用的底层操作是一些复杂图像处理功能的基础。下面演示大小变化、旋转变化、图像灰度化以及使用滤波器对图像进行增强。
(1) 大小变换
from PIL import ImageFilterimg = Image.open('../../data/lena.png')# 大小变换resizeoim = img.resize((128, 128))oim.show()oim.save('../../output.res_lena_resize.png')
(2) 旋转变换
# 旋转变换oim = img.rotate(45) #逆时针旋转45度oim.show()oim.save('../../output/res_lena_rotate.png')
(3) 颜色变换
# 颜色空间变换oim = img.convert('L') # 灰度化oim.show()oim.save('../../output/res_lena_L.png')
(4) 滤波器
# 滤波器oim = img.filter(ImageFilter.EDGE_ENHANCE) # 边缘增强oim.show()oim.save('../../output/res_lena_filter.png')
关于PIL简单的使用介绍就到这里了。我曾经为加载图像寻找了好几个第三方库,只需要使用一点功能就把opencv搬出来实在是心有不甘。后来找到了skimage系列的工具,虽然也可以使用,但是由于各种原因总用得不太顺手。阅读本文的朋友就不需要再浪费时间在这些库的尝试中了,小功能直接使用PIL。本文的notebook版本在github上的cnbluegeek/notebook仓库中共享,欢迎感兴趣的朋友前往下载。