本章将探讨什么是图像特征、重要性,以及为什么角点等特征具有特殊意义。
特征的本质
想象你玩过拼图游戏:需要把许多小图块正确组装成一幅完整图像。 那么关键问题是:如何完成拼图?这个原理能否应用于计算机程序,让计算机也能"玩"拼图? 如果计算机能拼接拼图,是否能让它拼接多张真实风景照,合成全景图像? 更进一步,给定某建筑的多角度照片,能否生成3D模型?
这些想象最终都回归到基础问题,人类如何完成拼图?如何将碎片重组为完整图像? 如何拼接多张自然图像?实际上关键在于寻找独特、可追踪、可对比的特征。 虽然难以用语言精确定义,但人类能直觉识别这类特征,这正是儿童也能轻松玩拼图的根本原因。 特征匹配机制如特征定位,在图像中搜索显著特征点; 跨图匹配,在不同图像中找到相同特征; 对齐融合,基于特征点进行空间对齐(拼图更注重图像间的连续性衔接)。 然而计算机视角的挑战如人类天生具备这种能力,但需将其转化为计算机可理解的逻辑。 什么是可计算的特征? 如何量化特征的独特性? 下文将通过具体图像示例展开说明。
这个实验非常简单:图片顶部给出了六个小图像块,要求在原图中找到它们的确切位置。
A和B是平坦区域,分布范围很大,很难精确定位。
C和D是建筑物的边缘,虽然能大致找到位置,但仍难以准确定位,因为沿着边缘方向特征都是相同的,只有垂直于边缘方向才有变化。 所以边缘比平坦区域特征更明显,但还不够理想(不过在拼图中适合用于边缘连续性比对)。
E和F是建筑物的角落,这些特征很容易被找到,因为无论怎么移动这些图像块,它们看起来都不同,所以角落是最理想的特征点。 接下来我们会用更简单的图像来进一步说明这个原理。
就像前面展示的,蓝色区域代表平坦区域,这种区域很难被识别和追踪,因为无论怎么移动蓝色块,看起来都一模一样。 黑色区域代表边缘,当沿着垂直方向(即梯度方向)移动时,它会发生变化;但如果沿着边缘平行移动,则看起来完全相同。 红色区域代表角落,无论往哪个方向移动这个区域,看起来都不一样,说明它具有独特性。 因此,在图像处理中,角落通常被认为是很好的特征(当然,在某些情况下,斑点状区域也是不错的特征)。 这样我们就解决了"什么是特征"这个问题。但紧接着又产生了一个新问题:如何找到这些特征?或者说如何找到这些角落?
可以用直观的方式来理解:寻找那些在周围各个方向稍微移动时变化最明显的区域。 在后续章节中,我们会把这个概念转化为计算机能够理解的语言,寻找图像特征的过程就叫做特征检测。
假设已经成功检测到了图像中的特征点,接下来就需要在其他图像中找到相同的特征点。 通常会怎么做呢?观察特征点周围的区域,用语言描述它,比如"上半部分是蓝天,下半部分是建筑物区域,建筑物上有些玻璃窗"等等,然后在其他图像中寻找相似的区域。 本质上,这就是在描述特征。同样的道理,计算机也需要能够描述特征点周围的区域,这样才能在其他图像中找到对应的特征。 这种描述过程就叫做特征描述。一旦获得了特征点及其描述信息,就可以在所有图像中找到相同的特征点,然后进行对齐、拼接或其他任何想要的操作。
因此本章内容正是重点探讨OpenCV中用于特征查找、描述和匹配的各种算法。