计算机视觉作业(二)Local Feature Matching

一、实验原理

特征匹配是图像处理和计算机视觉的核心组成部分。在本次实验中,我们将创建一个局部特征匹配算法,并尝试匹配真实场景的多个视图。将实现一个简化版本的sift,用于解决局部特征匹配问题,使检测到的特征对遮挡和杂波具有鲁棒性。由于特性是本地的,可以在一张图像中生成数百或数千个特性,同时能够实现实时性能。我们使用Harris角点检测器和sift特征描述符来生成关键点,同时也使用了自适应非最大抑制来获得图像上的均匀分布的角。

二、实验目的

本实验要求实现图像的特征匹配,对于给定的两幅图像,均使用Harris角点检测器在图像中寻找角点;利用自适应非最大压缩得到角的均匀分布;为每个关键点生成128维sift描述符。然后,以欧氏距离为参数,求出两幅图像特征之间的最佳匹配。最后,对具有地面真实性的图像进行评价。

三、实验内容

这次实验内容调用四个.py文件完成,依次为utils.py文件、student_harris.py文件、student_sift.py文件以及student_feature_matching.py文件。下面将进行详细的描述。

1、utils.py文件

文件中包含十三个函数,功能都是对图像进行一系列处理。这部分的主要内容有:

(1)定义im2single()函数将图片转换成单精度,定义single2im()函数将把任何数据类型转成单精度数。

计算机视觉作业(二)Local Feature Matching

(2)定义rgb2gray()函数将形状为(m、n、c)的彩色图像转换成形状为(m、n)的灰度图像。

计算机视觉作业(二)Local Feature Matching

(3)定义load_image()函数和save_image()函数用来加载并保存图像。

计算机视觉作业(二)Local Feature Matching

(4)定义cheat_interest_points()函数处理具有地面真实性对应关系的3对图像。

计算机视觉作业(二)Local Feature Matching

(5)定义hstack_images()函数,将一个形状为(m、n、3)的彩色图像和另一个形状为(d、e、3)的彩色图像进行并排堆叠,形成了一个新的形状为(max(m,d)、n+e、3)的彩色图像。

计算机视觉作业(二)Local Feature Matching

(6)定义show_interest_points()函数显示图像,该图像是用随机彩色的圆圈显示兴趣点。

计算机视觉作业(二)Local Feature Matching

(7)定义show_correspondence_circles()函数,通过在两个图像上绘制圆来可视化两个图像之间的对应点。在每个对应的位置,对应的点会有相同的随机颜色。

计算机视觉作业(二)Local Feature Matching

(8)定义show_correspondence_lines()函数,通过在两个图像上绘制线来可视化两个图像之间的对应点。在每个对应的位置,对应的点会有相同的随机颜色。

计算机视觉作业(二)Local Feature Matching

(9)定义show_ground_truth_corr()函数,用于显示地面真实性对应关系。

计算机视觉作业(二)Local Feature Matching

(10)定义load_corr_pkl_file()函数,用来从pickle(.pkl)文件中加载对应关系。

计算机视觉作业(二)Local Feature Matching

(11)定义evaluate_correspondence()函数,用来评估估计与地面真实值得对应关系。

计算机视觉作业(二)Local Feature Matching

2、student_harris.py文件

文件中包含两个函数,get_interest_points()函数用来对图像进行兴趣点检测,使用Harris Corner Detector来检查图像中的角点,通过用矩阵的行列式减去矩阵的平方来确定特定像素得分,得分越高的像素越具有角的特征,具体评判标准由阈值人为设定。如果像素的角点得分高于阈值,便认为它是一个角点,否则就忽略它。这样处理会带来一个问题就是角点在图像上分布不均匀。故采用ANMS()函数来抑制多余的角点,保证了图像上角点分布的均匀性。

(1)定义get_interest_points()函数,该函数主要实现了三个功能:

首先定义图像的尺寸(包括长和宽)。

计算机视觉作业(二)Local Feature Matching

其次利用浮点数Sobel算子进行边缘检测,第二个参数cv2.CV_64F表示64位即64float,第三和第四个参数分别是对X和Y方向的导数(即dx,dy),对于图像来说就是差分,这里1表示对X求偏导(差分),0表示不对Y求导(差分),第五个参数ksize是指核的大小。

计算机视觉作业(二)Local Feature Matching

最后计算Harris矩阵分量,包括矩阵特征值、迹以及角点相应函数R。

计算机视觉作业(二)Local Feature Matching

(2)定义ANMS()函数,该函数基本思想是仅保留r个像素附近最大的那些点。

计算机视觉作业(二)Local Feature Matching

(3)最后在get_interest_points()函数下调用ANMS()函数,使用非最大抑制算法(ANMS)进行角点过滤,返回满足条件的角点坐标和得分。

计算机视觉作业(二)Local Feature Matching

3、student_sift.py文件

文件中只包含一个get_features()函数,获得给定兴趣点集的一组特征描述符,用于将第一幅图像的关键点与第二幅图像的关键点进行匹配。为此,计算第一图像中每个关键点的每个特征向量到第二图像中每个特征向量的距离。然后对距离进行排序,并获取和比较两个最小距离。为了使关键点与第二个图像中的另一个关键点精确匹配,计算并检查两个最小距离的比率是否大于指定的阈值,之后将其视为关键点。

(1)初始化高斯滤波器,使用高斯模糊降低图像中的噪点,并获得图像的尺寸。

计算机视觉作业(二)Local Feature Matching

(2)遍历Harris算法得到的每一个角点坐标,提取以该角点坐标为中心的16x16像素的一个局部图像,对于每一个局部图像,拆分成16个4x4像素的窗口,计算窗口内每个像素的大小和方向。

计算机视觉作业(二)Local Feature Matching

(3)对于每一个窗口,以方向为横坐标建立直方图(共8个方向),窗口内所有像素在方向上的加权和为直方的幅度值,这样就得到了每一个角点的局部图像中每个窗口表示大小和方向的特征向量。

计算机视觉作业(二)Local Feature Matching

(4)正则化特征向量,并返回值。

计算机视觉作业(二)Local Feature Matching

4、student_feature_matching.py文件

文件中只包含一个match_features()函数,在得到两个图像的sift特征描述符和Harries算法得到的角点坐标后,即可通过计算特征向量之间的距离,进行图像的特征匹配。

(1)对于图像1的每一个sift特征描述符遍历图像2的每一个sift特征描述符,分别计算它们和图一特征向量之间的欧式距离。

计算机视觉作业(二)Local Feature Matching

(2)按照距离大小对图像2的特征向量进行升序排序,取与图一特征向量距离最小的两个,若两者的距离之比小于阈值,则说明最佳的匹配效果较好,记录下图一和图二两个特征向量的坐标。若大于阈值则不操作。在对图一所有特征向量遍历完后,返回每一对需匹配的特征向量的坐标,和两者之间的距离。

计算机视觉作业(二)Local Feature Matching

四、实验器材(设备、元器件)

硬件配置:Windows 10 64位操作系统。

软件配置:Jupyter Notebook 6.0.0版本。

五、实验步骤

这一部分的内容主要是在proj2.ipynb文件内执行的,具体步骤如下:

(1)读取图像,将图像的长和宽放缩为原来的1/2,再转化为灰度图,进行一系列预处理。

计算机视觉作业(二)Local Feature Matching

计算机视觉作业(二)Local Feature Matching

(2)在两幅图像中获得感兴趣的点并将其可视化。

计算机视觉作业(二)Local Feature Matching

(3)对每个兴趣点创建特征向量。

计算机视觉作业(二)Local Feature Matching

(4)查找匹配的特征,并打印出来。

计算机视觉作业(二)Local Feature Matching

(5)将匹配特征后的四对图像用两种方法进行可视化。

计算机视觉作业(二)Local Feature Matching

(6)对具有地面真实性的图像sydney_opera_house进行评价。

计算机视觉作业(二)Local Feature Matching

六、实验数据及结果分析

实验数据及结果主要是在proj2.ipynb文件内执行的,结果都保存在results文件夹下。

计算机视觉作业(二)Local Feature Matching

下面将进行具体的结果分析:

(1)在两幅图像中获得感兴趣的点并将其可视化,可视化之后的结果如下图所示(左上为Notre Dame,右上为Mount Rushmore,左下为Episcopal Gaudi,右下为sydney_opera_house)

计算机视觉作业(二)Local Feature Matching计算机视觉作业(二)Local Feature Matching

计算机视觉作业(二)Local Feature Matching 计算机视觉作业(二)Local Feature Matching

(2)对于四对图像,查找匹配的特征并打印出来,结果如下。(从上到下依次为Notre Dame,Mount Rushmore,Episcopal Gaudi和sydney_opera_house)。

计算机视觉作业(二)Local Feature Matching

计算机视觉作业(二)Local Feature Matching

计算机视觉作业(二)Local Feature Matching

计算机视觉作业(二)Local Feature Matching

(3)将匹配特征后的四对图像用两种方法进行可视化,结果如下。(从上到下依次为Notre Dame,Mount Rushmore,Episcopal Gaudi和sydney_opera_house)。

计算机视觉作业(二)Local Feature Matching计算机视觉作业(二)Local Feature Matching

计算机视觉作业(二)Local Feature Matching计算机视觉作业(二)Local Feature Matching

计算机视觉作业(二)Local Feature Matching 计算机视觉作业(二)Local Feature Matching

计算机视觉作业(二)Local Feature Matching计算机视觉作业(二)Local Feature Matching

(4)对具有地面真实性的图像sydney_opera_house进行评价。

计算机视觉作业(二)Local Feature Matching

(5)可视化之后的结果。

计算机视觉作业(二)Local Feature Matching

七、实验结论

计算机视觉作业(二)Local Feature Matching

以Notre Dame的这对图片为例,在使用Harris角点检测器在图像中寻找角点,得到的角点分布是不均匀的,故利用ANMS(自适应非最大压缩)得到角点的均匀分布;然后为每个关键点生成128维sift描述符。最后,以欧氏距离为参数,求出两幅图像特征之间的最佳匹配(见上图)。通过这种方法得到的准确率高了很多(相较没有采用ANMS)。其他三对图像也是类似的道理(对于sydney_opera_house,因为有annotate_correspondences,所以可以对具有地面真实性的图像进行评价)。

八、总结及心得体会

在本次实验中,基本上实现了局部特征的匹配,取得了较好的实验效果。对图像进行了读取和预处理,并且在进行Mount Rushmore图像对的特征匹配时,进行了ratio范围的修改。

通过实验发现,对于Notre Dame,Mount RushmoreEpiscopal Gaudi图像对,由于没有annotate_correspondences,所以不能进行评价。 sift描述符的使用通过考虑每个像素的大小和方向来唯一地描述每个关键点,该算法在没有旋转或缩放的图像上显示出良好的结果,可以用来匹配图像对。

九、对本实验过程及方法、手段的改进建议

本次实验没有考虑尺度和旋转不变性,在今后的工作中可以考虑进去,使图像对得到更好的结果。此外,Harris角点检测器可以替换为优越的斑点检测技术,如最大稳定外部区域(MSER)。通过这样做,可以大大提高匹配的准确性,同时,它将使我们能够处理更有挑战性的图像对。

在五对图像上实现局部特征匹配,一旦开始就会检测数百个兴趣点,需要将“num_pts_to_visualize”和“num_pts_to_evaluate”设置为某个常数(例如100),否则事情就会变得非常混乱。与此同时,也可以根据confidence来设置阈值。

在实验的过程中也出现了一些问题,比如对于前三个图像对(Notre Dame,Mount Rushmore和Episcopal Gaudi图像对),由于没有annotate_correspondences,所以不能进行评价。如果想要对它们进行评价,可以为其他图像对建立ground truth!

配套代码见相关博客。