OpenCV Python 理解特征
【目标】
- 本章中,我们需要理解什么是特征?
- 特征为什么重要?
- 角点为什么重要等等。
【解释】
大多数人都玩过拼图游戏,你会得到一幅图像中的很多小块,然后需要正确的将这些小块组合起来,形成一幅真正的图像。问题是,你是如何做到的?把同样的理论映射到计算机程序中,这样计算机就可以玩拼图游戏了?如果计算机可以玩拼图游戏,为什么我们不能给计算机很多真实的自然图片,并告诉它把这些图片拼接成一张大图片呢?如果计算机可以将多幅自然图像拼接成一幅,那么给一栋建筑或任何结构拼接大量图片,并告诉计算机用这些图片创建一个3D模型怎么样?
问题和想象继续,但这一切都取决于最基本的问题:你怎么玩拼图游戏?如何将大量杂乱的图像片段排列成单个大幅图像?如何将大量自然图像拼接到单个图像中?
答案是,我们正在寻找独特的,易于追踪和比较的特定模式或特定特征。如果我们去定义这样的特征,我们可能会发现很难用自然语言表达,但我们知道它们是什么。如果有人要求你指出一个可以在多张图片中进行比较的好的特征,你可以指出一个。这就是为什么即使小孩子也可以简单地玩游戏。我们在图像中搜索这些特征,找到它们,在其他图像中查找相同的特征并对齐它们。就是这样,(在拼图游戏中,我们更关注不同图像的连续性)。所有这些能力都存在于我们身上。
因此,我们的一个基本问题在数量上扩展到更多,但变得更具体。这些功能是什么?
很难说人类是如何发现这些特征的。这已经在我们的大脑中编程了。但如果我们深入研究一些图片并搜索不同的模式,我们会发现一些有趣的东西。例如下图:
图像非常简单,在图像的顶部,给出了留个小图模块,问题是在原始图像中找到这些补丁的确切问题。你能找到多少正确的结果?
A
和 B
是平面,它们分布在很多区域。很难找到这些不定的确切问题。
C
和 D
要简单得多,它们是建筑物的边缘,你可以找到一个大概的位置,但准确的位置仍然很难,这是因为沿着边缘的每个地方的图案都是相同的。然而,在边缘,情况有所不同,因此,与平坦区域相比,边缘是更好的特征,但还不够好(在拼图游戏中比较边缘的连续性很好)。
E 和 F 是建筑物的角点,很容易找到。无论怎么移动这些 patch,它们都是与众不同的。因此,它们可以被视为良好的功能,因此,为了更好地理解,现在我们转向更简单(和广泛使用的图像)。
和上面一样,蓝色矩形框里面是平坦的,很难找到和追踪,无论如何移动,看起来都是一样的。褐色矩形框有一条边,如果沿垂直方向移动,它会发生变化,沿边缘移动,看起来是一样的。对于红色矩形框,它是一个角落,无论怎么移动,看起来都是与众不同的,所以基本上,角落(角点)被认为是图像中的好特征。(不仅仅是角点,在某些情况下,斑点也被认为是好特征)。
所以,我们回答了“这些特征是什么?”这个问题。但是另一个问题又出现了,怎么找到它们呢?或者说怎么找到角点呢?我们以一个直观的方式回答了这个问题,即在图像周围的所有区域中查找当移动(少量)时具有重大变化的区域,这将在接下来的章节中被映射到计算机语言中。因此,找到这些图像特征称为特征检测。
我们在图像中找到了这些特征,一旦你找到了它,你应该能够在其他图像中找到它,这是怎么做到的呢?我在特征周围取一个区域,用我们自己的语言解释它,比如“上面是蓝天,下面是建筑物的区域,在该建筑物上有玻璃等”然后在其他图像中搜索相同的区域。基本上,您正在描述该特征。同样,计算机也应该描述特征周围的区域,以便在其他图像中找到它。所谓的描述称为特征描述。一旦你有了这些特征和它的描述,你就可以在所有的图像中找到相同的特征,并将它们对齐,拼接在一起或做任何你想做的事情。
因此,在本章节中,我们将使用OpenCV的不同算法来查找特征,描述特征和匹配特征。