计算机视觉
图像处理

尺度不变特征变换匹配算法SIFT

IFT算法
SIFT算法即尺度不变特征转换(Scale-invariant feature transform),本文重点不阐述该算法的原理。
SIFT算法主要分为五个步骤:
(1)建立尺度空间,检测图像极值点:通过高斯微分函数建立尺度空间,通过高斯差分尺度空间(DoG scale-space)检测图像局部极值点。
(2)去除不稳定点,确定关键点:不稳定点主要为不稳定的边缘点和低对比度的关键点,Dacid G.Lowe通过拟合二阶微分方程的方法排除低对比度点,同时可采用Harris角点检测方法去除不稳定的边缘点。
(3)确定关键点的方向:主要原理是统计关键点领域所有的梯度方向直方图,以直方图中最大值作为该关键点的主方向,同时为了提高后续匹配的鲁棒性,将直方图中峰值超过主峰80%的方向作为该关键点的辅方向。
(4)提取关键点描述符
(5)关键点匹配:才用特征向量之间的欧氏距离评估关键点之间的相似性程度。那么这里会通过一个预设的阈值进行过滤,阈值的设置直接影响到匹配点的数量和精确性。一般阈值的选择为0.7~0.8之间。
为了更好的看到SIFT算法的效果,可以实践一下。
C++代码
环境:vs2010+opencv2.3.1+win7 ×64
  1. #include <opencv2/opencv.hpp>
  2. #include <istream>
  3. using namespace std;
  4. using namespace cv;
  5. int main()
  6. {
  7.     //read the two input images
  8.     Mat image1 = imread(“image1.jpg”);
  9.     Mat image2 = imread(“image2.jpg”);
  10.     //if failed
  11.     if(image1.empty()||image2.empty())
  12.     {
  13.         cout<<“error,the image is not exist”<<endl;
  14.         return -1;
  15.     }
  16.     //difine a sift detector
  17.     SiftFeatureDetector siftDetector;
  18.     //store key points
  19.     vector<KeyPoint> keypoint1,keypoint2;
  20.     //detect image with SIFT,get key points
  21.     siftDetector.detect(image1,keypoint1);
  22.     Mat outImage1;
  23.     //draw key points at the out image and show to the user
  24.     drawKeypoints(image1,keypoint1,outImage1,Scalar(255,0,0));
  25.     imshow(“original_image1”,image1);
  26.     imshow(“sift_image1”,outImage1);
  27.     Mat outImage2;
  28.     siftDetector.detect(image2,keypoint2);
  29.     drawKeypoints(image2,keypoint2,outImage2,Scalar(255,0,0));
  30.     imshow(“sift_image2.jpg”,outImage2);
  31.     //imwrite(“sift_result2.jpg”,outImage2);
  32.     //store 10 keypoints in order to watch the effect clearly
  33.     vector<KeyPoint> keypoint3,keypoint4;
  34.     for(int i=0;i<10;i++)
  35.     {
  36.         keypoint3.push_back(keypoint1[i]);
  37.         keypoint4.push_back(keypoint2[i]);
  38.     }
  39.     // difine a sift descriptor extractor
  40.     SiftDescriptorExtractor extractor;
  41.     //store the descriptor of each image
  42.     Mat descriptor1,descriptor2;
  43.     BruteForceMatcher<L2<float>> matcher;
  44.     vector<DMatch> matches;
  45.     Mat img_matches;
  46.     //compute the descriptor of each image
  47.     extractor.compute(image1,keypoint3,descriptor1);
  48.     extractor.compute(image2,keypoint4,descriptor2);
  49.     //match
  50.     matcher.match(descriptor1,descriptor2,matches);
  51.     //show the result
  52.     drawMatches(image1,keypoint3,image2,keypoint4,matches,img_matches,Scalar(255,0,0));
  53.     imshow(“matches”,img_matches);
  54.     //store the match_image
  55.     //imwrite(“matches.jpg”,img_matches);
  56.     waitKey(0);
  57.     return 0;
  58. }
运行效果
依次为:原图,原图sift后,原图经缩放旋转再sift后,匹配结果
为了清晰看出匹配点之间的连线关系,程序中只是从每一幅图的SIFT关键点中选择了10个关键点,而且是下标相对应的10个点,从理论上来讲,可能存在一些问题,就是这些点实际上本就不是对应的匹配点,所以可能这也是造成匹配结果有误的原因。
那么如果我们把所有的关键点都进行匹配,效果如下:
依次为:原图和原图&缩放旋转后匹配,原图和原图&缩放后匹配。
从这两张匹配后的图中也可以看出,同样是存在错误匹配的。

转载注明来源:CV视觉网 » 尺度不变特征变换匹配算法SIFT

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 0超赞 0无聊 0扯淡 0不解 0路过

评论 抢沙发

评论前必须登录!