目标
本节帮助大家理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等。
解释
相信大多数人都玩过拼图游戏吧。首先拿到一张图片的一堆碎片, 要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像。 问题是,怎样做到的呢?如果把做游戏的原理写成计算机程序, 那计算机就也会玩拼图游戏了。 如果计算机可以玩拼图,就可以给计算机一大堆自然图片, 然后就可以让计算机把它拼成一张大图了。 如果计算机可以自动拼接自然图片, 那是不是可以给计算机关于一个建筑的的大量图片, 然后让计算机创建一个 3D 的的模型呢?
问题和联想可以无边无际。但是所有的这些问题都是建立在一个基础问题之上的。 这个问题就是:我们是如何玩拼图的?是如何把一堆碎片拼在一起的? 如何把一个个自然场景拼接成一个单独图像的?
答案就是:要寻找一些唯一的特征,这些特征要适于被跟踪, 容易被比较。如果要定义这样一种特征, 虽然知道它是什么但很难用语言来描述。 如果找出一个可以在不同图片之间相互比较的好的特征, 那么肯定能搞定。 这就是为什么小孩子也会玩拼图的原因。 在一副图像中搜索这样的特征,能找到它们, 而且也能在其他图像中找到这些特征, 然后再把它们拼接到一块。 (在拼图游戏中,更注重的是图片之间的连续性)。 这些能力都是天生的。
所以一个问题现在扩展成了几个, 但是更加确切了。这些特征是什么呢?(答案必须也能被计算机理解)。 好吧,很难说人是怎样找出这些特征的。 这些能力已经刻在大脑中了。 但是如果深入的观察一些图像并搜索不同的 pattern, 就会发现一些有趣的事。一下图为例:
图像很简单。在图像的上方给出了六个小图。 要做的就是找到这些小图在原始图像中的位置。 能找到多少正确结果呢?
A 和 B 是平面,而且它们的图像中很多地方都存在。 很难找到这些小图的准确位置。
C 和 D 更简单。它们是建筑的边缘。 可以找到它们的近似位置,但是准确位置还是很难找到。 这是因为:沿着边缘,所有的地方都一样。 所以边缘是比平面更好的特征,但是还不够好(在拼图游戏中要找连续的边缘)。
E 和 F 是建筑的一些角点。它们能很容易的被找到。 因为在角点的地方,无论向哪个方向移动小图, 结果都会有很大的不同。 所以可以把它们当成一个好的特征。 为了更好的理解这个概念,举个更简单的例子。
如上图所示,蓝色框中的区域是一个平面很难被找到和跟踪。 无论向那个方向移动蓝色框,长的都一样。 对于黑色框中的区域,它是一个边缘。 如果沿垂直方向移动,它会改变。但是如果沿水平方向移动就不会改变。 而红色框中的角点,无论向那个方向移动, 得到的结果都不同,这说明它是唯一的。
所以,基本上来说角点是一个好的图像特征。 (不仅仅是角点,有些情况斑点也是好的图像特征)。
现在终于回答了前面的问题了,“这些特征是什么?”。 但是下一个问题又来了。 怎样找到它们?或者说怎样找到角点? 也已经用一种直观的方式做了回答,比如在图像中找一些区域, 无论想那个方向移动这些区域变化都很大。 在下一节中会用计算机语言来实现这个想法。 所以找到图像特征的技术被称为 特征检测。
现在找到了图像特征(假设已经搞定)。 在找到这些之后,应该在其他图像中也找到同样的特征。 应该怎么做呢?我们选择特征周围的一个区域, 然后用自己的语言来描述它, 比如“上边是蓝天,下边是建筑,在建筑上有很多玻璃等”, 就可以在其他图片中搜索相同的区域了。 基本上看来,是在描述特征。 同样,计算机也要对特征周围的区域进行描述, 这样它才能在其他图像中找到相同的特征。 我们把这种描述称为 特征描述。当有了特征很它们的描述后, 就可以在所有的图像中找这个相同的特征了, 找到之后就可以做任何想做的了。
本章就是要使用 OpenCV 中的各种算法来查找图像的特征, 然后描述它们,对它们进行匹配等。