《Programming Computer Vision with Python》是一本介绍计算机视觉底层基本理论和算法的入门书,通过这本收可以学到有关对象识别、基于内容的图像搜索、光学字符识别、光流法、跟踪、三维重建、立体成像、增强现实、姿态估计、全景创建、图像分割、降噪、图像分组等技术的实现原理。
英文版PDF下载: https://it-ebooks.info/book/836/
中文版介绍: http://book.douban.com/subject/25906843/
先介绍基本的图像处理,包括图像的读取、转换、缩放、导数计算、画图和保存,这些知识将为后面内容的学习打下基础。
作者选择Python编写例子,并使用一个叫 PIL(Python Imaging Library)
的第三方图像处理库。这里特别指出的是:PIL库开发不活跃,并且很久没更新了,所以有人基于它fork了另一个分支叫 Pillow , Pillow
保持与PIL相似的使用接口,解决了许多Bug,并同时兼容Python2和Python3,目前开发状态活跃。接下来的学习笔记本人都将使用Pillow来代替PIL。
以Ubuntu系统为例:
#安装python开发工具及包管理工具 sudo apt-get install python-dev python-pip #安装一些需要支持的图像格式开发包 sudo apt-get install libjpeg-dev libpng-dev libtiff-dev #安装Pillow图像处理库 sudo pip install pillow
Pillow主要包含了对各种图像模式、图像格式、颜色、过滤器的数据结构(对象)表示,实现了对图像模式转换、格式转换、过滤器应用、常规图像处理操作、图像数据算术运算、2D画图等功能,以模块、类对外提供。首先,先了解一下Pillow库使用的一些基本概念:
Bands(图像通道)
图像的通道即图像像素的组成部分,跟Channel应该是同一个概念。比如RGB图像有3个通道分别为红、绿、蓝。二值图像和灰度图像只有1个通道。PNG图像有4个通道分别为R、G、B和alpha。库中提供的很多图像操作都是分别作用于某个通道的数据。
Modes(图像模式)
图像模式定义了像素的类型和位深,Pillow支持以下模式:
1 (1-bit pixels, black and white, stored with one pixel per byte)
L (8-bit pixels, black and white)
P (8-bit pixels, mapped to any other mode using a color palette)
RGB (3x8-bit pixels, true color)
RGBA (4x8-bit pixels, true color with transparency mask)
CMYK (4x8-bit pixels, color separation)
YCbCr (3x8-bit pixels, color video format)
LAB (3x8-bit pixels, the L a b color space)
HSV (3x8-bit pixels, Hue, Saturation, Value color space)
I (32-bit signed integer pixels)
F (32-bit floating point pixels)
模块概览
Pillow的功能划分为许多模块,我们简单过一下这些模块的功能,以便在看到作者的示例代码时,可以快速知道这些代码功能在Pillow哪些模块中提供。因为作者使用的PIL库已经过时,我们得用新的Pillow库来重写和改进代码。
Image模块
提供了一个叫 Image
的类来表示图像,以下提到的 PIL图像
指的就是此类的对象。Image对象可以使用Image.new、Image.fromarray、Image.frombytes、Image.frombuffer等方法来构造,也可以open一张图片来构造。Image类提供了一些对图像进行简单处理的方法(如:convert、copy、crop、filter、resize、rotate、save、show、transform等)和图像的基本属性/信息。以下代码示例打开一张图片,旋转45度后显示出来:
from PIL import Image im = Image.open("bride.jpg") im.rotate(45).show()
ImageChops模块
提供了一些对图像颜色通道的算术运算,Chops为 Channel Operations
的缩写,这些运算通常是对两幅图像进行的,并返回一幅处理后的图像,大部分操作目前只支持8-bit通道。
ImageColor模块包含一个颜色表和一个从CSS3表示的颜色到RGB颜色的转换器,主要用于方便构造Image对象,即PIL.Image.new(mode, size, color=0)的color参数支持以下形式:
16进制的颜色表示,如#rgb, #rrggbb
rgb函数,如rgb(255,0,0), rgb(100%, 0%, 100%)
HSL(色相、饱和、亮度)函数,如hsl(0,100%,100%),色相取值为0到360,饱和度和亮度取值为0%到100%
常规的HTML颜色名字,如red, Red
ImageCms模块
提供对LittleCMS2色彩管理引擎的支持。 Little CMS
是最流行的开源色彩管理库之一。
ImageDraw模块提供简单的2D画图功能,比如画点、画线、画矩形、多边形、文本、弧形、椭圆等,支持字体设置。
ImageEnhance模块提供一些类用于图像增强操作,比如边缘锐化、色彩平衡、对比度和亮度调节等。
ImageFile模块提供图像文件的打开和保存,另外,还提供了一个Parser类,用于支持对图片边读边解码(比如图片边从网络上下载边解码的情景)。
ImageFilter模块预定义了一些过滤器,可以在Image.filter(filter)中作为参数使用:
BLUR(模糊效果)
CONTOUR(轮廓)
DETAIL(细节)
EDGE_ENHANCE(边缘加强)
EDGE_ENHANCE_MORE(边缘加强)
EMBOSS(浮雕效果)
FIND_EDGES(查找边缘)
SMOOTH(使光滑)
SMOOTH_MORE(使光滑)
SHARPEN(锐化)
ImageFont模块
定义了类ImageFont表示位图字体(点阵字体),字体对象可以作为参数传给ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None)以指定的字体画文本。
PIL使用自有格式存储位图字体,从1.1.4开始,支持TrueType和OpenType字体。
ImageGrab模块从屏幕截图或从剪贴板获取图像,得到Image对象。目前只支持OSX(在3.0增加)和Windows。
ImageMath模块
只提供了一个函数ImageMath.eval用于 对图像表达式(image expressions)
进行求值,这些表达式可以是对图像数据每个bit的位运算(&、|、^、~),也可以是内置的一些运算,比如对图像的每个像素求绝对值、转换图像模式、转float或int等。
ImageMorph模块提供图像形态操作。
ImageOp模块提供一些可直接使用的图像处理操作,如自动调节对比度、自动裁边等。
ImagePalette模块提供调色板类,其中的方法都被标记为experimental,文档不详。
ImagePath模块用于存储和操作2维向量数据。Path对象可传入ImageDraw模块的相关方法。
ImageQt模块支持从PIL图像对象创建PyQt4或PyQt5的QImage对象,方便被Qt使用和显示。
ImageSequence模块
支持枚举出一个 image sequence
(图像系统,如fli动画文件)的所有帧。
ImageStat模块对图像或指定区域的每个通道进行统计,包括count、sum、min/max等。
ImageTk模块支持从PIL图像对象创建Tkinter(Python的GUI库)的BitmapImage和PhotoImage对象。
ImageWin模块支持在Windows平台上创建和显示图像,可与PythonWin和其它UI库一起使用,为这些工具库提供Windows设备上下文或windows句柄的访问。
了解了Pillow库后,基本可以拿下第一章的内容,下一个笔记我将从第一章挑几个特别一点的图像处理来说一下。