基于特征点匹配方法——SIFT, SURF, ORB的图像识别

一、背景

最近需要做一个关于图像识别的算法,应用场景大概就是识别不同的角度,方位的照片中的标志性建筑,也就是图像识别吧,想来想去,大概想了4种方法实现:

1. 基于特征点匹配算法,可以看作是一种图像匹配的问题。只要识别两幅图中的关键点,检测是否有对应点就可以了。

2. 基于图像检索算法,可以看作是一种图像检索的问题。直接调用以图搜图的API,找到相似度最高图像的文字描述,提取关键词就可以。

3. 基于目标检测算法,可以看作是一种目标检测的问题。参考RCNN,SSD等算法的思路,直接进行目标检测即可。

4. 基于目标分类算法,可以看作是一种图像分类的问题。只要我构建足够的库,判断输入图像是否可以被分到库中的某一类别下。

4种算法来说,第三种是代价最高的,需要非常准确的训练数据集,且模型还比较复杂, 所以就pass掉了,第一种方法最简单,第二种方法的准确度依赖于以图搜图的API,第四种方法中规中矩。

本实验先以第一种方法为背景,选取了3张大雁塔的图,其中1张作为真值,另外2张可以看作不同条件下的待检测图,进行特征点匹配算法的图像识别。

二、算法简介

关于特征点匹配算法,最有名的大概就是SIFT——尺度不变特征转换算法。当然后续还有很多新的算法。因此实验选择3个算法:SIFT, SURF, ORB进行实验,网上的介绍也非常多,下面先推荐一些比较好的介绍:

[1]SLAM入门之视觉里程计(1):特征点的匹配

[2]SURF算法

[3]ORB特征提取与匹配

[4]图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现

对于这三种算法,这里只简单的罗列一下操作步骤:

SIFT算法:

1. 特征点检测

2. 伪特征点去除

3. 特征点梯度及方向匹配

4. 特征向量生成

SURF算法:

1. 构建Hessian矩阵,生成特征点

2. 尺度空间构建

3. 特征点定位

4. 特征点主方向匹配

5. 生成特征点描述子

6. 特征点匹配

ORB算法:

1. 方向fast方法的特征点检测

2. Brief算法计算特征点的描述子

3. 特征点匹配

幸运的是,上述三种算法都可以用opencv来实现,而且实现过程也非常简单。

三、算法实现

算法的实现比较简单,网上的参考代码也很多,这里我选择了3张大雁塔的图,目的当然是匹配出不同影像上的大雁塔了,三张图的命名分别为1.jpg,2.jpg,3.jpg,三张图的内容如下所示:

下面直接给出实验代码:

import numpy as np
from matplotlib import pyplot as plt
import cv2


def sift(imgname1, imgname2):
    sift = cv2.xfeatures2d.SIFT_create()

    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)

    img1 = cv2.imread(imgname1)
    img1 = cv2.resize(img1, (600, 400))
    kp1, des1 = sift.detectAndCompute(img1, None)    #des是描述子

    img2 = cv2.imread(imgname2)
    img2 = cv2.resize(img2, (600, 400))
    kp2, des2 = sift.detectAndCompute(img2, None)

    good = []
    for m,n in matches:
        if m.distance < 0.70*n.distance:
            good.append([m])

    img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
    cv2.imshow("FLANN", img5)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


def surf(imgname1, imgname2):
    surf = cv2.xfeatures2d.SURF_create()

    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)

    img1 = cv2.imread(imgname1)
    img1 = cv2.resize(img1, (600, 400))
    kp1, des1 = surf.detectAndCompute(img1,None)    #des是描述子

    img2 = cv2.imread(imgname2)
    img2 = cv2.resize(img2, (600, 400))
    kp2, des2 = surf.detectAndCompute(img2,None)

    matches = flann.knnMatch(des1,des2,k=2)

    good = []
    for m,n in matches:
        if m.distance < 0.7*n.distance:
            good.append([m])

    img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
    cv2.imshow("SURF", img5)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


def orb(imgname1, imgname2):
    orb = cv2.ORB_create()

    img1 = cv2.imread(imgname1)
    img1 = cv2.resize(img1, (600, 400))
    kp1, des1 = orb.detectAndCompute(img1,None)#des是描述子

    img2 = cv2.imread(imgname2)
    img2 = cv2.resize(img2, (600, 400))
    kp2, des2 = orb.detectAndCompute(img2,None)

    # BFMatcher解决匹配
    bf = cv2.BFMatcher()
    matches = bf.knnMatch(des1,des2, k=2)
    # 调整ratio
    good = []
    for m,n in matches:
        if m.distance < 0.8*n.distance:
            good.append([m])

    img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
    cv2.imshow("ORB", img5)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    imgname1 = '1.jpg'
    imgname2 = '2.jpg'

    sift(imgname1, imgname2)
    surf(imgname1, imgname2)
    orb(imgname1, imgname2)

四、实验结果

1. 相近角度下的特征匹配结果

由于1.jpg和2.jpg的角度差距不大,因此先来看看这两张图的匹配效果:

首先是SIFT算法的:

然后是SURF算法:

最后是ORB算法:

2. 不同角度下的特征匹配结果

由于1.jpg和3.jpg的差距比较明显,因此对这两幅图及进行特征匹配:

首先是SIFT算法:

其次是SURF算法:

最后是ORB算法:

五、结论分析

1. 相近角度下,SURF的匹配效果最好,但是仍有很多特征点匹配错误

2. 不同角度下,三种方法的匹配效果都不太好

3. 看过相关文献中,关于这类方法的介绍,说是两幅图的差异小于25%的情况下效果可以,如果差异过大,就不建议使用了

  • 5
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: siftsurforb都是计算机视觉中的特征点匹配算法。它们可以在图像中提取出关键点以及这些点的特征描述符,用于图像配准、物体识别等应用。每种算法的特征描述符有不同的特点,适用于不同的应用场景。特征点匹配是计算机视觉中非常重要的技术之一。 ### 回答2: SIFTSURFORB是三种流行的特征点匹配算法。它们在计算机视觉和图像处理领域得到了广泛的应用。在这里,我们将详细介绍这三种算法。 SIFT (Scale-invariant feature transform) SIFT特征点匹配算法是一种基于局部图像特征的特征点匹配方法。在SIFT算法中,输入图像首先被分解为多个不同尺度的图像金字塔,然后在每个尺度上检测特征点。这些特征点具有尺度不变性和旋转不变性,可以用来进行图像匹配SIFT算法的流程包括以下几个步骤: 1. 高斯差分金字塔 2. 高斯平滑 3. 极值点检测 4. 特征点定位 5. 特征点方向 6. 特征点描述子 7. 特征点匹配 SIFT算法的优点是可以检测多个特征点,并能够稳定地匹配不同角度、尺度和光照条件下的图像。 SURF (Speeded Up Robust Features) SURF算法是基于SIFT算法的改进版本。在SURF算法中,使用了Hessian矩阵来检测图像的兴趣点。与SIFT算法相比,SURF算法具有更快的速度和更高的匹配精度,并且SURF算法使用积分图像来加速图像特征的计算。 SURF算法的流程包括以下几个步骤: 1. 尺度空间构建 2. 特征点检测 3. 特征点方向 4. 特征点描述子 5. 特征点匹配 SURF算法的优点是具有较高的运算速度和鲁棒性,可以用于处理大规模的图像。 ORB (Oriented Brief) ORB特征点匹配算法是一种计算速度较快、鲁棒性较强的特征点匹配算法。在ORB算法中,使用了BRIEF(Binary Robust Independent Elementary Features)描述子来描述图像特征。与SIFTSURF算法相比,ORB算法的计算速度更快,并且ORB算法具有较高的鲁棒性。 ORB算法的流程包括以下几个步骤: 1. FAST特征检测 2. 极大值抑制 3. 特征点方向 4. BRIEF描述子 5. 特征点匹配 ORB算法的优点是计算速度快,精度高,对光照变化和图像旋转具有较好的适应性。 综上所述,SIFTSURFORB是三种优秀的特征点匹配算法,它们各自具有特点,可以根据不同的应用场景来选择。 ### 回答3: SIFTSURFORB特征点匹配是计算机视觉领域中常用的特征点提取和匹配算法,在物体识别、目标跟踪和图像三维重构等领域具有广泛的应用。 SIFT算法是一种基于尺度空间的特征点提取算法,它通过高斯滤波器对图像进行多尺度平滑处理,提取出具有稳定局部特征的关键点。SIFT算法的特征点描述子具有尺度不变性和旋转不变性,能够对旋转、缩放、亮度变化和视角变化等因素产生的影响进行有效的抵抗。在SIFT算法中,特征点匹配可以通过计算两个图像的特征点间的欧氏距离来实现。 SURF算法是一种基于Hessian矩阵的特征点提取算法,它通过Laplacian-of-Gaussian金字塔来在不同尺度下进行特征点检测。SURF特征点的描述子采用快速测量Hessian矩阵的方式,具有计算速度快、描述子维数少等优点。SURF算法在特征点数量多、图像尺寸大以及噪声存在的情况下表现优越。 ORB算法是一种基于FAST关键点检测器和BRIEF描述子的特征点提取算法,它兼具SURFSIFT算法的优点,在计算速度和特征点匹配效果之间达到了较好的平衡。ORB算法的描述子长度较短,可以在对性能要求较高的应用中使用,比如移动设备上的实时图像处理应用。 总之,SIFTSURFORB特征点匹配算法各有优缺点,具体应用要根据实际情况选择最适合的算法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全部梭哈迟早暴富

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值