python-opencv Tutorials 一码人翻译(36)---- 特征检测和描述---筛选(尺度-不变特性转换)

目标

在这一章,

我们将学习筛选算法的概念

我们将学习如何找到筛选的关键字和描述符。

理论

在最后几章中,我们看到了一些像Harris这样的角落探测器,它们是旋转不变的,也就是说,即使图像是旋转的,我们也能找到相同的角。这是显而易见的,因为在旋转的图像中,角也是角。但是比例呢?如果图像被缩放,一个角落可能不会是一个角落。例如,检查下面的一个简单的图像。在一个小窗口中,一个小图像的一个角落在同一窗口中缩放时是平的。所以哈里斯角不是比例不变的。

 

所以,在2004年,D。英属哥伦比亚大学的罗威在他的论文中提出了一种新的算法,即尺度不变特征变换(筛分),从比例不变的关键点出发,提取出关键字并计算其描述符。(这篇论文很容易理解,并且被认为是最好的筛选材料。所以这个解释只是对这篇论文的一个简短的总结)。

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

1。尺度空间极值检测

从上面的图像中,很明显,我们不能使用相同的窗口来检测不同规模的关键点。小角落是可以的。但为了探测更大的角落,我们需要更大的窗户。为此,使用了尺度空间过滤。在它中,高斯的拉帕奇安被发现有各种各样的图像σ值。LoG作为一个blob检测器,它可以检测各种大小的blob,因为它会发生变化σ……简而言之,σ作为一个缩放参数。例如,在上面的图像中,高斯核低σ为小角落提供高价值,而高斯核高σ适合大一点的角落。所以,我们可以在范围和空间中找到当地的最大值它给了我们一个列表(x,y,σ)值意味着在(x,y)处有一个潜在的关键点σ规模。但是这个日志有点贵,所以筛选算法使用高斯函数的差值,这是对数的近似值。高斯分布的差异是由两个不同的图像的高斯模糊的差异得到的σ,让它去σkσ……这个过程是在高斯金字塔中对图像的不同八度进行的。它以下图为代表:

一旦找到这只狗,就会在局部的极端情况下搜索图像。例如,图像中的一个像素与它的8个邻居相比,在下一个尺度上是9个像素,在之前的尺度上是9个像素。如果它是一个局部极值点,它是一个潜在的关键点。它的意思是,关键点在这个尺度上是最好的。如下图所示:

 

对于不同的参数,本文给出了一些经验数据,可以总结为,八度的数量=4,比例尺的数量=5,初始值σ= 1.6,k =2- - - - - -等作为最优值。

2。关键点定位

一旦找到了潜在的关键点位置,就必须对其进行改进,以获得更准确的结果。他们使用泰勒级数展开式空间来获得更精确的极值位置,如果这个极值点的强度小于阈值(根据纸张的0.03),它就会被拒绝。这个阈值在OpenCV中被称为逆阈值

狗对边缘有更高的反应,所以边缘也需要被移除。为此,使用了类似于哈里斯角探测器的概念。他们使用2x2 Hessian矩阵(H)来计算主曲率。我们从哈里斯角探测器得知,对于边缘,一个特征值比另一个更大。这里他们使用了一个简单的函数,

如果这个比值大于一个阈值,即OpenCV中的边缘阈值,那么keypoint就会被丢弃。它以10为纸。

因此,它消除了任何低对比度的关键点和边缘关键点,剩下的就是强烈的兴趣点。

3。定向分配

现在,一个方向被分配给每个关键点以实现对图像旋转的不变性。根据不同的尺度,在keypoint位置周围移动一个区域,并且在该区域内计算出梯度的大小和方向。创建了一个有36个箱子的方向直方图,覆盖了360度。(它的加权是梯度大小和高斯加权循环窗口

σ

等于1。5乘以keypoint的比例。在直方图中最高的峰值被取走,任何超过80%的峰值也被认为是计算方向的。它创建的关键点具有相同的位置和规模,但不同的方向。它有助于匹配的稳定性。

4所示。关键点描述符

现在创建keypoint描述符。在keypoint周围有16x16个街区。它被划分为16个4个x4大小的子块。对于每个子块,创建8个bin取向直方图。所以总共有128个箱子值。它被表示为一个向量来形成keypoint描述符。除此之外,还采取了一些措施来实现对光照变化、旋转等的鲁棒性。

5。关键点匹配

两个图像之间的关键点通过识别它们最近的邻居来匹配。但在某些情况下,第二场比赛可能非常接近第一场。这可能是由于噪音或其他原因造成的。在这种情况下,关闭距离与第二近距离的比值。如果大于0。8,就会被拒绝。它消除了大约90%的假匹配,而只丢弃了5%的正确匹配,就像在纸上一样。

这是对筛选算法的总结。要了解更多的细节和理解,我们强烈推荐阅读原文。记住一件事,这个算法是专利的。所以这个算法包含在opencv的回购协议中

OpenCV的筛选

现在让我们来看看OpenCV中的筛选功能。让我们从keypoint检测开始并绘制它们。首先,我们要构造一个筛选对象。我们可以将不同的参数传递给它,它们是可选的,它们在文档中得到了很好的解释。

import numpy as np
import cv2 as cv

img = cv.imread('tiananmen.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.imshow('sift_keypoints1.jpg',img)
img=cv.drawKeypoints(gray,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv.imwrite('sift_keypoints2.jpg',img)

图像

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

既然您已经找到了keypoints,您可以调用sift.compute(),它从我们找到的关键点中计算描述符。kp,des = sift.compute(灰色,kp)

如果您没有找到关键点,直接在一个步骤中找到关键字和描述符,并使用该函数,sift.detectAndCompute()。

我们将看到第二种方法:

sift = cv.xfeatures2d.SIFT_create()

kp, des = sift.detectAndCompute(gray,None)

这里的kp是一个关键点的列表而des是一个numpy的形状数组

Number_of_Keypoints×128

我们有了关键字,描述符等等,现在我们想看看如何在不同的图像中匹配关键点。我们将在接下来的章节中学习。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值