SIFT特征提取算法小结
SIFT(Scale Invariant Feature Transformation)特征提取算法是用于提取对尺度、旋转以及光照等鲁棒的图像局部特征并进行描述的经典算法,广泛应用于图像匹配等领域中,其主要步骤有以下几点:
1. 高斯差分尺度空间生成
注:不同的尺度就是指不同的
σ
σ
,即不同的模糊(平滑)程度。
2. 检测尺度空间极值点
注:检测DOG的本层8个邻域及上下相邻两层18个像素点共26个点区域。
3. 精确定位特征点(除去不好的特征点:低对比度点、边缘响应点等)
4. 为每个特征点指定方向参数
注:利用特征点邻域像素的梯度方向分布特性(统计方向直方图,按距特征点的距离加权)为每个特征点指定方向参数,使算子具备旋转不变性。直方图中的峰值就是主方向,其他的达到最大值80%的方向可作为辅助方向。
5. 特征点描述子(4*4*8=128维向量)的生成
生成步骤:
生成SIFT描述子的示意图如下
注:每个方向直方图是依据采样矩形框中采样点与特征点的相对方向并按距离加权统计得到的
SIFT特征提取OpenCV2实现
1.代码
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/nonfree/features2d.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img_1 = imread("lena.jpg", 0);//load gray image
Mat img_2 = imread("lena.jpg", 0);
if (!img_1.data || !img_2.data)
{
return -1;
}
//-- Step 1: Detect the keypoints using SIFT Detector
SiftFeatureDetector detector;
std::vector<KeyPoint> keypoints_1, keypoints_2;
detector.detect(img_1, keypoints_1);
detector.detect(img_2, keypoints_2);
//-- Step 2: Calculate descriptors (feature vectors)
SiftDescriptorExtractor extractor;
Mat descriptors_1, descriptors_2;
extractor.compute(img_1, keypoints_1, descriptors_1);
extractor.compute(img_2, keypoints_2, descriptors_2);
//-- Step 3: Matching descriptor vectors with a brute force matcher
BFMatcher matcher(NORM_L2);
std::vector< DMatch > matches;
matcher.match(descriptors_1, descriptors_2, matches);
//-- Draw matches
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
//-- Show detected matches
imshow("Matches", img_matches);
waitKey(0);
return 0;
}