Computer Vision local feature matching 局部特征匹配

发布于:2021-10-23 09:24:06

这学期选修了学校的computer vision,把做的作业分享给大家,希望对大家有所帮助。


我们希望实现一个局部特征匹配的算法(local feature matching),所谓局部特征,是指提取图片中某一个小的范围,描述为特征,通过匹配两幅图的局部特征进行图片的匹配,如下图所示。





在这里我们实现的是简化版的SIFT算子,实现的目标是相同物理情境多角度图片的匹配,如下图所示就为最终完成的匹配效果。可以看到两幅图中的大部分特征点都可以较好的匹配。





实现的整体流程为:Harris角点检测得到interest points -> 描述interest points,得到其local feature -> 对两幅图的local feature进行匹配从而匹配两幅图片。下面分别对这三个部分算法进行介绍。






1. 角点检测get_interest_points()



在这里我们使用的是Harris角点检测,SIFT算法中角点检测使用的是DoG(Difference of Gaussian)算子来*似LoG(Laplace of Gaussian)。Harris corner detection被用来检测图像中的角点,是Harris等人于1988年提出的[1]。算法想法很简单,定义一个小的窗口window,当窗口位置*移很小距离时窗口内像素之和改变非常大,那么我们就定义此处为角点。当窗口*移[u,v]时窗口内的像素强度总和改变量为:





其中窗口函数如下





如果u,v特别小时,可以使用泰勒展式保留一阶部分如下:





则此时的窗口内改变量为:





此时定义2x2矩阵M





此时E(u,v)随(u,v)改变量与矩阵M的特征值有关,实际上E(u,v)是一个椭圆,椭圆轴长与M特征值的倒数相关。我们的目标是找到沿着各个方向移动很小距离造成很大改变的位置,即椭圆轴比较短,即M的两个特征值都比较大的位置,设置判决阈值,当且仅当M的两个特征值大于判决阈值时把该点判定为角点。


此时得到的角点常出现聚集在一起的情况,需要进行一步非最大值抑制,即拿一个滑动窗口,只取窗口内特征值最大的特征点,从而达到稀释特征点的目的。


经过角点提取后得到的图像如下所示:








2. 描述interest points,得到其局部特征get_features()



在上一步得到的特征点,我们需要对这些特征点进行描述(describe),否则无法匹配两幅不同角度的图里面的特征点。此时我们使用局部特征点来对该点进行描述。局部特征是从特征点周围nxn的一个窗口中计算出来的,通常n应该是4的倍数。通常我们n=16. 简化版本包含以下几步:

    使用高斯kernel对整幅图像smooth处理,高斯kernel的尺寸这里7x7.分别求每一个像素的magnitude和orientation,根据像素的梯度将nxn窗口分成4x4的cell,每一个cell的size是n/4 x n/4. 此时再用半径为n的高斯kernel处理window的magnitude。将cell中每个像素的orientation归类wei16类,分别为[0,45), [45,90)...[315,360). 对于每个类,累计其对应的高斯处理过的magnitude,此时对于一个cell我们有16个值,我们有4x4=16个cell,所以一共是16x8=128个值,这128个值用来描述一个interest point, 对每个interest point, 我们都有这样的128个值。



3. 局部特征匹配match_features()



?有了local feature,下面需要对两幅图中local feature进行匹配从而对特征点进行匹配。输入两幅图的所有特征点的local features,执行以下步骤:

    计算feature distance,比如欧氏距离。假如图像A有m个特征点,图像B有n个特征点,那么一共计算得到mxn个特征点计算每种搭配的可信程度:对于图像A中的每个点,我们计算 ratio = (score of the best feature match) / (score of the second best feature match), 则可信程度是这个ratio的倒数 conf = 1/ratio根据可信程度来进行配对。



最终的实验结果如下所示,其中后面几幅是从我们实验室拍的,看得出来匹配效果还不错。







相关推荐

最新更新

猜你喜欢