图片特征匹配算法

一、特征点(角点)匹配
  图像匹配能够应用的场合非常多,如目标跟踪,检测,识别,图像拼接等,而角点匹配最核心的技术就要属角点匹配了,所谓角点匹配是指寻找两幅图像之间的特征像素点的对应关系,从而确定两幅图像的位置关系。
  角点匹配可以分为以下四个步骤:
  1、提取检测子:在两张待匹配的图像中寻找那些最容易识别的像素点(角点),比如纹理丰富的物体边缘点等。
  2、提取描述子:对于检测出的角点,用一些数学上的特征对其进行描述,如梯度直方图,局部随机二值特征等。检测子和描述子的常用提取方法有:sift,harris,surf,fast,agast,brisk,freak,brisk,brief/orb等。
  3、匹配:通过各个角点的描述子来判断它们在两张图像中的对应关系,常用方法如 flann等。
  4、消噪:去除错误匹配的外点,保留正确的匹配点。常用方法有KDTREE,BBF,Ransac,GTM等。
  二、SIFT匹配方法的提出
  为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,SIFT的作者Lowe提出了比较最近邻距离与次近邻距离的SIFT匹配方式:取一幅图像中的一个SIFT关键点,并找出其与另一幅图像中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离得到的比率ratio少于某个阈值T,则接受这一对匹配点。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。显然降低这个比例阈值T,SIFT匹配点数目会减少,但更加稳定,反之亦然。
  Lowe推荐ratio的阈值为0.8,但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6 之间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点,所以建议ratio的取值原则如下:
  ratio=0. 4:对于准确度要求高的匹配;
  ratio=0. 6:对于匹配点数目要求比较多的匹配;
  ratio=0. 5:一般情况下。
  三、常见的SIFT匹配代码
  1、vlfeat中sift toolbox中的vl_ubcmatch.c使用的是普通的欧氏距离进行匹配(该SIFT代码贡献自Andrea
Vedaldi)。
  2、Lowe的C++代码中使用的是欧氏距离,但是在matlab代码中为了加速计算,使用的是向量夹角来近似欧氏距离:先将128维SIFT特征向量归一化为单位向量(每个数除以平方和的平方根),然后点乘来得到向量夹角的余弦值,最后利用反余弦(acos函数)求取向量夹角。实验证明Lowe的办法正确率和耗时都很不错。
同样,也可以采用knnsearch函数求最近点和次近点:knnsearch采用euclidean距离时得到的结果与lowe采用的近似方法结果几乎一致,正好印证了模拟欧氏距离的效果。
  3、Rob Hess的OpenSIFT采用了KDTREE来对匹配进行优化。
  4、CSDN大神v_JULY_v实现了KDTREE+BBF对SIFT匹配的优化和消除错误匹配:从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
  5、OpenCV中features2d实现的SIFT匹配有多种matcher:VectorDescriptorMatcher,BFMatcher(Brute-force descriptor matcher),FernDescriptorMatcher,OneWayDescriptorMatcher,FlannBasedMatcher 等等。目前只知道采用knnsearch

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KNN(K-Nearest Neighbors)最近邻算法是一种常见的特征匹配算法,它可以用于图像处理、计算机视觉等领域。在Python中可以使用OpenCV库实现KNN特征匹配算法。下面是一个简单的示例代码: ```python import cv2 import numpy as np # 读取图片并转换为灰度图 img1 = cv2.imread('img1.jpg', 0) img2 = cv2.imread('img2.jpg', 0) # 初始化SIFT检测器 sift = cv2.xfeatures2d.SIFT_create() # 使用SIFT检测关键点和描述符 kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # 初始化FLANN匹配器 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) # 使用KNN算法进行特征匹配 matches = flann.knnMatch(des1, des2, k=2) # 选择好的匹配 good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: good_matches.append(m) # 可视化匹配结果 img3 = cv2.drawMatches(img1, kp1, img2, kp2, good_matches, None, flags=2) # 显示匹配结果 cv2.imshow('Matches', img3) cv2.waitKey() cv2.destroyAllWindows() ``` 在以上代码中,首先读取两张图片并将其转换为灰度图,然后使用SIFT检测关键点和描述符。接着初始化FLANN匹配器,并使用KNN算法进行特征匹配。在匹配完成后,根据匹配的距离选择好的匹配,并使用OpenCV的`drawMatches`函数将匹配结果可视化。最后显示匹配结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值