【前言】
今天,图像和视频无处不在,在线照片分享网站和社交网络上的图像有数十亿之多。几乎对于任意可能的查询图像,搜索引擎都会给用户返回检索的图像。实际上,几乎所有手机和计算机都有内置的摄像头,所以在人们的设备中,有几G 的图像和视频是一件很寻常的事。
计算机视觉就是用计算机编程,并设计算法来理解在这些图像中有什么。计算机视觉的有力应用有图像搜索、机器人导航、医学图像分析、照片管理等。
本书旨在为计算机视觉实战提供一个简单的切入点,让学生、研究者和爱好者充分理解其基础理论和算法。本书中的编程语言是Python,Python 自带了很多可以免费获取的强大而便捷的图像处理、数学计算和数据挖掘模块,可以免费获取。
写作本书的时候,我遵循了以下原则。
鼓励探究式学习,让读者在阅读本书的时候,在计算机上跟着书中示例进行练习。
推广和使用免费且开源的软件,设立较低的学习门槛。显然,我们选择了Python。
保持内容完整性和独立性。本书没有介绍计算机视觉的全部内容,而是完整呈现并 解释所有代码。你应该能够重现这些示例,并可以直接在它们之上构建其他应用。
内容追求广泛而非详细,且相对于理论更注重鼓舞和激励。
总之,如果你对计算机视觉编程感兴趣,希望它能给你带来启发。
先决条件和概述
本书主要针对各种应用和问题探讨理论及算法,下面简单概括一下。
读者须知
基本的编程经验。你需要会使用编辑器,能够运行脚本,知道如何构建代码以及基 本数据类型。熟悉Python,或诸如Ruby、Matlab 等其他脚本语言,这也会对你理解本书有所帮助。
数学基础。如果你知道矩阵、向量、矩阵乘法、标准数学函数以及导数和梯度等概念, 这对于充分利用其中示例非常有益。对于一些较**的数学例子,你可以轻松跳过。
本书内容
用Python 对图像进行实战编程。
现实世界中各种应用背后的计算机视觉技术。
一些基本算法,以及如何实现并应用这些算法。
本书中的代码示例会向你展示物体识别、基于内容的图像检索、图像搜索、光学字符识别、光流、跟踪、三维重建、立体成像、增强现实、姿态估计、全景创建、图像分割、降噪、图像分组等内容。
各章概览
第1 章 “基本的图像操作和处理”介绍用来处理图像的基本工具及本书用到的核心Python 模块,同时涵盖了很多贯穿全书的基础示例。
第2 章 “局部图像描述子”讲解检测图像兴趣点的方法,以及怎样使用它们在图像间寻找相应点和区域。
第3 章 “图像到图像的映射”描述图像间基本的变换及其计算方法。涵盖从图像扭曲到创建全景图像的示例。
第4 章 “照相机模型与增强现实”介绍如何对照相机建模、生成从三维空间到图像特征的图像投影,并估计照相机视点。
第5 章 “多视图几何”讲解如何对具有相同场景、多视图几何基本面的图像进行处理,以及怎样从图像计算三维重建。
第6 章 “图像聚类”介绍一些聚类方法,并展示如何基于相似性或内容对图像进行分组和组织。
第7 章 “图像搜索”展示如何建立有效的图像检索技术,以便能够存储图像的表示, 并基于图像的视觉内容搜索图像。
第8 章 “图像内容分类”描述了图像内容分类算法,以及怎样使用它们识别图像中的物体。
第9 章 “图像分割”介绍了通过聚类、用户交互或图像模型,将图像分割成有意义区域的不同技术。
第10 章 “OpenCV”展示怎样使用常用的OpenCV 计算机视觉库Python 接口,以及如何处理视频及摄像头的输入。
本书结尾有参考文献。文献条目的引用用方括号表示,如[20]。
计算机视觉简介
计算机视觉是一门对图像中信息进行自动提取的学科。信息的内容相当广泛,包括三维模型、照相机位置、目标检测与识别,以及图像内容的分组与搜索等。本书中, 我们使用广义的计算机视觉概念,包括图像扭曲、降噪和增强现实等①。
计算机视觉有时试图模拟人类视觉,有时使用数据和统计方法,而有时几何是解决问题的关键。在本书中,我们试图对此进行全面介绍。
实用计算机视觉混合了编程、建模和数学技巧,有时很难掌握。我本着“力求简单, 又不影响理解”的精神,有意用*少的理论来展示这些内容。书中对于数学知识的介绍是为了帮助读者理解算法,有些章(主要是第4 章和第5 章)无法避免地涉及很多数学理论。只要读者愿意,可以跳过这些数学理论,直接使用示例代码。
注1: 这些例子生成新的图像,并且比实际地从图像中提取信息需要更多的图像处理。
Python和NumPy
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 模块及代码示例,也用于控制台打印输出。
数学公式为内联式(如() xw x f b T = + ),或者单独居中:
() xwf xb ii i =+ /
只有需要参考的时候我们才对公式进行编号。
在介绍数学知识的部分,标量使用小写字母(s, r, λ, θ…),矩阵(包括图像数组I) 使用大写加粗(A, V, H,…),向量则小写加粗(t, c,…),二维(图像)和三维中的点分别用x=[x, y] 和X[X, Y, Z] 表示。
使用代码示例
本书旨在帮助你完成工作。通常,你可以在程序或文档中使用本书的代码。你不必联系我们请求许可,除非你要复制本书的大量代码。例如,用本书的几段代码编写程序不需要获得许可;售卖或再分发O’Reilly 的图书示例光盘需要获得许可;引用本书和示例代码回答问题不需要获得许可;将本书中的大量示例代码纳入产品文档中需要获得许可。
我们对你在使用时声明引用信息表示感谢,但不强制要求。引用信息通常包括标题、作者、出版商和ISBN, 例如“Programming Computer Vision with Python by Jan Erik Solem (O’Reilly). Copyright 2012 Jan Erik Solem, 978-1-449-31654-9.”
如果你觉得使用的代码示例超出合理引用或上述许可范围,请随时和我们联系: permissions@oreilly.com。
Safari Books Online
Safari Books Online(www.safaribooksonline.com)是应需而变的数字图书馆。它同时以图书和视频的形式出版世界**技术和商务作家的专业作品。
Safari Books Online 是技术专家、软件开发人员、Web 设计师、商务人士和创意人士开展调研、解决问题、学习和认证培训的**手资料。
对于组织团体、政府机构和个人,Safari Books Online 提供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问O’Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology 以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解Safari Books Online 的更多信息,我们网上见。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)
奥莱利技术咨询(北京)有限公司
O’Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:
http://shop.oreilly.com/product/0636920022923.do
对于本书的评论和技术性问题,请发送电子邮件到:
bookquestions@oreilly.com
要了解更多O’Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站:
http://www.oreilly.com
我们在Facebook 的地址如下:
http://facebook.com/oreilly
请关注我们的Twitter 动态:
http://twitter.com/oreillymedia
我们的YouTube 视频地址如下:
http://www.youtube.com/oreillymedia
致谢
感谢参与本书写作及出版的每一个人,感谢整个O’Reilly 团队给予的帮助。特别要感谢Andy Oram(O’Reilly)的编辑工作,以及Paul Anagnostopoulos(Windfall Software)的**出版工作。
很多人对于我分享在网上的书稿发表了评论。感谢Klas Josephson 和Hkan Ard 就本书细致给出意见及反馈,而Fredrik Kahl 和Pau Gargallo 帮助进行了核实。感谢所有读者的鼓励,以及对本书文本和代码示例的改进。很多陌生人通过邮件分享了对书稿的看法,这对我而言是一个巨大的动力。
*后,感谢朋友和家人对我夜以继日写作的理解和支持。特别要感谢长久以来一直支持着我的妻子Sara。