1.提取+/- sample的feature,每幅图提取出的sift特征个数不定(假设每个feature有128维)
2.利用聚类方法(e.g K-means)将不定数量的feature聚类为固定数量的(比如10个)words即BOW(bag of word)
3.normalize,并作这10个类的直方图e.g [0.1,0.2,0.7,0...0];
4.将each image的这10个word作为feature_instance 和 (手工标记的) label(+/-)进入SVM训练
1. 提取test_img的feature(如137个)
2. 分别求each feature与10个类的距离(e.g. 128维欧氏距离),确定该feature属于哪个类
3. normalize,并作这10个类的直方图e.g [0,0.2,0.2,0.6,0...0];4. 应用SVM_predict进行结果预测
另外,讲一下有关两个img的sift特征match:
des2t = des2'; % Precompute matrix transpose转置 for i = 1 : size(des1,1) dotprods = des1(i,:) * des2t; % Computes vector of dot products两幅图像的keypoints的128个维度做点积 [vals,indx] = sort(acos(dotprods)); % Take inverse cosine and sort results,将点积的逆余弦排序 % Check if nearest neighbor has angle less than distRatio times 2nd. if (vals(1) < distRatio * vals(2)) match(i) = indx(1);%match(i)表示图1中i-th keypoint的匹配点是图2中的第几个keypoint else match(i) = 0; end end
这样做的目的:因为for向量a,b,
a·b=|a|*|b|*cos<a,b>
那么arccos(dotprods)就是夹角。对夹角排序,vals(1),vals(2)分别是所夹最小角和次小角
vals(1) < distRatio * vals(2)
满足该条件即可将图1中的第i个feature和图2中的第indx(1)个feature进行匹配。
关于sift的其他讲解:
http://blog.csdn.net/abcjennifer/article/details/7639681
http://blog.csdn.net/abcjennifer/article/details/7372880
http://blog.csdn.net/abcjennifer/article/details/7365882
关于computer vision的更多讨论与交流,敬请关注本博客和新浪微博Sophia_qing。