第二章:SIFT(尺度不变特征变换)

  • 1. SIFT简介
    • 1.1 SIFT算法特点
    • 1.2 SIFT特征检测的步骤
  • 2. 尺度空间
  • 3. 高斯模糊
    • 3.1 高斯模糊
    • 3.2 高斯金字塔
  • 4. DoG金字塔
    • 4.1 DoG局部极值检测
    • 4.2 DoG去除边缘响应
      • 4.2.1低对比度的响应点
      • 4.2.2不稳定的边缘响应点
  • 5.确定特征点的主方向
  • 6.关键点描述
  • 7. 关键点匹配
  • 8. RANSAC算法
    • 8.1RANSAC简介
    • 8.2 RANSAC 数学原理
    • 8.3 RANSAC算法步骤
  • 9. SIFT部分的实验及小结
    • 9.1数据集准备
    • 9.2 SIFT单张图片特征提取
    • 9.3 SIFT进行两张图像匹配
    • 9.4 SIFT数据集匹配图片
    • 9.5 局部描述子匹配&可视化连接的图片
  • 10. RANSAC部分的实验及小结
    • 10.1 使用RANSAC前后分析
    • 10.2 场景分析
  • 11. 遇到的问题及总结
    • 11.1 遇到的问题
    • 11.2 总结

1. SIFT简介

全称Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。
SIFT算法的实质可以归为在不同尺度空间上查找特征点(关键点)的问题。

1.1 SIFT算法特点

  • 图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
  • 独特性好信息量丰富,适用于海量特征库进行快速、准确的匹配。
    多量性,即使是很少几个物体也可以产生大量的SIFT特征
  • 高速性,经优化的SIFT匹配算法甚至可以达到实时性
  • 扩招性,可以很方便的与其他的特征向量进行联合。

1.2 SIFT特征检测的步骤

  • 1.尺度空间的极值检测: 搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和选择不变的兴趣点。

  • 2.特征点定位: 在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度。

  • 3.特征方向赋值: 基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。

  • 4.特征点描述: 在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。

2. 尺度空间

  • 什么是尺度空间:从图像的角度来解释尺度,尺度空间就是在多个尺度下观察目标,然后加以综合的分析、理解和应用。尺度空间中各尺度图像的 模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标 在视网膜上的形成过程。 尺度越大图像越模糊。
  • 尺度空间的作用:在一定的范围内,无论物体是大还是小,人眼都可以分辨出来。然而计算机要有相同的能力却不是那么的容易,在未知的场景中,计算机视觉并不能提供物体的尺度大小,其中的一种方法是把物体不同尺度下的图像都提供给机器,让机器能够对物体在不同的尺度下有一个统一的认知。在建立统一认知的过程中,要考虑的就是在图像在不同的尺度下都存在的特征点。
  • 哪些点是SIFT中要查找的特征点:十分突出的点不会因光照、尺度、旋转等因素的改变而消 失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。既然两幅图像中 有相同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间会有 相互对应的匹配点。

3. 高斯模糊

我们可以通过图像的模糊程度来模拟人在距离物体由远到近时物体在视网膜上成像过程,距离物体越近其尺寸越大图像也越模糊,这就是高斯尺度空间,使用不同的参数模糊图像(分辨率不变),是尺度空间的另一种表现形式。

3.1 高斯模糊

  • 高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次。这种模糊技术生成的图像,其视觉效果就像是经过一个毛玻璃在观察图像,这与镜头焦外成像效果散景以及普通照明阴影中的效果都明显不同。
  • 高斯平滑也用于计算机视觉算法中的预先处理阶段,以增强图像在不同比例大小下的图像效果(参见尺度空间表示以及尺度空间实现)。 从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。图像与圆形方框模糊做卷积将会生成更加精确的焦外成像效果。由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波器。
  • 高斯核是唯一一个可以产生多尺度空间的核,图像和高斯函数进行卷积运算能够对图像进行模糊,使用不同的“高斯核”可得到不同模糊程度的图像。一副图像其高斯尺度空间可由其和不同的高斯卷积得到:

  • 其中,G(x,y,σ)是高斯核函数
    σ称为尺度空间因子,它是高斯正态分布的标准差,反映了图像被模糊的程度,其值越大图像越模糊,对应的尺度也就越大。L(x,y,σ)代表着图像的高斯尺度空间。

3.2 高斯金字塔

  • 图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张图像),每个金字塔共n层。

  • 图像金字塔是同一图像在不同的分辨率下得到的一组结果,其生成过程一般包括两个步骤:
    1.对原始图像进行平滑
    2.对处理后的图像进行降采样

  • 什么是降采样:在数位信号处理领域中,降采样,又作减采集,是一种多速率数字信号处理的技术或是降低信号采样率的过程,通常用于降低数据传输速率或者数据大小。

  • 降采样后得到一系列不断尺寸缩小的图像。显然,一个传统的金字塔中,每一层的图像是其上一层图像长、高的各一半。多分辨率的图像金字塔虽然生成简单,但其本质是降采样,图像的局部特征则难以保持,也就是无法保持特征的尺度不变性。

  • 为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。将图像金字塔每层的一张图像使用不同参数做高斯模糊,使得金字塔的每层含有多张高斯模糊图像,将金字塔每层多张图像合称为一组(Octave),金字塔每层只有一组图像,组数和金字塔层数相等,每组含有多张(也叫层Interval)图像。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。

  • 为什么要搭建高斯金字塔:高斯金字塔模仿的是图像的不同的尺度,尺度应该怎样理解?对于一副图像,你近距离观察图像,与你在一米之外观察,看到的图像效果是不同的,前者比较清晰,后者比较模糊,前者比较大,后者比较小,通过前者能看到图像的一些细节信息,通过后者能看到图像的一些轮廓的信息,这就是图像的尺度,图像的尺度是自然存在的,并不是人为创造的。好了,到这里我们明白了,其实以前对一幅图像的处理还是比较单调的,因为我们的关注点只落在二维空间,并没有考虑到“图像的纵深”这样一个概念,如果将这些内容考虑进去我们是不是会得到更多以前在二维空间中没有得到的信息呢?于是高斯金字塔横空出世了,它就是为了在二维图像的基础之上,榨取出图像中自然存在的另一个维度:尺度。因为高斯核是唯一的线性核,也就是说使用高斯核对图像模糊不会引入其他噪声,因此就选用了高斯核来构建图像的尺度。

  • 高斯金字塔的组数和层数
    在高斯金字塔中,有两个参数很重要,一个是第几组o,一个是某一组中的第几层s,这两个量合起来(o,s)就构成了高斯金字塔的尺度空间。变量o控制的是金字塔中尺寸这个尺度,s用来区分同一个尺寸尺度下的图像,s确定了一个组中不同的模糊成度。这样,(o,s)就可以确定高斯金字塔中的唯一一副图像。

    根据lowe论文中指出,(o,s)作用于一幅图像是通过下列公式实现的:
    σ=σ0∗2o+sS\sigma=\sigma_0*2^{o+\frac{s}{S}}σ=σ0​∗2o+Ss​
    其中σ0\sigma_0σ0​为高斯模糊的初始值,S为每层的层数。

4. DoG金字塔

  • 构建尺度空间的目的是为了检测出在不同的尺度下都存在的特征点,而检测特征点较好的算子是 Δ2G\Delta ^2GΔ2G(高斯拉普拉斯,LoG),使用LoG虽然能较好的检测到图像中的特征点,但是其运算量过大,通常可使用DoG(差分高斯,Difference of Gaussina)来近似计算LoG[Marr and Hidreth]。
  • 设k为相邻两个高斯尺度空间的比例因子,则DoG的定义:

D(x,y,σ)=[G(x,y,kσ)−G(x,y,σ)]∗I(x,y)=L(x,y,kσ)−L(x,y,σ)D(x,y,\sigma)=[G(x,y,k\sigma)-G(x,y,\sigma)]*I(x,y)=L(x,y,k\sigma)-L(x,y,\sigma)D(x,y,σ)=[G(x,y,kσ)−G(x,y,σ)]∗I(x,y)=L(x,y,kσ)−L(x,y,σ)

  • 其中,L(x,y,σ)是图像的高斯尺度空间。
    从上式可以知道,将相邻的两个高斯空间的图像相减就得到了DoG的响应图像。为了得到DoG图像,先要构建高斯尺度空间,而高斯的尺度空间可以在图像金字塔降采样的基础上加上高斯滤波得到,也就是对图像金字塔的每层图像使用不同的参数σ进行高斯模糊,使每层金字塔有多张高斯模糊过的图像。
  • DoG金字塔:高斯金字塔构建成功后,将每一组相邻的两层相减就可以得到DoG金字塔.DoG图像描绘的是目标的轮廓

4.1 DoG局部极值检测

  • 为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,改点就是极值点。如图所示,中间的检测点要和其所在图像的3×3邻域8个像素点,以及其相邻的上下两层的3×3领域18个像素点,共26个像素点进行比较。以确保在尺度空间和二维图像空间都检测到极值点。
  • 从上面的描述中可以知道,每组图像的第一层和最后一层是无法进行比较取得极值的。为了满足尺度变换的连续性,在每一组图像的顶层继续使用高斯模糊生成3幅图像。

4.2 DoG去除边缘响应

通过比较检测得到的DoG的局部极值点所在离散的空间搜索得到的,由于离散空间是对连续空间采样得到的结果,在离散空间找到的极值点不一定是真正意义上的极值点,因此要设法将不满足条件的点剔除掉。可以通过尺度空间DoG函数进行曲线拟合寻找极值点,这一步的本质是去掉DoG局部曲率非常不对称的点。
要剔除掉的不符合要求的点主要有两种:

  • 低对比度的特征点
  • 不稳定的边缘响应点
4.2.1低对比度的响应点

为了提高关键点的稳定性,需要对尺度空间DoG函数进行曲线拟合。利用DoG函数在尺度空间的Taylor展开式(拟合函数)为:
D(X)=D+αDrαX+12Xrα2DαX2XD(X)=D+\frac{\alpha D^r}{\alpha X}+\frac{1}{2}X^r\frac{\alpha ^2D}{\alpha X^2}XD(X)=D+αXαDr​+21​XrαX2α2D​X
其中,X=(x,y,σ)rX=(x,y,\sigma)^rX=(x,y,σ)r求导并让方程等于零,可以得到极值点的偏移量为:
X^=−α2D−1αX2α2DαX\hat{X}=-\frac{\alpha^2 D^-1}{\alpha X^2}\frac{\alpha^2 D}{\alpha X}X^=−αX2α2D−1​αXα2D​
对应极值点,方程的值为:
D(X^)=D+12αDrαXX^D(\hat{X})=D+\frac{1}{2}\frac{\alpha D^r}{\alpha X}\hat{X}D(X^)=D+21​αXαDr​X^

其中,X^=(x,y,σ)r\hat{X}=(x,y,\sigma)^rX^=(x,y,σ)r代表相对插值中心的偏移量,当它在任一维度上的偏移量大于0.5时(即x或y或),意味着插值中心已经偏移到它的邻近点上,所以必须改变当前关键点的位置。同时在新的位置上反复插值直到收敛;也有可能超出所设定的迭代次数或者超出图像边界的范围,此时这样的点应该删除,在Lowe中进行了5次迭代。另外,∣D(x)∣|D(x)|∣D(x)∣过小的点易受噪声的干扰而变得不稳定,所以将∣D(x)∣|D(x)|∣D(x)∣小于某个经验值(Lowe论文中使用0.03,Rob Hess等人实现时使用0.04/S)的极值点删除。同时,在此过程中获取特征点的精确位置(原位置加上拟合的偏移量)以及尺度(σ(o,s)和σoct(s)\sigma(o,s)和\sigma_oct(s)σ(o,s)和σo​ct(s))。

4.2.2不稳定的边缘响应点

一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。

DOG算子会产生较强的边缘响应,需要剔除不稳定的边缘响应点。获取特征点处的Hessian矩阵,主曲率通过一个2x2 的Hessian矩阵H求出:

H=[DxxDxyDxyDyy]H=\begin{bmatrix} D_{xx} & D_{xy}\\D_{xy} & D_{yy} \end{bmatrix}H=[Dxx​Dxy​​Dxy​Dyy​​]
H的特征值α和β代表x和y方向的梯度
Tr(H)=Dxx+Dyy=α+βT_r(H)= D_{xx} +D_{yy} =\alpha+\betaTr​(H)=Dxx​+Dyy​=α+β
Det(H)=Dxx+Dyy−Dxy2=α∗βD_{et}(H)= D_{xx} +D_{yy} -D_{xy}^2=\alpha*\betaDet​(H)=Dxx​+Dyy​−Dxy2​=α∗β
其中Tr(H)T_r(H)Tr​(H)为矩阵H的迹(对角线元素之和) Det(H)D_{et}(H)Det​(H)表示矩阵H的行列式.为了避免求具体的值,可使用H特征值得比例。假设是α较大的特征值,而是β较小的特征值,令γ=αβ\gamma=\frac{\alpha}{\beta}γ=βα​表示最大特征值和最小特征值的比值,则Tr(H)2Det(H)=(α+β)2αβ2=(γβ+β)2γβ2=(γ+1)2γ\frac{T_r(H)^2}{D_{et}(H)}=\frac{(\alpha+\beta)^2}{\alpha\beta^2}=\frac{(\gamma\beta+\beta)^2}{\gamma\beta^2}=\frac{(\gamma+1)^2}{\gamma}Det​(H)Tr​(H)2​=αβ2(α+β)2​=γβ2(γβ+β)2​=γ(γ+1)2​
上式的结果与两个特征值的比例有关,和具体的大小无关,当两个特征值相等时其值最小,并且随着γ\gammaγ的增大而增大,因此为了检测主曲率是否在某个阈值TrT_rTr​下,只需要检测Tr(H)2Det(H)>(Tr+1)2Tr\frac{T_r(H)^2}{D_{et}(H)}>\frac{(T_r+1)^2}{T_r}Det​(H)Tr​(H)2​>Tr​(Tr​+1)2​

如果上式成立,则剔除该特征点,否则保留。(论文中TrT_rTr​取10)

5.确定特征点的主方向

经过上面的步骤已经找到了在不同尺度下都存在的特征点,为了实现图像旋转不变性,需要给特征点的方向进行赋值。利用特征点邻域像素的梯度分布特性来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。
找到了特征点,也就可以得到该特征点的尺度σ,也就可以得到特征点所在的尺度图像:
L(x,y,σ)=G(x,y,σ)∗I(x,y)L(x,y,\sigma)=G(x,y,\sigma)*I(x,y)L(x,y,σ)=G(x,y,σ)∗I(x,y)
计算以特征点为中心、以3×1.5σ3×1.5σ为半径的区域图像的幅角和幅值,每个点L(x,y)的梯度的模m(x,y)以及方向θ(x,y)可通过下面公式求得

  • 像素点的梯度表示 :gradI(x,y)=(αIαx,αIαy)gradI(x,y)=(\frac{\alpha I}{\alpha x},\frac{\alpha I}{\alpha y})gradI(x,y)=(αxαI​,αyαI​)
  • 梯度幅值:
  • 梯度方向:
  • 计算得到梯度方向后,就要使用直方图统计特征点邻域内像素对应的梯度方向和幅值。
  • 梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每36度一个柱共10个柱,或者没45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加。
  • 主方向:在直方图的峰值就是特征点的主方向
  • 辅助方向:当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。所以,一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)。Lowe在论文中指出15%的关键点具有多方向,而且这些点对匹配的稳定性很关键。
  • 在Lowe的论文还提到了使用高斯函数对直方图进行平滑以增强特征点近的邻域点对关键点方向的作用,并减少突变的影响。为了得到更精确的方向,通常还可以对离散的梯度直方图进行插值拟合。具体而言,关键点的方向可以由和主峰值最近的三个柱值通过抛物线插值得到。
  • 得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点。

6.关键点描述

通过以上的步骤已经找到了SIFT特征点位置、尺度和方向信息,下面就需要使用一组向量来描述关键点也就是生成特征点描述子,这个描述符不只包含特征点,也含有特征点周围对其有贡献的像素点。描述子应具有较高的独立性,以保证匹配率。

  • 特征描述符的生成大致有三个步骤:
    1.校正旋转主方向,确保旋转不变性。
    2.生成描述子,最终形成一个128维的特征向量
    3.归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。

为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θ(特征点的主方向)角度,即将坐标轴旋转为特征点的主方向。旋转后邻域内像素的新坐标为:

旋转后以主方向为中心取 8×8的窗口。下图所示,左图的中央为当前关键点的位置,每个小格代表为关键点邻域所在尺度空间的一个像素,求取每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算。最后在每个4×4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,如右图所示。每个特征点由4个种子点组成,每个种子点有8个方向的向量信息。这种邻域方向性信息联合增强了算法的抗噪声能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。

Lowe实验结果表明:描述子采用448=128维向量表征,综合效果最优(不变性与独特性)
通过对特征点周围的像素进行分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

7. 关键点匹配

  • 分别对模板图和实时图建立关键点描述子集合。目标的识别是通过两点内关键点描述子的比对来完成。具有128维的关键点描述子的相似性度量采用欧式距离。
  • 关键点的匹配可以采用穷举法来完成,但是会耗时太多,一般采用kd树的数据结构来完成搜索。
  • 搜索的内容是以目标图像的关键点为基准,搜索与目标图像的特征点最临近的原图像特征点和次临界的原图像特征点。

8. RANSAC算法

8.1RANSAC简介

  • RANSAC的作用:在基于特征点的视觉SLAM中,通常情况下,在特征匹配过程中往往会存在误匹配信息,使得计算获取的位姿精度低,易产生位姿估计失败的问题,因此,剔除这些错配点有很大的必要性。常会用到RANSAC算法进行消除两两匹配图像的误匹配点。

  • 局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。RANSAC做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。

  • RANSAC的基本假设是
    (1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
    (2)“局外点”是不能适应该模型的数据;
    (3)除此之外的数据属于噪声。

  • 最小二乘法与RANSAC的区别
    1.最小二乘法尽量去适应包括局外点在内的所有点。
    2.RANSAC能得出一个仅仅用局内点计算出模型,并且概率还足够高。但是,RANSAC并不能保证结果一定正确,为了保证算法有足够高的合理概率,必须小心的选择算法的参数(参数配置)。
    3.经实验验证,对于包含80%误差的数据集,RANSAC的效果远优于直接的最小二乘法。

8.2 RANSAC 数学原理

  • OpenCV中滤除误匹配对采用RANSAC算法寻找一个最佳单应性矩阵H,矩阵大小为3×3。RANSAC目的是找到最优的参数矩阵使得满足该矩阵的数据点个数最多,通常令h33=1h_{33}=1h33​=1来归一化矩阵。由于单应性矩阵有8个未知参数,至少需要8个线性方程求解,对应到点位置信息上,一组点对可以列出两个方程,则至少包含4组匹配点对。
    s[x′y′1]=[h11h12h13h21h22h23h31h32h33][xy1]s\begin{bmatrix} x'\\ y'\\1 \end{bmatrix}=\begin{bmatrix} h_{11} & h_{12}&h_{13}\\h_{21} & h_{22}&h_{23}\\h_{31} & h_{32}&h_{33} \end{bmatrix}\begin{bmatrix} x\\ y\\1 \end{bmatrix} s⎣⎡​x′y′1​⎦⎤​=⎣⎡​h11​h21​h31​​h12​h22​h32​​h13​h23​h33​​⎦⎤​⎣⎡​xy1​⎦⎤​
    其中(x,y)表示目标图像角点位置,(x’,y’)为场景图像角点位置,s为尺度参数。
  • RANSAC算法从匹配数据集中随机抽出4个样本并保证这4个样本之间不共线,计算出单应性矩阵,然后利用这个模型测试所有数据,并计算满足这个模型数据点的个数与投影误差(即代价函数),若此模型为最优模型,则对应的代价函数最小。
    ∑i=0n(xi′−h11xi+h12yi+h13h31xi+h32yi+h33+yi′−h21xi+h22yi+h23h31xi+h32yi+h33)2\sum_{i=0}^n (x_i'-\frac{h_{11}x_i+h_{12}y_i+h_{13}}{h_{31}x_i+h_{32}y_i+h_{33}}+y_i'-\frac{h_{21}x_i+h_{22}y_i+h_{23}}{h_{31}x_i+h_{32}y_i+h_{33}})^2i=0∑n​(xi′​−h31​xi​+h32​yi​+h33​h11​xi​+h12​yi​+h13​​+yi′​−h31​xi​+h32​yi​+h33​h21​xi​+h22​yi​+h23​​)2

8.3 RANSAC算法步骤

  • 随机从数据集中随机抽出4个样本数据 (此4个样本之间不能共线),计算出变换矩阵H,记为模型M;

  • 计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集 I ;

  • 如果当前内点集 I 元素个数大于最优内点集 I_best , 则更新 I_best = I,同时更新迭代次数k ;

  • 如果迭代次数大于k,则退出 ; 否则迭代次数加1,并重复上述步骤;

注:迭代次数k在不大于最大迭代次数的情况下,是在不断更新而不是固定的,见上方k的更新;
其中
p为置信度,一般取0.995;
w为”内点”的比例 ;
m为计算模型所需要的最少样本数=4;
求得单应矩阵后,把内点留下,内点就是筛选后的好用的点,外点舍弃,外点就有可能是误匹配的点。

9. SIFT部分的实验及小结

9.1数据集准备

  • 此次实验准备了18张图片当作数据集

9.2 SIFT单张图片特征提取

  • 1-3张的SIFT单张特征提取

  • 6-9张的SIFT单张特征提取

  • 10-12张的SIFT单张特征提取

  • 13-15张的SIFT单张特征提取

  • 16-18张的SIFT单张特征提取

  • SIFT和Harris比较

    小结:
  • 我这里拍摄了多个场景以及同一个场景的不同角度的照片。
  • 第一张图和第二张图片是同一个建筑物的不同尺度,但标记的SIFT点在很大程度上相同,比如门和窗这样细小的部分中标记的位置都相似,可以看出SIFT算法的局部特征非常的稳定。
  • SIFT和Harris 相比较:从结果来直接看,发现SIFT算法的特征点比Harris角点的特征点保留的更多,它需要建立高斯图像金字塔和高斯差分金字塔之后再检测极值,而Harris角点只是对原图进行角点检测和变化,Harris特征点检测存在角点信息丢失与偏移的现象。在运行程序时,与Harris的效率相比,SIFT的效率有大的提升,程序的运行很快。

9.3 SIFT进行两张图像匹配

将此部分测试分类为以下3种:

  • 同一场景不同角度的匹配
  • 完全不同场景的匹配
  • 较为相似的场景匹配(可能是同一建筑可能不是)

1.同一场景不同角度的匹配:




小结:

  • 这一组的测试中,每组的2张图片都存在相同的建筑物。像第一组的建筑物变化非常小,只是远近稍有不同,所以匹配度非常强,连线有很多。后面的几组与第一组相比,变换的角度和场景跟多,但仍然有许多准确的特征点可以精确的匹配对。比如最后一组图像中低层的窗户的那一点,和楼后花园的两点,匹配的很精准。
  • 因为SIFT算法在采用了高斯差分金字塔的前提下,还经过了很多的处理,比如对尺度空间DoG函数进行曲线拟合以提高关键点的稳定性。
  • 为了增强匹配的鲁棒性,在确定方向时,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。因此,对于同一梯度值的多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建但方向不同。仅有15%的关键点被赋予多个方向,但可以明显感觉到关键点匹配的稳定性。

2.完全不同场景的匹配:



小结:

  • 这组图片都专门选择了2张完全不同的地方来进行测验,结果是没有任何特征点匹配到任何特征点,测试结果与实际相符。

3.较为相似的场景匹配:



小结:

  • 这组测试的难度相比前2组更大一些,因为这些楼都长得非常相似,例如第一组图像的右下方那排楼房,颜色和形状之类的一模一样,可其实是不同的2栋楼,代码运行的结果非常好,因为没有匹配到任何点,而2,3组中有相同建筑的部分都有很精准的匹配到。这组测试最能体现出SIFT算法的准确性。
  • SIFT在图像处理阶段采用了很多步骤来保证精确性外,当两幅图像的SIFT特征向量生成后,用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图像1中的某个关键点,并找出其与图像2中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离少于某个比例阈值,则接受这一对匹配点。降低这个比例阈值,SIFT匹配点数目会减少,但更加稳定。

9.4 SIFT数据集匹配图片

  • 输入:一张数据集中没有的图片
  • 输出:在数据集中匹配度最高的图片
    输入:
    输出:

    小结:
  • 这组代码测试我又挑选了同一片街区但是场景最丰富的一组,输入的图片是更远处的2栋高楼,输出的结果非常正确。第一张图片是匹配到了咖色楼的部分较多,而第二张图片匹配到了较远处的那2栋高楼,第三张图片是匹配到了路对面的高楼。
  • 输入图片与数据集中图片两两进行特征匹配后的匹配数保存在数组中,要找到与输入图片匹配特征点最多的图,最后将矩阵中数值最大的三个位置输出。SIFT在大量数据库中速度也非常快。
  • 匹配的结果非常精确,可见SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。

9.5 局部描述子匹配&可视化连接的图片

  • 此部分实验从18张图片里选出了8张 2个场景进行可视化连接测试

  • 用局部描述子进行匹配与可视化连接的实验用了同一组筛选的测试数据,所以结论也放在这里一起分析。

  • 以下为实验数据的选择准备,123为一个场景,45678为一个场景

  • 图片3中的楼为图片1中最左边半部分楼的尺度放大图,位移也有较大偏差,图一仅露出一半楼的全貌。

  • 这里框出的2栋楼是同一建筑

    实验结果:


    小结:

  • 矩阵是将两两图片进行特征匹配后,先将匹配数保存在矩阵中,最后再将矩阵补0填充完整。0不是必须的。当矩阵中有非0数字时,可视化中将会有一条连线。因为数据集中的数字下标是我测试完后为了截图美观又重新标记的,所以可能跟测试时读入矩阵的数据顺序会有不相符。

  • 从矩阵和可视化对比来看,即使匹配结果非常的小,数据为1,可视化也会创建连线,所以可视化仅仅能体现是否有联系,但无法体现匹配关系的强弱,同时也无法验证匹配的是否正确。

10. RANSAC部分的实验及小结

10.1 使用RANSAC前后分析

1.删点效果较为明显

小结:

  • 这组图片都是景深比较丰富的
  • 删除点较为明显的原因是:景深丰富会让一开始的匹配点较少不会杂乱,另外这组图片会有一些看起来较为相似,但实则不是统一建筑的远景,匹配的标记一删除则看得非常明显。
  • 如第一组图片的高楼顶点和中间一条粉色的匹配点,第二组中的方法的红色线条
  • 这组中也有删除错误的部分,即删除了原本匹配正确的地方,如第二组图片中最下方的粉色连线
  • 可以看出删除后的匹配点都比较整齐

2.删点效果不为明显

小结:

  • 这组图片因为匹配点非常多,所以删除前后肉眼观看不明显
  • 几乎无法判断ransac的作用和好坏,但从整体感觉上匹配线条稀疏了一些

3.错误匹配

小结:

  • 这组图片是测试了很多组后,发现了一组完全不是同一场景,但是有错误匹配的情况。将窗户匹配在一起,汽车与窗户也有匹配
  • 可以看出即使是使用了RANSAC后,仍然保留了一些错误的匹配情况,且匹配的线条十分杂乱。这里体现了RANSAC的缺点之一:只能从数据集中得到一个模型,如有多个模型该算法不能实现
  • RANSAC的缺点之一是它计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比

10.2 场景分析

1.景深单一


小结:

  • 景深单一时,一开始即RANSAC前的匹配点方向很多,匹配的情况较为杂乱。在进行了RANSAC之后,仍然会保留几个方向但是整体线条更为整齐。
  • 景深单一时,会删除更多的匹配点,但删除的准确率非常高,在人眼看起来基本上删除的点都是匹配错误的,没有删除匹配正确的点(肉眼判读)

2.景深丰富



小结:

  • 景深丰富的点,在一开始匹配点就比较整齐。且使用RANSAC时,删除的点没有景深单一的点多。
  • 这一组图片中更容易删除一些原本匹配正确的点,比如第一组图片中,最上方第一条黑色的匹配线,本是匹配正确的,但使用RANSAC后删除了。
  • 景深丰富组因为远近对比更多,但程序运行的依然很快,可见RANSAC是一个速度非常快的算法。

3.景深单一匹配景深丰富

小结:

  • 这组的匹配效果非常好,同一栋楼的细节全部都有匹配到,楼房下面的白色汽车也有精准的匹配到,图一中的黄色错误匹配色被正确删除。可见RANSAC有较强的鲁棒性,它能从包含大量局外点的数据集中估计出高精度
  • 最左边的紫色连线是匹配错误的连线,但RANSAC没有删除这一条,反而上方有一条蓝色的连线是正确的但被删除了。这是2条很清楚的错误情况
  • 但整体来说这组景深近匹配景深远的图片效果还不错

4.同组图片/仅不同大小的匹配情况


小结:

  • 这组是我偶然在改动图片大小的时候发现的,图像像素的大小改变带来的匹配情况不同。第一组比第二组的像素更大
  • 因为像素大,图片细节更多,第一组的匹配点比第二组更加丰富
    但是从删除点后的匹配情况来看,第二组匹配的正确率更高。第一组虽然保留了更多的匹配点,但是包含了很多错误的信息,如门和窗户的错误匹配依旧保留了下来。

11. 遇到的问题及总结

11.1 遇到的问题

1.运行可视化时,出现

在vscode终端的powershell中输入pip install pydot
接着在python的文件夹中搜索pydot.py文件,将其中的代码换成Graphviz中bin的路径复制到上去,例如:D:\pypackage\Graphviz-2.38\bin\dot.exe

2.RANSAC时出现

解决办法:
1.先卸载

2.再安装opencv

pip install --user opencv-python==3.4.2.16

重新运行即可

11.2 总结

  • DoG尺度空间的极值检测: 首先是构造DoG尺度空间,在SIFT中使用不同参数的高斯模糊来表示不同的尺度空间。而构造尺度空间是为了检测在不同尺度下都存在的特征点,特征点的检测比较常用的方法是Δ2G(高斯拉普拉斯LoG),但是LoG的运算量是比较大的,Marr和Hidreth曾指出,可以使用DoG(差分高斯)来近似计算LoG,所以在DoG的尺度空间下检测极值点。
  • 删除不稳定的极值点:主要删除两类:低对比度的极值点以及不稳定的边缘响应点。
  • 确定特征点的主方向:以特征点的为中心、以3×1.5σ为半径的领域内计算各个像素点的梯度的幅角和幅值,然后使用直方图对梯度的幅角进行统计。直方图的横轴是梯度的方向,纵轴为梯度方向对应梯度幅值的累加值,直方图中最高峰所对应的方向即为特征点的方向。
  • 生成特征点的描述子: 首先将坐标轴旋转为特征点的方向,以特征点为中心的16×16的窗口的像素的梯度幅值和方向,将窗口内的像素分成16块,每块是其像素内8个方向的直方图统计,共可形成128维的特征向量。

计算机视觉——SIFT图像匹配算法相关推荐

  1. 计算机视觉——SIFT特征提取与检索+匹配地理标记图像+RANSAC算法

    SIFT特征提取与检索 1. SIFT算法 1.1 基本概念 1.2 SIFT算法基本原理 1.2.1 特征点 1.2.2 尺度空间 1.2.3 高斯函数 1.2.4 高斯模糊 1.2.5 高斯金字塔 ...

  2. Python计算机视觉——SIFT特征

    Python计算机视觉--SIFT特征 文章目录 Python计算机视觉--SIFT特征 写在前面 1 SIFT特征算法步骤 1.1 尺度空间的极值检测 1.2 特征点定位 1.3 特征方向赋值 1. ...

  3. HOG和SIFT图像特征提取简述

    前言 随着深度学习方法的流行,很多人对传统方法一无所知.然而传统方法仍然非常重要,这里介绍两个提取特征的传统方法--HOG和SIFT方法. 本文转载自咪付,仅用于学术分享(编辑:CV 技术指南) 如今 ...

  4. 计算机视觉:图像映射与全景拼接

    目录 1.图像拼接的原理 1.1 基本流程 1.2 图像拼接的几何原理 1.3 2D图像变换原理 1.3.1 2D 图像变换类型 1.3.2 变换参数求解 1.3.3 2D 图像变换 1.4 直线拟合 ...

  5. 深度学习在计算机视觉领域图像应用总结

    简单的回顾的话,2006年Geoffrey Hinton的论文点燃了"这把火",现在已经有不少人开始泼"冷水"了,主要是AI泡沫太大,而且深度学习不是包治百病的 ...

  6. OpenCV入门学习笔记之Harris角点检测与SIFT特征匹配算法

    1. 写在前面 这篇文章整理两个图像处理中非常重要的算法,一个是Harris角点检测算法,另一个是SIFT特征匹配算法,这两个算法本质上还是去找图像里面的关键特征点,帮助我们后续更好的理解图像以及做各 ...

  7. 图像匹配算法 MAD、SAD、SSD、MSD、NCC、SSDA、SATD,LBD算法

    图像匹配算法分为3类:基于灰度的匹配算法.基于特征的匹配算法.基于关系的匹配算法 (1)基于灰度的模板匹配算法:模板匹配(Blocking Matching)是根据已知模板图像到另一幅图像中寻找与模板 ...

  8. CV之ICG:计算机视觉之图像标题生成(Image Caption Generator)算法的简介、使用方法、案例应用之详细攻略

    CV之ICG:计算机视觉之图像标题生成(Image Caption Generator)算法的简介.使用方法.案例应用之详细攻略 目录 图像标题生成ICG算法的简介 图像标题生成ICG算法的使用方法 ...

  9. 用pythonnet为计算机视觉做图像整理

      中国的.NETer是国内技术的另类,当他们强调.NET也可以做啥啥时都会给别的技术藐视,毕竟主流都不用.NET.本人这几年其实花在.NET时间也少,都投入在Python/Go社区.可我还是有点工作 ...

  10. c# 计算空格宽度像素_用pythonnet为计算机视觉做图像整理

      中国的.NETer是国内技术的另类,当他们强调.NET也可以做啥啥时都会给别的技术藐视,毕竟主流都不用.NET.本人这几年其实花在.NET时间也少,都投入在Python/Go社区.可我还是有点工作 ...

最新文章

  1. Android 懒加载
  2. php u6536编码转,详谈PHP编码转换问题
  3. 多目标跟踪(MOT)论文随笔-SIMPLE ONLINE AND REALTIME TRACKING (SORT)
  4. vue防抖和节流是什么_JavaScript防抖与节流,你知道多少?
  5. 应用架构设计“着火”“防火”经验之谈
  6. 国家市场监管总局:低价倾销、大数据杀熟等价格违法行为将被罚
  7. 蓝桥杯 ADV-11 算法提高 Torry的困惑(提高型)
  8. 飞思卡尔单片机高效c语言编程,飞思卡尔单片机高效C语言编程(中文)
  9. 《那些年啊,那些事——一个程序员的奋斗史》——18
  10. labview软件工程师必备模块,做项目时遇到无赖客户可以在规定天数到达锁死
  11. php是世界上最好的语言吗
  12. CTF线下攻防赛总结
  13. ic 卡获取帐号apdu指令_发送获取银行卡卡号的APDU命令
  14. 查收你的2022书单,阅读这54本书就够了
  15. centos6.8服务器中了挖矿程序病毒的解决方法
  16. CodeForces入门
  17. 3. node.js 异步式I/O或非阻塞式I/O
  18. 【转】区块链公链的 3 大性能难点、5 大体验障碍
  19. 完整的连接器设计手册_CPCI高速背板设计与仿真
  20. 京东吞下一号店之后,网易成中国电商最大变量?

热门文章

  1. 【推理加速】博客翻译:利用融合conv和bn的方法加速模型
  2. 时空序列预测之Convolutional LSTM Network
  3. 注塑缺陷浮纤的原因及解决对策
  4. 【转】写给支持和反对《完全用Linux工作》的人们
  5. Numpy 中某个矩阵的平方距离计算方法
  6. EMC VMAX存储的内存布局
  7. Win10电脑怎么用命令修复系统文件
  8. R数据分析:论文中的轨迹的做法,潜增长模型和增长混合模型
  9. 邮件服务器软件选择,3款windows下的免费邮件服务器软件
  10. MATLAB高维矩阵的求和、索引