先决条件和概述

本书主要针对各种应用和问题探讨理论及算法,下面简单概括一下。

·基本的编程经验。你需要会使用编辑器,能够运行脚本,知道如何构建代码以及基本数据类型。熟悉Python,或诸如Ruby、Matlab等其他脚本语言,这也会对你理解本书有所帮助。

·数学基础。如果你知道矩阵、向量、矩阵乘法、标准数学函数以及导数和梯度等概念,这对于充分利用其中示例非常有益。对于一些较高级的数学例子,你可以轻松跳过。

·用Python对图像进行实战编程。

·现实世界中各种应用背后的计算机视觉技术。

·一些基本算法,以及如何实现并应用这些算法。

本书中的代码示例会向你展示物体识别、基于内容的图像检索、图像搜索、光学字符识别、光流、跟踪、三维重建、立体成像、增强现实、姿态估计、全景创建、图像分割、降噪、图像分组等内容。

第1章“基本的图像操作和处理”介绍用来处理图像的基本工具及本书用到的核心Python模块,同时涵盖了很多贯穿全书的基础示例。

第2章“局部图像描述子”讲解检测图像兴趣点的方法,以及怎样使用它们在图像间寻找相应点和区域。

第3章“图像到图像的映射”描述图像间基本的变换及其计算方法。涵盖从图像扭曲到创建全景图像的示例。

第4章“照相机模型与增强现实”介绍如何对照相机建模、生成从三维空间到图像特征的图像投影,并估计照相机视点。

第5章“多视图几何”讲解如何对具有相同场景、多视图几何基本面的图像进行处理,以及怎样从图像计算三维重建。

第6章“图像聚类”介绍一些聚类方法,并展示如何基于相似性或内容对图像进行分组和组织。

第7章“图像搜索”展示如何建立有效的图像检索技术,以便能够存储图像的表示,并基于图像的视觉内容搜索图像。

第8章“图像内容分类”描述了图像内容分类算法,以及怎样使用它们识别图像中的物体。

第9章“图像分割”介绍了通过聚类、用户交互或图像模型,将图像分割成有意义区域的不同技术。

第10章“OpenCV”展示怎样使用常用的OpenCV计算机视觉库Python接口,以及如何处理视频及摄像头的输入。

本书结尾有参考文献。文献条目的引用用方括号表示,如[20]。

计算机视觉是一门对图像中信息进行自动提取的学科。信息的内容相当广泛,包括三维模型、照相机位置、目标检测与识别,以及图像内容的分组与搜索等。本书中,我们使用广义的计算机视觉概念,包括图像扭曲、降噪和增强现实等这些例子生成新的图像,并且比实际地从图像中提取信息需要更多的图像处理。

计算机视觉有时试图模拟人类视觉,有时使用数据和统计方法,而有时几何是解决问题的关键。在本书中,我们试图对此进行全面介绍。

实用计算机视觉混合了编程、建模和数学技巧,有时很难掌握。我本着“力求简单,又不影响理解”的精神,有意用最少的理论来展示这些内容。书中对于数学知识的介绍是为了帮助读者理解算法,有些章(主要是第4章和第5章)无法避免地涉及很多数学理论。只要读者愿意,可以跳过这些数学理论,直接使用示例代码。

Python是一门编程语言,其使用贯穿了全书的示例代码。Python是一种简洁明了的语言,对于输入/输出、数字、图像及绘图都具有良好的支持。这门语言的一些特性需要我们逐渐适应,比如缩进和紧凑语法。要运行代码示例,你需要安装Python 2.6或之后的版本,因为只有这些版本才提供本书中用到的很多工具包。Python 3.x版本与2.x版本有很多语法差异,并且不兼容2.x版本,也不兼容我们所需的工具包。

熟悉一些基本Python操作会更容易理解这些内容。对于Python初学者,我建议读一下Mark Lutz的书Learning Python[20]和http://www.python.org/上的在线文档。

在进行计算机视觉编程的时候,我们需要在向量、矩阵的表示上进行操作,这可以通过Python的NumPy模块处理;在该模块中,向量和矩阵是用array类型表示的。对于图像,我们也将采用这种类型的表示。Travis Oliphant的免费电子书Guide to NumPy[24]是一本不错的NumPy参考手册;http://numpy.scipy.org/上的文档对于刚接触NumPy的读者来说是一个很好的起点。对于结果的可视化,我们会用到Matplotlib模块;而对于更高级的数学,我们会用到SciPy模块。这些就是你会用到的核心模块,详见第1章。

除了这些核心模块,对于某些特殊目的,比如读取JSON或XML、载入并保存数据、生成图、图形编程、Web演示、分类器等,我们还会用到很多其他免费模块。这些模块只有在特殊的应用和演示中才需要,如果你对于某种应用不感兴趣,可以跳过。

这里有必要提一下IPython,它是一个交互式Python壳,使调试和实验变得更简单。对应文档及下载地址见http://ipython.org/

代码如下:

# 一些点
x = [100,100,400,400]
y = [200,500,200,500]

# 绘制这些点
plot(x,y)

本书中的字体约定如下。

·楷体

用于定义。

·等宽字体(Constant width)

用于函数、Python模块及代码示例,也用于控制台打印输出。

数学公式为内联式(如),或者单独居中:

只有需要参考的时候我们才对公式进行编号。

在介绍数学知识的部分,标量使用小写字母(s, r, λ, θ…),矩阵(包括图像数组I)使用大写加粗(A, V, H,…),向量则小写加粗(t, c,…),二维(图像)和三维中的点分别用x=[x, y]和X[X, Y, Z]表示。

本书旨在帮助你完成工作。通常,你可以在程序或文档中使用本书的代码。你不必联系我们请求许可,除非你要复制本书的大量代码。例如,用本书的几段代码编写程序不需要获得许可;售卖或再分发O'Reilly的图书示例光盘需要获得许可;引用本书和示例代码回答问题不需要获得许可;将本书中的大量示例代码纳入产品文档中需要获得许可。

我们对你在使用时声明引用信息表示感谢,但不强制要求。引用信息通常包括标题、作者、出版商和ISBN,例如“ProgrammingComputer Vision with Python byJan Erik Solem (O'Reilly).Copyright © 2012Jan Erik Solem, 978-1-449-31654-9.”

如果你觉得使用的代码示例超出合理引用或上述许可范围,请随时和我们联系:

permissions@oreilly.com。