Matlab实现SIFT+RANSAC特征检测与图像融合

一、SIFT特征检测

尺度不变特征转换(Scale-invariant Feature Transform or SIFT)是一种计算机视觉的算法,用来侦测与描述影像中的局部性特征。该算法在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由David Lowe在1999年所发表,2004年完善总结。SIFT算法具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。
SIFT算法的大致步骤如下:

  • 建立尺度空间,即建立高斯差分(DoG)金字塔
  • 在尺度空间中检测极值点,并进行精确定位
  • 关键点主方向赋值
  • 计算关键点描述子

1.利用SIFT算法对两幅原始图像进行检测,得到的结果如下(原始图像1有736个特征点,原始图像2有607个特征点)Matlab实现SIFT+RANSAC特征检测与图像融合_第1张图片
2.得到两幅图像的特征点后,需要对两幅图像进行初步的特征点匹配。
本次实验采用的初步匹配方法为“1NN/2NN<0.8”,即对于图像img1中的每个特征点描述子(设当前特征点描述子为des1_i),在img2图像中搜索与该128维向量之间的角度最小及次小的特征点描述子(分别记为des2_1,des2_2),记最小角度为deg1,次小角度为deg2,若deg1<0.8*deg2,则我们将(des1_i,des2_1)视为符合条件的匹配点对,否则将其视为错配点对并剔除。这种寻找匹配的方法,Lowe在“Distinctive Image Features from Scale-Invariant Keypoints”中有详细说明。
特征点初步匹配结果如下(共66对粗匹配点):
Matlab实现SIFT+RANSAC特征检测与图像融合_第2张图片
观察图2可以发现,两幅图像的两侧均存在一些误匹配的特征点,而我们真正需要的特征匹配点对大概应该集中于图像中央附近。因此,下面需要利用RANSAC算法剔除一些误匹配的特征点对,以实现特征点之间的精细匹配。

二、RANSAC特征点精匹配

随机抽样一致算法(Random Sample Consensus or RANSAC)可以从一组包含“局外点(Outliers)”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果,因此为了提高得到正确模型的概率,有时候必须增加迭代次数。
滤除误匹配对采用的RANSAC算法从匹配数据集中随机抽出4对样本(不共线)并计算出单应矩阵,然后利用这个模型测试所有数据,计算满足这个模型数据点的个数与投影误差(即代价函数),若此模型为最优模型,则对应的代价函数最小。
RANSAC算法的具体步骤如下:

  • 随机从数据集中随机抽出4个样本数据 (不能共线),计算出单应矩阵H,记为模型M;
  • 计算数据集中所有数据与模型M的投影误差,若误差小于阈值,则加入内点集I;
  • 如果当前内点集I元素个数大于最优内点集I_best , 则更新I_best = I,同时更新迭代次数k;
  • 如果迭代次数大于k则退出,否则迭代次数加1,重复上述步骤。

使用RANSAC得到的特征点精匹配结果如下(共34对精匹配点):
Matlab实现SIFT+RANSAC特征检测与图像融合_第3张图片
Matlab运行结果的部分截图(单应矩阵和精匹配点对的下标):
Matlab实现SIFT+RANSAC特征检测与图像融合_第4张图片
观察图3我们可以发现,两幅图像两侧的一些杂乱无章的错误匹配点对均已被消除,在匹配结果中只保留了两幅图中央的一些精匹配点对,从而实现了特征点的精匹配。下面将进行最后的两幅图的拼接与融合。

三、图像的拼接与融合

在进行最终的拼接与融合之前,我们首先需要使用单应矩阵H对img2进行一个H变换,使得img2的视角大致与img1一致(让img1与img2位于同一坐标系下),以便于后续进行几何变换实现图像拼接。
在调整完毕img2的视角后,我们可以利用几何变换实现最终的两幅图像的拼接。在拼接完毕后,对两幅图像的重叠区域进行了优化处理,主要是调整了交界处img2的长度,使得img2能和img1在竖直方向对齐。
Matlab实现SIFT+RANSAC特征检测与图像融合_第5张图片

四、Matlab部分源码示例

main主程序:

clear;
clc;
close all;
img1 = imread('test1.png');
img2 = imread('test2.png');
% 调用函数进行SIFT特征检测、RANSAC精细匹配和图像融合、拼接

% 利用SIFT算法找到匹配的特征点对并可视化
[des1, loc1, des2, loc2] = drawKeypoints(img1, img2);

% 计算符合粗筛选条件的特征匹配点对并可视化
[matchLoc1, matchLoc2] = siftMatch(des1, loc1, des2, loc2);
% 输出所有的特征点对
disp([matchLoc1, matchLoc2]);

% 绘制由SIFT初步得到的粗特征匹配点连线
drawLine1(img1, img2, matchLoc1, matchLoc2);

% 利用RANSAC算法计算出单应矩阵H以及最终的特征点下标corrPtIdx
[H, corrPtIdx] = CalcH(matchLoc2' ,matchLoc1');
% 显示单应矩阵
fprintf('单应矩阵H如下:\n');
disp(H);

% 显示由RANSAC找到的特征匹配点对在matchLoc矩阵的下标
fprintf('由RANSAC找到的特征匹配点对在matchLoc矩阵的下标如下:\n');
disp(corrPtIdx);
% 绘制由RANSAC最终得到的精特征匹配点连线
drawLine2(img1, img2, matchLoc1, matchLoc2, corrPtIdx)

% 利用单应矩阵将img2投影,使img2和img1在同一坐标系下,方便后续的拼接
tform = projective2d(H');
img2_adjusted = imwarp(img2, tform); 
% 显示一下两幅原始图像
figure;
imshow(img1);
figure;
imshow(img2_adjusted);

% 进行图像的最终拼接与融合
final_img = mosaicFusion(img1, img2, img2_adjusted, H);

% 显示最终得到的图像
figure;
imshow(final_img);

全部源码及原始图像见资源:Matlab实现SIFT+RANSAC特征检测与图像融合

你可能感兴趣的:(计算机视觉,sift算法,ransac,图像拼接,计算机视觉,特征检测)