在使用OpenCV时,例如,通常会使用诸如SIFT或SURF的算法来检测关键点。那么,这些关键点到底是什么?
我知道它们是图像中某种“感兴趣的点”。我还知道它们是尺度不变的且呈圆形。
此外,我发现它们具有方向,但我无法理解这究竟是什么。它是否是半径和某个东西之间的角度?您能给一些解释吗?我认为首先需要更简单的解释,然后才能更容易地理解论文。
在使用OpenCV时,例如,通常会使用诸如SIFT或SURF的算法来检测关键点。那么,这些关键点到底是什么?
我知道它们是图像中某种“感兴趣的点”。我还知道它们是尺度不变的且呈圆形。
此外,我发现它们具有方向,但我无法理解这究竟是什么。它是否是半径和某个东西之间的角度?您能给一些解释吗?我认为首先需要更简单的解释,然后才能更容易地理解论文。
让我们逐一解决每个问题:
我的问题是这些关键点实际上是什么?
关键点与兴趣点相同。它们是图像中定义有趣或突出的空间位置或点。兴趣点检测实际上是斑点检测的一个子集,旨在在图像中找到有趣的区域或空间区域。关键点之所以特殊,是因为无论图像如何变化...无论图像旋转、缩小/扩展、平移(顺便说一下,所有这些都将是仿射变换...)或受到畸变(即投影变换或单应性),当与原始图像进行比较时,您应该能够在修改后的图像中找到相同的关键点。以下是我之前写过的帖子中的例子:
来源:module' object has no attribute 'drawMatches' opencv python
右边的图像是左边图像的旋转版本。我仅显示了两个图像之间前10个匹配点。如果您看一下这前10个匹配点,这些点可能是我们想要关注的点,这将使我们记住图像内容。我们需要关注摄影师的面部、相机、三脚架以及背景建筑物上的一些有趣纹理。您会发现这些相同的点在两个图像之间被找到,并且成功地匹配了。
因此,您应该从中得出的结论是,这些是图像中有趣的点,无论图像如何变形,都应该能够找到它们。
我知道它们是某种图像“兴趣点”。我还知道它们是尺度不变的,而且是圆形的。
你说得对。尺度不变意味着无论如何缩放图像,您都应该能够找到这些点。
基本上,如果您想检测与比例和方向无关的关键点,则当他们谈论关键点的方向时,他们真正的意思是搜索围绕关键点的像素邻域,并找出该像素邻域的方向或该补丁面向的方向。这取决于您查看的描述符框架,但总体上是要在补丁中检测最显著的梯度角度方向。这对于匹配非常重要,以便可以将关键点进行匹配。看一下我与两个摄影师的第一个图,其中一个摄影师旋转而另一个没有。如果您看一些那些点,我们如何确定一个点与另一个点匹配?我们可以轻松地识别出摄影师顶部作为感兴趣点与旋转版本相匹配,因为我们查看周围关键点并查看所有这些点的方向...从那里,就可以计算方向。此外,我发现它们具有方向,但我无法理解它实际上是什么。它是半径和某物之间的角度吗?
通常当我们想要检测关键点时,只需查看其位置即可。然而,如果您想在图像之间匹配关键点,则绝对需要尺度和方向来实现。
我对SURF不是很熟悉,但我可以告诉你一些关于SURF基础的SIFT知识。我在末尾提供了一些关于SURF的笔记,但我并不知道所有的细节。
SIFT旨在在图像中找到高度独特的位置(或关键点)。这些位置不仅仅是图像上的2D位置,而是图像的尺度空间中的位置,意味着它们具有三个坐标:x、y和scale。找到SIFT关键点的过程如下:
SURF旨在实现与SIFT相同的目标,但使用一些巧妙的技巧来提高速度。
对于斑点检测,它使用海森矩阵行列式方法。通过检查Haar小波的水平和垂直响应来找到主导方向。特征描述符类似于SIFT,查看16个局部邻域中像素的方向,但结果为64维向量。
SURF特征可以比SIFT特征快3倍计算,但在大多数情况下同样稳健。
供参考:
tl;dr
差异。 - rayryeng