5.1 理解特征
目标
在这一章中,我们将会试着理解什么是特征,为什么它们很重要,为什么边角很重要等等。
详细解释
大家一定都玩过拼图。你会拿到到一张图片的许多小的部分,然后你需要把它们拼成一个大的图片。问题是,你是怎么做到的?我们能否将同样的方法应用到计算机程序中,让计算机也会玩拼图?如果计算机会玩拼图,为什么我们不能给它一些真实生活中的风景图片然后让它将这些图片拼成一张大的图片?如果计算机能将自然风景图片拼成一张,那么何不给它一些建筑物的图片并让它建立起这个建筑物的立体模型?
这些问题和想象还可以继续。但这都基于一个最基本的问题:你是怎么玩拼图的?你是怎么将混乱的大量图像片拼成一个大图像?
答案是我们寻找特定的、唯一的结构或者说特征,这些结构或特征可以被轻易地追踪和比较。如果我们要对这个特征下一个定义,我们可能发现用语言表达它并不容易,但是我们心里知道这些特征是什么。如果有人让你指出一个可以用于比较几个图片的特征,你可以指出一个。这就是为何小孩子也能容易地玩这些游戏。我们从图片中找到特征,在其他图片中找到同样的特征,然后将它们放在一起。仅此而已。(在拼图游戏中,我们更多地关注不同图像的连续性)。所有这些能力对于我们来说都是与生俱来的。
因此,我们的基本的问题数量上变多了,但变得更加具体。 这些特征是什么? (这个问题的答案应该也可以被计算机理解。)
很难说人类是如何找到这些特征的。 我们天生就具备这种能力。
但是如果我们深入了解一些图片并寻找不同的模式,我们会发现一些有趣的东西。
图像非常简单。在图像的顶部,给出了六个小图像块。你要解决的问题是要找到这些图像块在原始图像中的确切位置。你能找到多少正确的结果?
A和B都是平坦的表面,它们分布在很多的区域。很难找到这些图像块的确切位置。
C和D要简单得多。他们是建筑物的边缘。你可以找到一个大概的位置,但寻找确切位置仍然困难。这是因为建筑物边缘的模式是相同的。
然而,在建筑物边缘,结构和别处是不同的。因此,与平坦区域相比,边缘是更好的特征,但是还不够好(然而在拼图游戏中,边缘的连续性是好的特征)。
最后,E和F是建筑物的一些边角。他们可以很容易地找到。因为不管你将这个图像块移动到其他任何地方,它看起来都不一样。所以他们可以被认为是好的特征。
现在我们进入更简单(和使用更广泛的)图像,以更好的理解特征。
就像上面那样,蓝色图像块是平坦的区域,很难查找和跟踪。 无论你向哪里移动蓝色图像块,它看起来都是一样的。 黑色图像块有一个边缘。 如果沿垂直方向(或沿着倾斜方向)移动,它会发生变化。 沿着边缘(平行于边缘)移动,它看起来是一样的。 而对于红色补丁,这是一个边角。 无论你如何移动图像块,它看起来都不同,意味着它是独一无二的。 所以基本上来说,边角被认为是一个图像中的好特征。 (不只是边角,在某些情况下斑点也被认为是好的特征)。
所以现在我们回答了我们的问题:“这些特征是什么?”。 但接下来下一个问题出现了。 我们如何找到他们? 或者说我们如何找到边角? 我们以一种直观的方式表述这个问题,即:在周围所有区域移动(少量)时,寻找图像中具有最大变化的区域。 这将在未来的章节中被应用到计算机语言中。 寻找这些图像特征称为特征检测。
现在我们在图像中找到了这些特征。 只要你找到了特征,你应该能够找到有相同特征的其他图像。 这是怎么做到的? 我们把这个特征周围的区域用我们自己的话来解释,比如“上半部分是蓝天,下半部分是建筑物,在那个建筑物上有玻璃等等”,然后在另一个区域搜索有相同的区域特征的图片。 基本上,你正在描述你找到的特征。 相似的,计算机也应该描述特征点周围的区域,以便在其他图像中找到它。 这样的描述称为特征描述。 一旦你有了这些特征及其描述,你可以在所有图像中找到相同的特征,并将它们放在一起,拼接在一起或做任何你想用它们做的。
在这个单元中,我们将看到如何使用OpenCV中的不同算法来查找特征,描述它们,匹配它们等等。