图像处理标准库PIL
By 青衣极客 Blue Geek In 2019-12-02
使用python完成图像处理或者计算机视觉的任务时,常常需要一个封装好的图像读取和简单处理的库。很多朋友会使用opencv的python接口或者skimage等等模块,不过还有一个很不错的选择,那就是PIL(Python Image Library)。在python3中提供PIL功能的是Pillow模块,如果还没安装的话,可以直接使用pip指令安装。一些大型的机器学习库其实已经依赖了这个模块,所以在安装那些机器学习模块的时候就自动安装了Pillow。从目前一些著名的第三方库源码中可以看到,PIL的使用是非常广泛的,所以PIL也成为了事实上的python图像处理标准模块。如果需要在项目中使用图像,但是有不便于使用opencv这种庞大的库,那么PIL就是个非常不错的选择。本文根据Pillow的文档,简要介绍一些PIL中几个常用的操作接口,更多的功能可以直接查看文档。
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"
├── 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 ImageFilter
img = Image.open('../data/lena.png')
# 大小变换resize
oim = 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。

COMMENT
博客评论区功能由Github Issue提供,提交Issue时请以本文标题为话题。
"BG50-图像处理标准库PIL"