快捷搜索:  汽车  科技

opencv的霍夫变换(尺度不变特征变换)

opencv的霍夫变换(尺度不变特征变换)从上图可以看出,我们不能使用同一个窗口来检测不同比例的关键点。小角落可以。但要检测更大的角落,我们需要更大的窗口。为此,使用缩放空间过滤。其中,对于具有各种σ的图像,找到高斯拉普拉斯算子值(LoG)。LoG充当斑点检测器,其检测由于σ的变化而导致的各种尺寸的斑点。简而言之,σ充当尺度的缩放参数。例如,在上图中,具有低σ的高斯核时对于小的角点,而高σ值适合较大的角落。因此,我们可以找到整个比例和空间的局部最大值,它给出了一个(x,y,σ)的列表,这意味着在对应的σ尺度范围处存在潜在的关键点(x,y)。1.尺度空间极值检测因此,在2004年,不列颠哥伦比亚大学的D.Lowe在他的论文中提出了一种新的算法,尺度不变特征变换(SIFT),从尺度不变关键点获取独特图像特征,它提取关键点并计算其描述符。*(该论文易于理解,被认为是SIFT上最好的材料。本文只是该论文的简要解释)*。SIFT算法可以将一

目标

在这一章当中,

  • 我们将了解SIFT算法的概念
  • 我们将学习如何找到SIFT关键点和描述符。

理论

在之前的几章中,我们看到了一些角点探测器,如Harris等。它们是旋转不变的,这意味着,即使图像旋转,我们也可以找到相同的角落。很明显,因为角落在旋转图像中也是角落。但是缩放呢?如果图像缩放,角落可能不是角落。例如,检查下面的简单图像。当在同一窗口中放大时,小窗口内的小图像中的角是平坦的。所以哈里斯的角点受尺度影响。

opencv的霍夫变换(尺度不变特征变换)(1)

因此,在2004年,不列颠哥伦比亚大学的D.Lowe在他的论文中提出了一种新的算法,尺度不变特征变换(SIFT),从尺度不变关键点获取独特图像特征,它提取关键点并计算其描述符。*(该论文易于理解,被认为是SIFT上最好的材料。本文只是该论文的简要解释)*。

SIFT算法可以将一幅图像映射(变换)为一个局部特征向量集;特征向量具有平移、缩放、旋转不变性,同时对光照变化、仿射及投影变换也有一定的不变性。SIFT算法的实质是在不同的尺度空间上查找关键点,并计算出关键点的方向。所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

SIFT算法主要涉及四个步骤。我们将逐一看到它们。

  1. 高斯差分(DoG)滤波:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
  2. 尺度空间的极值检测和关键点位置确定:对DoG金字塔中的每一层,进行尺度空间的极值检测(极大值和极小值),把每一个极值点作为候选点,在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
  3. 关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
  4. 构建关键点特征描述符:在每个关键点周围的内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

1.尺度空间极值检测

从上图可以看出,我们不能使用同一个窗口来检测不同比例的关键点。小角落可以。但要检测更大的角落,我们需要更大的窗口。为此,使用缩放空间过滤。其中,对于具有各种σ的图像,找到高斯拉普拉斯算子值(LoG)。LoG充当斑点检测器,其检测由于σ的变化而导致的各种尺寸的斑点。简而言之,σ充当尺度的缩放参数。例如,在上图中,具有低σ的高斯核时对于小的角点,而高σ值适合较大的角落。因此,我们可以找到整个比例和空间的局部最大值,它给出了一个(x,y,σ)的列表,这意味着在对应的σ尺度范围处存在潜在的关键点(x,y)。

但是这个LoG开销很大,因此SIFT算法使用高斯差分,这是LoG的近似值。获得高斯差异作为具有两个不同σ的图像的高斯模糊的差异,让它成为σ和ķσ。对于高斯金字塔中的图像的不同八度音程,完成该过程。它在下图中表示:

opencv的霍夫变换(尺度不变特征变换)(2)

找到此DoG后,将搜索图像以查找超出比例和空间的局部极值。例如,将图像中的一个像素与其8个邻居以及下一个比例中的9个像素和先前比例中的9个像素进行比较。如果它是一个局部极值,它是一个潜在的关键点。它基本上意味着关键点最好以该比例表示。如下图所示:

opencv的霍夫变换(尺度不变特征变换)(3)

针对不同的参数,本文给出了一些经验数据,可以概括为:八度值= 4,等级数= 5,初始σ= 1.6,k=√2 等作为最佳值。

2.关键点本地化

一旦找到潜在的关键点位置,就必须对其进行细化以获得更准确的结果。他们使用泰勒级数扩展的尺度空间来获得更准确的极值位置,并且如果此极值处的强度小于阈值(根据论文为0.03),则将其拒绝。此阈值在OpenCV中称为contrastThreshold DoG对边缘的响应更高,因此也需要去除边缘。为此,使用类似于Harris角点检测器的概念。他们使用2x2 Hessian矩阵(H)来计算主曲率。我们从Harris角点检测器得知,对于边缘,一个特征值大于另一个。所以这里他们使用了一个简单的函数

如果此比率大于阈值(在OpenCV中称为edgeThreshold),则丢弃该关键点。在论文中给出的建议值为10。因此,它消除了任何低对比度关键点和边缘关键点,剩下的是强烈的兴趣点。

3.定向分配

现在,为每个关键点分配方向,以实现图像旋转的不变性。根据比例在关键点位置周围进行邻域计算,并且在该区域中计算梯度大小和方向。创建了包含360度的36个方向直方图。(它由梯度幅度和高斯加权圆窗加权σ加权等于关键点尺度的1.5倍。采用直方图中的最高峰,并且还考虑任何高于其的80%的峰来计算方向。它创建具有相同位置和比例但不同方向的关键点。它有助于匹配的稳定性。

4.关键点描述符

现在创建了关键点描述符。在关键点周围采用16x16邻域。它分为16个4x4大小的子块。对于每个子块,创建8个方向直方图。因此总共有128个bin值可用。它表示为形成关键点描述符的向量。除此之外,还采取了一些措施来实现对照明变化,旋转等的鲁棒性。

5.关键点匹配

通过识别它们的最近邻居来匹配两个图像之间的关键点。但在某些情况下,第二个最接近的匹配可能非常接近第一个,它可能由于噪音或其他原因而发生。在那种情况下,采用最近距离与第二最近距离的比率。如果它大于0.8,则拒绝它们。根据论文,它消除了大约90%的错误匹配,而丢弃了只有5%的正确匹配。

所以这是SIFT算法的总结。有关更多详细信息和理解,强烈建议阅读原始论文。记住一件事,这个算法是专利的。所以这个算法包含在opencv contrib repo中

OpenCV中的SIFT

现在让我们看看OpenCV中提供的SIFT功能。让我们从关键点检测开始并绘制它们。首先,我们必须构造一个SIFT对象。我们可以向它传递不同的参数,这些参数是可选的,它们在文档中有很好的解释。

import numpy as np import cv2 as cv img = cv.imread('home.jpg') gray= cv.cvtColor(img cv.COLOR_BGR2GRAY) sift = cv.xfeatures2d.SIFT_create() kp = sift.detect(gray None) img = cv.drawKeypoints(gray kp img) cv.imwrite('sift_keypoints.jpg' img)

sift.detect()函数查找图像中的关键点。如果只想搜索图像的一部分,则可以传递蒙版。每个关键点都是一个特殊的结构,它有许多属性,如(x,y)坐标,有意义邻域的大小,指定方向的角度,指定关键点强度的响应等。

OpenCV还提供cv.drawKeyPoints() 函数,该函数在关键点的位置上绘制小圆圈。如果你向它传递一个标志cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,它将绘制一个大小为keypoint的圆圈,它甚至会显示它的方向。见下面的例子。

img=cv.drawKeypoints(gray kp img flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv.imwrite('sift_keypoints.jpg' img)

请参阅以下两个结果:

opencv的霍夫变换(尺度不变特征变换)(4)

现在要计算描述符,OpenCV提供了两种方法。

  1. 由于您已经找到了关键点,因此可以调用sift.compute() 来计算我们找到的关键点的描述符。例如:kp des = sift.compute(gray kp)
  2. 如果您没有找到关键点,请使用函数sift.detectAndCompute()在一个步骤中直接查找关键点和描述符。

我们将看到第二种方法:

sift = cv.xfeatures2d.SIFT_create() kp des = sift.detectAndCompute(gray None)

这里kp是关键点列表,des是numpy数组的shape,Number_of_Keypoints ×128。所以我们得到了关键点,描述符等。

原文:https://docs.opencv.org/3.4.1/da/df5/tutorial_py_sift_intro.html

拓展阅读:https://blog.csdn.net/jancis/article/details/80824793

猜您喜欢: