nodejs 图片处理模块 rotate_闲话python 47: 图像处理标准库PIL

使用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
50b8bb31a9e4f024db0effb7e159fe2f.png

保存到文件的照片

生成缩略图的代码演示如下:

# 获取缩略图img.thumbnail((100, 100))# 保存图像到jpg文件img.save('../../output/res_lena_thumbnail.png')# 查看保存结果路径!tree ../../output/ | grep "lena"

在notebook中运行,显示输入:

├── res_lena.png├── res_lena_thumbnail.png
d0f473af30a12a72b2852b72da5df38b.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')

经过这一轮简单操作后得到的图像如下:

bc2921ff0c867061cc194733ec51a950.png

简单操作的结果

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')
eb156262170b1e2d8dc8632e38da7196.png

resize之后的图像

(2) 旋转变换

# 旋转变换oim = img.rotate(45) #逆时针旋转45度oim.show()oim.save('../../output/res_lena_rotate.png')
baa3ba84855137242278bcb73cf6be78.png

旋转后的图像

(3) 颜色变换

# 颜色空间变换oim = img.convert('L') # 灰度化oim.show()oim.save('../../output/res_lena_L.png')
76b9bfd6866f039f39ba7b4a246803fa.png

灰度化之后的图像

(4) 滤波器

# 滤波器oim = img.filter(ImageFilter.EDGE_ENHANCE) # 边缘增强oim.show()oim.save('../../output/res_lena_filter.png')
f1b2dd545f093b17b055564eb3ef87b1.png

边缘增强滤波后的图像

关于PIL简单的使用介绍就到这里了。我曾经为加载图像寻找了好几个第三方库,只需要使用一点功能就把opencv搬出来实在是心有不甘。后来找到了skimage系列的工具,虽然也可以使用,但是由于各种原因总用得不太顺手。阅读本文的朋友就不需要再浪费时间在这些库的尝试中了,小功能直接使用PIL。本文的notebook版本在github上的cnbluegeek/notebook仓库中共享,欢迎感兴趣的朋友前往下载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值