SIFT特征匹配详细原理

1、SIFT概述

      SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,它对物体的尺度变化,刚体变换,光照强度和遮挡都具有较好的稳定性,可在图像中检测出关键点,是一种局部特征描述子。SIFT 算法被认为是图像匹配效果好的方法之 一算法实现特征匹配主要有三个流程:

      ①特征点提取;
      ②特征点主方向确定;
      ③特征点描述;
      ④特征点匹配;

      其中特征点提取主要包括生成高斯差分(DifferenceofGaussian,DOG)尺度空间、寻找局部极值点、特征点筛选、确定特征点方向;特征点匹配主要包括根据描述子相似性进行匹配、匹配对比值提纯、RANSAC方法剔除离群匹配对。

2、SIFT特征提取及匹配

2.1 特征点提取(关键点检测)

      两种图像在匹配的时候可能因为拍摄的距离、拍摄的角度问题,会导致在特征点提取的时候差异很大,所以我们希望SIFT的特征点可以具有尺度不变性和方向不变性。
      对于我们人类来说,在一定的范围内,无论物体远还是近,我们都可以一眼分辨出来,当一个人从远处走来的时候,我们可以从轮廓就判断出这是一个人,但是还看不清细节,当他走进的时候,我们才会去注意其他的细节特征。而计算机没有主观意识去识别哪里是特征点,它能做的,只是分辨出变化率最快的点。彩色图是三通道的,不好检测突变点。需要将RGB图转换为灰度图,此时灰度图为单通道,灰度值在0~255之间分布。而且当图像放大或者缩小时,它读取的特征点与原先可能差异很大,所以其中一个办法就是把物体的尺度空间图像集合提供给计算机,让它针对考虑不同尺度下都存在的特征点。

2.1.1 尺度空间

      尺度空间的基本思想为:高斯核是唯一可以产生多尺度空间的核,在输入的图像模型中,通过高斯模糊函数连续的对尺度进行参数变换,最终得到多尺度空间序列。图像中某一尺度的空间函数 L(x ,y, σ)由可变参数的高斯函数 G(x, y, σ)和原输入图像I(x ,y)卷积得出:
                        
在这里插入图片描述
      其中,σ 表示为尺度空间因子,σ 越小,反应的局部点越清晰。反之 σ 越大,图像越模糊,越不能反应出图像的细节。

2.1.2 多分辨率图像金字塔

      在早期图像的多尺度通常使用图像金字塔表述形式。图像金字塔是同一图象在不同的分辨率下得到的一组结果,其生成过程一半包含两个步骤:
(1)对图像做高斯平滑(高斯模糊)
(2)对图像做降采样,降维采样后得到一系列尺寸不断缩小的图像。
                    在这里插入图片描述

      传统的SIFT算法是通过建立高斯差分函数(DOG) 方法来提取特征点。首先,在不同尺度参数的组数中,高斯差分图像是由某一相同尺度层的相邻图像作差值 得出。然后,将得到的差分图像与原图像 I(x, y)做卷积得到公式(3)的 DOG 函数:
                              在这里插入图片描述
      从上式可以知道,将相邻的两个高斯空间的图像相减就得到了DOG的响应图像。为了得到DOG图像,先要构造高斯尺度空间,而高斯的尺度空间可以在图像金字塔降维采样的基础上加上高斯滤波得到,也就是对图像金字塔的每层图像使用不同的尺度参数σ进行高斯模糊,使每层金字塔有多张高斯模糊过的图像,然后我们把得到的同一尺寸大小的图像划分为一组。

2.1.3 DOG局部极值检测

      特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点, 每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。
                                                         在这里插入图片描述
      中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个 点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

      有些极值点的位置是在图像的边缘位置的,因为图像的边缘点很难定位,同时也容易受到噪声的干扰,我们把这些点看做是不稳定的极值点,需要进行去除。边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小。候选特征点的DoG函数D(x)的主曲率与2×2Hessian矩阵H的特征值成正比,Dxx表示DOG金字塔中某一尺度的图像x方向求导两次:
                                                                       在这里插入图片描述
      在在边缘梯度的方向上主曲率值比较大,而沿着边缘方向则主曲率值较小。设α=λmax=Dxx为H的最大特征值,β=λmin=Dyy为H的最小特征值,则有:
                                                 在这里插入图片描述
      Tr(H) 为矩阵H的迹,Det(H)为矩阵H的行列式.当两个特征值相等时其值最小,因此为了检测主曲率是否在某个阈值Tr下,只需检测该比值与阈值T的大小关系,过滤不稳定的边缘响应点。

      所以,特征点提取可以概括为以下几个步骤:

  • 构建高斯尺度空间,产生不同尺度的高斯模糊图像。
  • 进行降采用,得到一系列尺寸不断缩小的图像。
  • DOG空间极值检测,去除部分边缘响应点。

2.2 特征点主方向确定

      经过上面的步骤已经找到了在不同尺度下都存在的特征点,为了实现图像旋转不变性,需要给特征点的方向进行赋值。利用特征点邻域像素的梯度来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。

      对于已经检测到的特征点,我们可以得到该特征点的尺度值σ ,所以确定该参数可以得到该尺度下的高斯图像:
                                                                            在这里插入图片描述
      我们通过每个极值点的梯度来为极值点赋予方向,梯度幅值等于上下两点像素值差的平方加上左右两点像素值差的平方,梯度方向则为上下两点像素值差与左右两点像素值差的商。
在这里插入图片描述
      当然,我们的目标是用特征点邻域像素的梯度来确定其方向参数,确定关键点的方向采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点对关键点方向生成所作的贡献。

在这里插入图片描述
      通过以上的图可以看出,梯度方向角为横轴刻度,取45度为一个单位,那么横轴就有8个刻度;纵轴是对应梯度的幅值累加值。

      关键点主方向:极值点周围区域梯度直方图的主峰值也是特征点方向。

      关键点辅方向:在梯度方向直方图中,当存在另一个相当于主峰值 80%能量的峰值时,则将这个方向认为是该关键点的辅方向。

      图中所示的是180度方向为主方向,45度方向可以看做是辅方向。仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性 。

2.3 特征点描述

      通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向。接下来就是为每个关键点建立一个描述符,使其不随各种变化而改变,比如光照变化、视角变化等等。并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。

2.3.1 确定描述子计算区域和并校正主方向

      在计算描述子之前,我们需要先确定计算区域,Lowe实验结果表明:描述子采用4×4×8=128维向量表征,综合效果最优 (不变性与独特性)
                                                      在这里插入图片描述
      为了保证特征矢量具有旋转不变性,需要以特征点为中心,将特征点附近邻域内图像梯度的位置和方向旋转一个方向角θ,即将原图像x轴转到与主方向相同的方向。

2.3.2 生成描述子

      下图所示,左图的中央为当前关键点的位置,每个小格代表为关键点邻域所在尺度空间的一个像素,求取每个像素的梯度幅值与梯度方向,箭头方向代表该像素的梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算。最后在每个3σ×3σ的小块上(图像中每个正方形的区域的边长为4)绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,如右图所示。每个特征点由4个种子点组成,每个种子点有8个方向的向量信息。这种邻域方向性信息联合增强了算法的抗噪声能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。
                           在这里插入图片描述
      在实际的计算过程中,为了增强匹配的稳健性,Lowe建议对每个关键点使用4×4共16个种子点来描述,这样一个关键点就可以产生128维的SIFT特征向量。
                                      在这里插入图片描述

      这个128维的SIFT特征向量就像是我们每个人的身份证一样,拥有绝对标识,几乎不可能重复,在这里可以对128维向量进行归一化处理,可以去除光照变化的影响。我们对模板图和目标图分别建立描述子集合。特征点的匹配是通过两点集合内关键点描述子的比对来完成,描述子的相似度量采用欧氏距离。假设如下:

                                              在这里插入图片描述

      最终留下来的配对的关键点描述子,需要满足条件:

                                                在这里插入图片描述

其他参考:
SIFT特征提取分析:https://blog.csdn.net/abcjennifer/article/details/7639681

Sift算子特征点提取、描述及匹配全流程解析:https://blog.csdn.net/dcrmg/article/details/52577555

Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔:https://blog.csdn.net/dcrmg/article/details/52561656

  • 17
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SIFT(Scale Invariant Feature Transform)是一种用于图像处理和计算机视觉中的特征提取算法,可以用于图像的特征描述、匹配和识别。SIFT算法的主要用途是在不同尺度和旋转下,提取出图像中的关键点,对这些关键点进行描述,用于匹配和识别。 SIFT模板匹配的原理是将两张图片中的SIFT特征点进行匹配,最终得到两张图片中的相似部分。SIFT模板匹配的步骤如下: 1. 使用SIFT算法在两张图片中提取特征点和描述子。 2. 对第一张图片中的每个特征点,计算它与第二张图片中所有特征点的距离,找到距离最近的特征点。 3. 对于每个特征点,保留距离最近的两个特征点,并计算这两个特征点的距离比值R,若R小于一个阈值,说明这个匹配是可靠的。 4. 对于所有可靠的匹配,使用RANSAC算法去除误匹配。 5. 最终得到两张图片中的相似部分。 SIFT模板匹配的代码如下: ```python import cv2 import numpy as np # 读取两张图片 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 创建SIFT对象 sift = cv2.xfeatures2d.SIFT_create() # 提取特征点和描述子 kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # 创建FLANN匹配器 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) # 匹配特征点 matches = flann.knnMatch(des1, des2, k=2) # 保留可靠匹配 good = [] for m, n in matches: if m.distance < 0.7 * n.distance: good.append(m) # RANSAC去除误匹配 src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # 得到相似部分 h, w = img1.shape[:2] pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2) dst = cv2.perspectiveTransform(pts, M) img2 = cv2.polylines(img2, [np.int32(dst)], True, 255, 3, cv2.LINE_AA) # 显示结果 cv2.imshow('result', img2) cv2.waitKey() cv2.destroyAllWindows() ``` 代码中使用了cv2.xfeatures2d.SIFT_create()创建SIFT对象,使用sift.detectAndCompute()提取特征点和描述子,使用cv2.FlannBasedMatcher()创建FLANN匹配器,使用flann.knnMatch()匹配特征点,并使用RANSAC去除误匹配。最后得到相似部分并显示结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值