基于乘积量化的快速特征匹配

基于乘积量化的快速特征匹配

1、算法实现

不使用乘积量化的特征匹配方法

假设有两张图片p1、p2,分别有k1、k2个128维的sift描述子特征向量,该方法算出p1中每一个特征向量与p2中的每一个特征向量的欧式距离,距离最短的那一对特征向量构成一组匹配。该方法的计算复杂度:k1*k2*128。存储空间为:k1*128+k2*128。

基于乘积量化的快速特征匹配法

1、训练码本。将待训练的图片p1、p2、p3……的每个sift描述子特征向量分为m段,将属于同一段的所有128/m维特征向量用k-means方法聚类成n个聚类中心,得到m段包含n个聚类中心的码本。对每段的聚类结果,计算任意两个聚类中心之间距离,生成一个大小为n*n的距离矩阵,共有m个这样的距离矩阵。代码如下:

% 将用于训练的sift描述子向量均分为16段,每段8维
sub_vector = cell(16,1);
for i = 1 : 16
    sub_vector{i} = siftDescriptorTrain((i-1)*8+1:8*i,:);
end

C = cell(16,1);
Idx = cell(16,1);
opts = statset('MaxIter',300);
% 对每一段进行k-means聚类,k=64
for i = 1 : 16
    [Idx{i} , C{i}] = kmeans(sub_vector{i}',64,'Options',opts);
end

dist = cell(16,1);
for i = 1 : 16
    dist{i} = zeros(64,64);
end

% 生成16个distance matrix
for i = 1 : 16
    for j = 1 : 64
        tmpFeat = repmat(C{i}(j,:), 64, 1);
        dist{i}(j,:) = (sum((tmpFeat - C{i}).^2,2))';
    end
end

2、将待匹配图像p1、p2的k1、k2个特征向量进行乘积量化。将每个特征向量分为m段,每段基于已经训练好的码本进行量化。量化的方法:计算该段与码本中对应段中每个聚类中心的距离,用距离最短的那个聚类中心的索引代替该段向量。对待匹配图像进行乘积量化的计算复杂度:(k1*m*n*128/m + k2*m*n*128/m) = k1*n*128 + k2*n*128。代码如下:

%% 将第一张待匹配图像的sift特征向量分为16段
feat1_vector = cell(16,1);
for i = 1 : 16
    feat1_vector{i} = SiftFeat_1((i-1)*8+1:8*i,:);
end

%% 判断待匹配图像的每个特征向量的每一段各属于哪一类
minposition = zeros(16, featNum_1); 
for i = 1 : 16
    for j =1 : featNum_1
        tmpFeat = repmat(feat1_vector{i}(:,j),1,64);
        d1 = sum((tmpFeat - C{i}').^2); % distance
        minposition(i,j) = find(d1==min(d1));
    end
end

3、计算p1的每个特征向量的每一段与p2的每个特征向量的对应段的距离,计算方法:根据第2步中每段的索引,在距离矩阵中找对应的两个聚类中心的距离。然后将每段距离加起来,即为特征向量间的距离。算出p1中每一个特征向量与p2中的每一个特征向量的距离,距离最短的那一对特征向量构成一组匹配。计算复杂度:k1*k2*m。代码如下:

%% 在feat2中找离feat1的距离满足一定条件的特征,构成匹配
matchInd = zeros(featNum_1, 1);
matchDis = zeros(featNum_1, 1);
for i = 1 : featNum_1
    d = zeros(1,featNum_2);
    for k = 1 : 16
        d(1 : featNum_2) = d(1 : featNum_2) +dist{k}( minposition(k,i) , minposition2(k,1 : featNum_2) );
    end
    matchDis(i) = min(d);
    [v, ind] = sort(d);
    if v(1) / v(2) <= 0.64
        matchInd(i) = ind(1);
    end
end

综上,总的计算复杂度为:(k1+k2)*n*128 + k1*k2*m,当k1、k2足够大时,第一项忽略不计,则计算复杂度近似为:k1*k2*m,为不使用乘积量化的特征匹配方法的m/128。存储空间为:k1*m+k2*m。

2、实验结果

基于乘积量化的快速特征匹配_第1张图片

源代码

http://download.csdn.net/download/jianwen_jiang/10211051

你可能感兴趣的:(图像分析,matlab,特征匹配)