如今,数据遍布各个角落,图像则是数据的重要组成部分。但图像无论有何用途,都要经过处理。因此,图像处理就是对数字图像进行分析、操作的过程,其主要目的是为改善图像质量或从中提取一些有用信息。
图像处理的常见任务包括图像显示、图像基本操作(裁剪、翻转、旋转等)、图像分割、分类及特征提取、图像修复和图像识别。而Python作为一种科学编程语言已在日渐普及,在生态系统库中还免费提供了许多最为先进的图像处理工具,因此成为了图像处理的最佳选择。
图片来源:Luriko Yamaguchi/Pexels
下面将介绍一些可用于图像处理的常用Python库。
1. scikit Image
scikit-image是Python的一个开源包,将图片作为numpy数组进行处理。它使算法和实用程序得以用于研究、教育和行业应用领域。即便是对不熟悉Python生态环境的人来说,这个库也十分简单明了。此代码由一个活跃的志愿者团队编写,质量很高且已经审阅。
资源:http://scikit-image.org/docs/stable/user_guide.html
用法:该包作为skimage导入,大多数功能都可在子模块找到。例如:
(1) 图像过滤
- import matplotlib.pyplot as plt %matplotlib inline
- from skimage import data,filters
- image = data.coins()# ... or any other NumPy array!edges = filters.sobel(image)plt.imshow(edges, cmap='gray')
(2) 使用match_template函数进行模板匹配
更多示例传送门:https://scikit-image.org/docs/dev/auto_examples
2. Numpy
Numpy是Python编程的一个核心库,为数组提供支持。图像本质上是包含数据像素点的标准Numpy数组。因此,通过使用基本的NumPy操作,例如切片、掩膜和匹配索引,可以修改图像的像素值。也可以用skimage加载图像,用matplotlib显示图像。
资源:http://www.numpy.org/
用处:使用Numpy来实现图像掩膜。
- import numpy as npfrom skimage import dataimport matplotlib.pyplot as plt %matplotlib inline
- image = data.camera()type(image)
- numpy.ndarray #Image is a numpy array
- mask = image < 87image[mask]=255plt.imshow(image, cmap='gray')
3. Scipy
和Numpy一样,scipy是Python的另一个核心模块,可用于图像的基本处理和加工。 特别是子模块scipy.ndimage提供了可在n维NumPy数组上运行的函数。该包目前包括线性和非线性滤波法、二值图像形态学、B样条插值和对象测量等功能。
资源:
https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html#correlation-and-convolution
用处:
使用SciPy的高斯滤波对图片进行模糊处理:
- from scipy import misc,ndimage
- face = misc.face()blurred_face = ndimage.gaussian_filter(face, sigma=3)very_blurred = ndimage.gaussian_filter(face, sigma=5)
- #Resultsplt.imshow(<image to be displayed>)
4. PIL/ Pillow
PIL(Python图像处理库)是一个免费的Python编程语言库,支持打开、处理和保存多种格式的图像文件。但它的发展早已停滞不前,最新一次发布还是在2009年。所幸还有Pillow这个积极开发的PIL分支,而且它安装起来更容易,还可以在所有主操作系统上运行,并支持Python 3。该库包含点操作、使用一组内置卷积内核进行图像过滤以及颜色空间转换这些基本的图像处理功能。
资源:https://pillow.readthedocs.io/en/3.1.x/index.html
用处:使用Pillow中的ImageFilter增强图像:
- from PIL import Image, ImageFilter#Read imageim = Image.open( 'image.jpg' )#Display imageim.show()
- from PIL import ImageEnhanceImageEnhanceenh = ImageEnhance.Contrast(im)enh.enhance(1.8).show("30% more contrast")
更多资源传送门:http://sipi.usc.edu/database/
5. OpenCV-Python
OpenCV(开源计算机视觉库)是计算机视觉应用中使用最为广泛的库之一。OpenCV-Python是OpenCV的python接口。OpenCV-Python不只是因为后台由用C / C ++编写的代码组成而速度快,还因为前端的Python包装器使得编码和部署容易。因此,它成为了计算密集型计算机视觉程序的绝佳选择。
资源:https://github.com/abidrahmank/OpenCV2-Python-Tutorials
用处:下图中,OpenCV-Python在图像融合中使用图像金字塔创建了一个名为‘Orapple’的新型水果。
代码传送门:
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_pyramids/py_pyramids.html#pyramids
6. SimpleCV
SimpleCV也是用于构建计算机视觉应用程序的一个开源框架。使用SimpleCV,可以不必事先了解位深、文件格式、色彩空间就能对几个高性能的计算机视觉库如OpenCV 进行访问。它的学习曲线比OpenCV小得多,正如其宣传语所说,“SimpleCV让计算机视觉变得容易”。SimpleCV的优势在于:
- 即使是初级程序员也可以编写简单的机器视觉测试
- 摄像头、视频文件、图像和视频流都可以互操作
资源:https://simplecv.readthedocs.io/en/latest/
用处:
7. Mahotas
Mahotas是Python中另一个计算机视觉和图像处理库,含有过滤和形态学操作这类的传统图像处理功能和兴趣点检测、局部描述符等用于特征计算的现代化计算机视觉功能。接口使用了Python,适合快速开发,但算法是由C ++实现的,并对速度进行了调整。Mahotas库因代码简单且依赖性最小而快速。
资源:https://mahotas.readthedocs.io/en/latest/install.html
用处:Mahotas库靠简单的代码来完成工作。对于“寻找Wally”这一问题,Mahotas解决得很好,且代码最少。
源代码传送门:https://mahotas.readthedocs.io/en/latest/wally.html
8. SimpleITK
ITK或Insight Segmentation and Registration Toolkit是一个开源的跨平台系统,为开发人员提供了一整套用于图像分析的软件工具。其中,SimpleITK是一个建立在ITK之上的简化层,旨在方便它在快速成型、教育、解释语言中的应用。SimpleITK是一个具有大量组件的图像分析工具包,支持一般过滤操作、图像分割和图像配准。SimpleITK本身是用C ++编写的,但可用于包括Python在内的多种编程语言。
资源:http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/
用处:以下动画是使用SimpleITK和Python可视化严格CT / MR定位过程。
源代码传送门:
https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks/blob/master/Utilities/intro_animation.py
9. pgmagick
Pgmagick是GraphicsMagick库基于Python的包装器。GraphicsMagick图像处理系统有时也被称为图像处理的瑞士军刀。它提供了强大高效的工具集和库集,这些集合支持读取、写入和操作的图像格式超过88种,其中包括DPX,GIF,JPEG,JPEG-2000,PNG,PDF,PNM和TIFF等重要格式。
资源:
- Github存储库:https://github.com/hhatto/pgmagick
- 用户指南:https://pgmagick.readthedocs.io/en/latest/
用处:可使用pgmagick对图像进行的处理操作很有限,包括:
(1) 图像缩放:
(2) 边缘提取:
10. Pycairo
Pycairo是一组用于图形库cairo的python包。Cairo是一个用于绘制矢量图形的2D图形库。矢量图形很有趣,在调整大小或变换时它们的清晰度不会受到影响。Pycairo可从Python中调用cairo命令用于cairo。
资源:
- GitHub存储库:https://github.com/pygobject/pycairo
- 入门指南:https://pycairo.readthedocs.io/en/latest/tutorial.html
用处:Pycairo可用于绘制线条、绘制基本形状和径向渐变: