常用 Python 数字处理图像库
图像处理中的常见任务包括显示图像,基本操作如裁剪、翻转、旋转等,图像分割,分类和特征提取,图像恢复和图像识别。常用的基于 python 脚本语言开发的数字图片处理库有以下几种,比如 PIL,Pillow, opencv, scikit-image 等。(PIL 是针对 python2, pillow 是针对 python3,两者功能一样。)
Pillow 只提供最基础的数字图像处理,功能有限;opencv 实际上是一个 c++ 库,只是提供了 python 接口,更新速度非常慢。scikit-image 是基于 scipy 的一款图像处理库,它将图片表示为数组(NumPy arrays)进行处理,正好与matlab一样。Image 读出来的是 PIL 的类型。而skimage.io读出来的数据是numpy格式的,这方便我们与 TensorFlow 框架对接。因此,我最开始选择 scikit-image 进行数字图像处理。
注意本文只是简单的介绍了下 skimage 库的基本用法,包括子模块 data 和 io 加载图像并获取图像信息,更多信息请参考官网教程。
基本使用
模块导入
scikit-image 是一个将图像作为 numpy array 格式处理的 Python 包。该包被导入为 skimage
。(为了方便,后续内容我只写简称 skimage)
>>> import skimage
子模块和函数列表
skimage包由许多的子模块组成,各个子模块提供不同的功能。主要子模块列表如下,这个网页提供了全部的子模块和函数列表。
基本操作
在 skimage 子模块中,我们可以找到绝大多数数字图像处理的功能。对于读取外部图片并显示,skimage 提供了 io 子模块,顾名思义,这个模块是用来图片输入输出操作的。为了方便练习,skimage 提供 data 子模块,里面嵌套了一些示例图片,我们可以直接使用。
下面是 data 子模块的用法:
- >>> from skimage import data #导入data子模块
- >>> camera = data.camera() #create camera image,return (512, 512) uint8 ndarray
一要记住,在 scikit-image 中,图像表示为 NumPy 阵列,例如用于灰度图像的为2-D(2维)矩阵。代码示例:
- >> import skimage
- >> from skimage import data #create camera image,return (300, 451, 3) uint8 ndarray
- >> camera = data.camera()
- >> print(type(camera)) #显示图像的数据类型
- >>> print(camera.shape) #显示图像的尺寸
代码解释:skimage.data 子模块提供了一组返回示例图像的函数,可用于快速操作图像文件。也可以使用 skimage.io.imread()
从外部文件中读取图像文件,并作为 Numpy数组加载。
- >>> import os
- >>> filename = os.path.join(skimage.data_dir, 'moon.png')
- >>> from skimage import io
- >>> moon = io.imread(filename)
- >>> print('The image moon data\n',moon)
参考链接
http://scikit-image.org/docs/stable/user_guide/getting_started.html