匹配几何校验
一、 任务描述
- 给定一对图像,利用提取好的SIFT特征文件,根据距离阈值准则(跨图像的局部SIFT特征距离小于0.4),得到图像间的初始局部特征匹配关系;
- 基于上述初步匹配结果,实现spatial coding方法,进行匹配校验,确定几何不一致的匹配;
- 将几何一致的匹配和不一致的匹配在图像上画出来,分别用蓝色和红色进行区分。
二、 实验步骤
- 寻找匹配对:寻找并提取第1张图与第2张图的SIFT描述子匹配对的(x,y)坐标点集,分别放进维数为(2*对应点数)的矩阵Map1,Map2中。
- 生成空间映射:根据Map1,Map2每个点相对其他点坐标的左右上下位置关系,以及k种(本实验中取k=4)旋转角度,生成由0、1构成的维数为(对应点数对应点数k)的空间编码矩阵GX1,GY1,GX2,GY2中。
- 计算不一致性矩阵:将空间编码矩阵GX1与GX2,GY1与GY2进行逻辑异或操作得到不一致性矩阵Vx,Vy。
- 计算不一致性总和Sx,Sy: 矩阵Vx,Vy各行元素求和,再对k个方向各行元素和求总和,得到Sx,Sy,维数为(匹配点数*1)
- 检查Sx,Sy,识别错误匹配项:首先基于Vx,计算Sx,找到对应的i*, 然后从Vx和Vy中把对应的第i行、第i列全部删掉(或者mask掉,本实验中以置零方式进行mask),随后立即更新红蓝连线;然后基于更新后的Vy,计算Sy,找到对应的j*, 然后从Vx和Vy中把对应的第j行、第j列全部删掉(或者mask掉,本实验中以置零方式进行mask),随后立即更新红蓝连线。 对更新后的Vx和Vy重复上面两步,直到收敛(本实验取不一致性总和的阈值为(0.8*匹配对数)取整)。
三、 实验效果
四、 实验代码
其中本实验对图像特征描述子的读取通过已准备好的“.sift”文件直接读进matlab中,也可以自己在matlab中读取“.jpg”图片后转为SIFT格式的描述子数据,matlab代码如下:
%% Set path and parameters
clear;
close all;
clc;
src_1 = './test images/37967br1.jpg';
src_2 = './test images/791.jpg';
% src_1 = './test images/4.jpg';
% src_2 = './test images/Apollo-266.jpg';
% src_1 = './test images/771.jpg';
% src_2 = './test images/305.jpg';
% src_1 = './test images/Apollo-49.jpg';
% src_2 = './test images/Apollo-266.jpg';
ext = '.sift'; % extension name of SIFT file
siftDim = 128;
maxAxis = 400;
%% Load image
im_1 = imread(src_1);
if max(size(im_1)) > maxAxis
im_1 = imresize(im_1, maxAxis / max(size(im_1)));
end
im_2 = imread(src_2);
if max(size(im_2)) > maxAxis
im_2 = imresize(im_2, maxAxis / max(size(im_2)));
end
%% Load SIFT feature from file
featPath_1 = [src_1, ext];
featPath_2 = [src_2, ext];
fid_1 = fopen(featPath_1, 'rb');
featNum_1 = fread(fid_1, 1, 'int32');
SiftFeat_1 = zeros(siftDim, featNum_1);
paraFeat_1 = zeros(4, featNum_1);
for i = 1 : featNum_1
SiftFeat_1(:, i) = fread(fid_1, siftDim, 'uchar');
paraFeat_1(:, i) = fread(fid_1, 4, 'float32');
end
fclose(fid_1);
fid_2 = fopen(featPath_2, 'rb');
featNum_2 = fread(fid_2, 1, 'int32');
SiftFeat_2 = zeros(siftDim, featNum_2);
paraFeat_2 = zeros(4, featNum_2);
for i = 1 : featNum_2
SiftFeat_2(:, i) = fread(fid_2, siftDim, 'uchar');
paraFeat_2(:, i) =