![]() |
OpenCV 4.12.0
开源计算机视觉
|
在本章中,我们将尝试理解什么是特征,为什么特征很重要,为什么角点很重要等等。
你们中的大多数人一定玩过拼图游戏。你得到很多图像的小碎片,你需要正确地组装它们以形成一个大的真实图像。问题是,你是怎么做到的? 将同样的理论应用到计算机程序中,以便计算机可以玩拼图游戏怎么样? 如果计算机可以玩拼图游戏,为什么我们不能给计算机提供大量自然风光的美好图像,并告诉它将所有这些图像拼接成一个大的单一图像? 如果计算机可以将多个自然图像拼接成一个图像,那么将很多建筑物或任何结构的图片交给计算机,并告诉计算机从中创建一个 3D 模型怎么样?
好吧,问题和想象力还在继续。但这一切都取决于最基本的问题:你如何玩拼图游戏?你如何将大量混乱的图像碎片排列成一个大的单一图像?你如何将大量的自然图像拼接成一个单一图像?
答案是,我们正在寻找特定的模式或特定的特征,这些特征是独特的,易于跟踪且易于比较的。 如果我们对这样一个特征进行定义,我们可能会发现很难用语言表达它,但我们知道它们是什么。如果有人让你指出一个可以在多个图像之间进行比较的良好特征,你可以指出一个。这就是为什么即使是小孩子也可以简单地玩这些游戏。我们搜索图像中的这些特征,找到它们,在其他图像中寻找相同的特征并将它们对齐。就是这样。(在拼图游戏中,我们更关注不同图像的连续性)。所有这些能力都存在于我们身上。
因此,我们的一个基本问题扩展为更多的问题,但变得更加具体。这些特征是什么?。(答案也应该让计算机可以理解。)
很难说人类是如何找到这些特征的。这已经编程在我们的脑海中。但是,如果我们深入研究一些图片并搜索不同的模式,我们会发现一些有趣的东西。例如,以下图
图像非常简单。在图像的顶部,给出了六个小的图像块。你的问题是在原始图像中找到这些补丁的确切位置。你能找到多少个正确的结果?
A 和 B 是平坦的表面,它们分布在很大的区域上。很难找到这些补丁的确切位置。
C 和 D 简单得多。它们是建筑物的边缘。你可以找到一个近似的位置,但确切的位置仍然很难确定。这是因为沿着边缘的每个地方的模式都相同。但是在边缘处,它又是不同的。因此,与平坦区域相比,边缘是更好的特征,但还不够好(它在拼图游戏中对于比较边缘的连续性很有用)。
最后,E 和 F 是建筑物的一些角点。 它们很容易被找到。因为在角点处,无论你移动这个补丁到哪里,它看起来都会不同。所以它们可以被认为是好的特征。所以现在我们转到一个更简单(并且被广泛使用的图像)以更好地理解。
就像上面一样,蓝色补丁是平坦区域,很难找到和跟踪。无论你移动蓝色补丁到哪里,它看起来都一样。黑色补丁有一个边缘。如果你在垂直方向(即沿着梯度方向)移动它,它会发生变化。沿着边缘(平行于边缘)移动,它看起来是一样的。对于红色补丁,它是一个角点。无论你移动补丁到哪里,它看起来都不同,这意味着它是独一无二的。所以基本上,角点被认为是图像中的良好特征。(不仅仅是角点,在某些情况下,斑点也被认为是好的特征)。
所以现在我们回答了我们的问题,“这些特征是什么?”。但是下一个问题出现了。我们如何找到它们?或者我们如何找到角点?我们以一种直观的方式回答了这个问题,即,寻找图像中当在周围所有区域中移动(少量)时具有最大变化的区域。这将在后面的章节中被转化为计算机语言。因此,找到这些图像特征被称为特征检测。
我们在图像中找到了特征。一旦你找到了它,你应该能够在其他图像中找到相同的特征。这是怎么做到的? 我们获取特征周围的区域,用我们自己的话来解释它,比如“上部是蓝天,下部是建筑物的区域,在建筑物上有玻璃等”,然后在其他图像中搜索相同的区域。基本上,你是在描述该特征。 类似地,计算机也应该描述特征周围的区域,以便它可以在其他图像中找到它。 这种所谓的描述被称为特征描述。 一旦你有了特征及其描述,你就可以在所有图像中找到相同的特征并将它们对齐、拼接在一起或做任何你想做的事情。
因此,在本模块中,我们将研究 OpenCV 中不同的算法来查找特征、描述它们、匹配它们等等。