openCV-特征点匹配算法介绍一:理解特征

在正式进入具体应用之前,比如图像拼接,我们先理解清楚涉及图像拼接会用到的算法以及openCV实现这些算法的函数等,需要点耐心,这及章节的内容均来自于openCV官方文档,学完这几节内容,相信对你后续的应用有很大的帮助。

本文是对官方文档的翻译并举例说明,原文地址:https://docs.opencv.org/3.4.1/df/d54/tutorial_py_features_meaning.html

本章目标

在这个章节,我们将尝试理解什么是图像的特征,并尝试回答为什么图像特征非常重要,为什么查找图像的角点很重要等问题。

你们大多数人都玩过拼图游戏。你会得到很多图像的小块,你需要把它们正确地组合起来,形成一个大的真实图像。问题是,你是怎么做到的?把同样的理论投射到电脑程序上,让电脑玩拼图游戏,电脑该怎么做?如果计算机可以玩拼图游戏,为什么我们不能给计算机提供许多真实的自然美景的图像,并告诉它把所有这些图像拼接成一个大的单一图像呢?如果电脑能把几张自然图像拼接到一张上,那是不是可以把建筑物或任何结构的大量图片给电脑,让电脑从中创建一个三维模型呢?

问题和想象还在继续。但这一切都取决于这些最基本的问题:你如何玩拼图游戏?你如何将许多杂乱的图像块排列成一个大的单一图像?你怎么能把许多自然的图像缝合到一个单一的图像?

答案是,我们很容易通过寻找特定的模式或特定的特性,比较拼图的相似性来完成游戏。但如果我们要定义这些特性,我们可能会发现很难用语言来表达它,但是我们知道它们是什么。如果有人让你指出一个或多个图像中的特性,你可以很快指出至少一个。这就是为什么即使是小孩子也能简单地玩这些游戏。我们在一张图片中搜索这些特征,找到它们,在其他图片中寻找相同的特征并将它们对齐。就是这样。(在拼图游戏中,我们更关注不同图像的连续性)。所有这些能力都是与生俱来的。

所以,我们把上面的基本问题延申出更具体的问题,就是这些特性是什么?(答案对电脑来说也应该是可以理解的。),很难说人类是如何发现这些特征的。这已经在我们的大脑中编程了。但是如果我们深入研究一些图片,寻找不同的图案,我们会发现一些有趣的东西。例如,如下图所示:

图像非常简单。在图像的顶部,给出了六个小图像块。你的任务是找到这些补丁在原始图像中的确切位置。你能找到多少个正确的结果?A和B是平面,它们分布在很多区域。很难找到这些补丁的确切位置。C和D要简单得多。它们是建筑物的边缘。你可以找到一个大致的位置,但准确的位置仍然是困难的。这是因为沿边缘的所有地方的模式都是相同的。然而,在边缘,它是不同的。因此,与平面区域相比,边缘是更好的特征,但还不够好(在拼图游戏中,边缘的连续性比较好)。最后,E和F是建筑的一些角落。而且很容易找到。因为在角落里,无论你移动这个补丁,它看起来都不一样。所以它们可以被认为是好的特性。

因此,现在我们转向更简单(和广泛使用的图像)以便更好地理解。如下图:

就像上面一样,蓝色方框的区域是平坦而均匀的,很难找到和跟踪。无论你把蓝色的补丁移到哪里,它看起来都是一样的。黑色方框的区域有一条边。如果你在垂直方向移动它,它就会改变。沿着边缘移动(平行于边缘),它看起来是一样的。对于红色方框区域,它是一个角。无论你移动补丁到哪里,它看起来都不一样,这意味着它是独一无二的。基本上,角被认为是图像中很好的特征。(不只是角,在某些情况下,blob(斑块)被认为是很好的特性)。

现在我们回答了这个问题,“这些特征是什么?” 但下一个问题出现了。我们怎么找到他们?或者我们怎么找到角?我们用直观的方式回答了这个问题。在图像中寻找那些在移动时(少量移动)周围所有区域变化最大的区域。这将在接下来的章节中被投射到计算机语言中,而找到这些图像特征的过程就叫做特征检测。

我们在图像中找到了特征。一旦你找到了它,你应该能够在其他图片中找到相同的。这是怎么做到的?我们取一个特征周围的区域,用我们自己的话来解释,比如“上方是蓝天,下方是建筑的区域,建筑上有玻璃等等”,然后在其他图片中搜索相同的区域。基本上,您是在描述特性。同样,计算机也应该描述特征周围的区域,以便在其他图像中找到它。所谓的描述就是特征描述。一旦你有了特征和它的描述,你就可以在所有的图像中找到相同的特征,然后对齐它们,把它们缝在一起,或者做任何你想做的事情。

因此,在本模块中,我们将在OpenCV中寻找不同的算法来寻找特征,描述它们,匹配它们等等。