图像中可以检测到有趣的兴趣点,例如使用Harris检测器原理找到角点,或者使用Canny检测器找到边缘。像素坐标 $(x, y)$ 提供了这些特征的位置信息。除了仅仅知道它们的位置,理解和描述这些特征对许多计算机视觉任务有益。但设想你有同一栋建筑的两张不同照片,它们是从略微不同的角度拍摄的。你可以在两张图像上运行角点检测器,并找到与特定窗户的左上角对应的角点。图像1:在 $(150, 200)$ 处检测到窗户角点。 图像2:在 $(165, 210)$ 处检测到相同的窗户角点。仅仅知道坐标并不能告诉我们第一张图像中 $(150, 200)$ 处的角点是否与第二张图像中 $(165, 210)$ 处的角点是同一个窗户角点。由于视角的改变,坐标是不同的。计算机如何判断这些点可能对应于场景的同一部分呢?这就是特征描述符的作用。什么是特征描述符?可以把特征检测器(如Harris或Canny)看作是寻找兴趣点(通常称为关键点)。那么,特征描述符更进一步:它描述了每个关键点周围的区域。描述符不仅仅是知道位置 $(x, y)$,它提供了一个数值概括,说明该关键点周围的图像块看起来是什么样子。这种描述通常以数字列表或数组的形式存储,常被称为特征向量。目标是创建一种具有以下特点的描述:有区分度: 不同的特征应该有明显不同的描述符。一个尖锐角点的描述符在数值上应该与平缓曲线或平坦区域的描述符不同。具有一定程度的稳定性: 即使图像发生了一些变化,同一个特征的描述符也应该相似。理想情况下,即使光照略微变化、图像略微旋转或尺寸略有不同,我们窗户角点的描述符也应该大体保持不变。描述符是如何创建的?(一般方法)创建一个好的描述符是一个复杂的话题,有许多不同的算法(你可能以后会接触到),但一般方法通常涉及分析关键点周围的图像块。这种分析可能会考虑:强度模式: 像素亮度值在图像块内的变化情况。梯度: 强度变化的幅度和方向(类似于边缘检测器使用的,但在图像块上进行概括)。颜色信息: 尽管描述符通常在灰度图像上工作,以简化处理并增强对颜色变化的稳定性。算法处理这些局部信息,并将其压缩成一个固定长度的数值向量。例如,一个简单的描述符可以捕获图像块不同部分的平均强度,而更复杂的描述符(如SIFT、SURF、ORB,这些超出本介绍范围)则以巧妙的方式编码梯度方向,以获得更好的性能。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="helvetica", fontsize=10]; edge [fontname="helvetica", fontsize=9]; Image [label="输入图像"]; Detect [label="特征检测\n(例如,Harris, Canny)"]; Keypoints [label="关键点位置\n(x, y 坐标)"]; Describe [label="特征描述\n(分析邻域)"]; Descriptors [label="特征描述符\n(数值向量)"]; App [label="应用\n(匹配,识别)"]; Image -> Detect; Detect -> Keypoints; Keypoints -> Describe [label="对于每个关键点"]; Image -> Describe [label="关键点周围的图像数据"]; Describe -> Descriptors; Descriptors -> App; }流程:图像由特征检测器处理,以找到关键点位置。然后,对于每个关键点,特征描述符算法分析其周围的图像区域,生成一个数值描述符向量,该向量随后可用于各种应用。为什么要使用描述符?特征描述符是许多计算机视觉任务的基础:图像匹配: 在两幅或多幅图像之间寻找对应的特征(例如在不同照片中找到同一个窗户角点)。这用于全景拼接和三维重建。物体识别: 通过将新图像中找到的特征描述符与已知物体的描述符数据库进行匹配,识别新图像中的已知物体。跟踪: 在视频序列中,随时间推移跟踪物体或兴趣点。通过将局部图像外观转换为数值形式(即描述符向量),我们使计算机能够使用这些向量间的相似度或距离的数学度量,有效地比较特征。总而言之,特征检测告诉我们图像中哪里有有趣的事物,而特征描述则告诉我们这些有趣的事物局部看起来是什么样子,提供了一种在不同条件或图像下比较和匹配它们的方法。你不会在本章的实践练习中实现描述符,但理解其作用在你学习更复杂的计算机视觉应用时很重要。