文章目录

  • 一、SIFT的介绍
  • 二、SIFT特征检测过程
  • 三、利用SIFT实现两张图片的匹配
  • 参考资料

一、SIFT的介绍

  1. 概念
    SIFT称为尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
  2. SIFT的特点
    ①SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
    ②区分性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
    ③多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
    ④高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
    ⑥可扩展性,可以很方便的与其他形式的特征向量进行联合。

二、SIFT特征检测过程

  1. 尺度空间极值检测
    搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。
  2. 关键点定位
    在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。
  3. 方向确定
    基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
  4. 关键点描述
    在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

三、利用SIFT实现两张图片的匹配

  1. 实例化sift

    import numpy as np
    import cv2
    from matplotlib import pyplot as pltimgname1 = 'E:/SIFTDemo/test1/test1_1.jpg'
    imgname2 = 'E:/SIFTDemo/test1/test_1_2.jpg'
    #实例化的sift函数
    sift = cv2.xfeatures2d.SIFT_create()
    
  2. 图片灰度化
    img1 = cv2.imread(imgname1)
    gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像
    img2 = cv2.imread(imgname2)
    gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)#灰度处理图像
    hmerge = np.hstack((gray1, gray2)) #水平拼接
    cv2.imshow("gray", hmerge) #拼接显示为gray
    cv2.waitKey(0)
    

  3. 获取关键点
    kp1, des1 = sift.detectAndCompute(img1,None)   #des是描述子
    #sift.detectAndComputer(gray, None)计算出图像的关键点和sift特征向量   参数说明:gray表示输入的图片
    #des1表示sift特征向量,128维
    print("图片1的关键点数目:"+str(len(kp1)))
    #print(des1.shape)
    kp2, des2 = sift.detectAndCompute(img2,None)  #des是描述子
    print("图片2的关键点数目:"+str(len(kp2)))
    

    对于获得的关键点信息其存储是[<KeyPoint 000001781B561150>, <KeyPoint 000001781B5613C0>]
    可以采用下面的属性获取每个关键点的一些信息
    pt:关键点的位置
    size:关键点的范围
    angle:关键点角度
    response:能够给某个关键点更强烈响应的检测器,有时能够被理解为特性实际存在的概率
    octave:标示了关键点被找到的层级,总是希望在相同的层级找到对应的关键点
    class_id:标示关键点来自于哪一个目标

  4. 绘制关键点
    img3 = cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255)) #画出特征点,并显示为红色圆圈
    #img3 = cv2.drawKeypoints(gray, kp, img) 在图中画出关键点   参数说明:gray表示输入图片, kp表示关键点,img表示输出的图片
    #print(img3.size)
    img4 = cv2.drawKeypoints(img2,kp2,img2,color=(255,0,255)) #画出特征点,并显示为红色圆圈hmerge = np.hstack((img3, img4)) #水平拼接
    cv2.imshow("point", hmerge) #拼接显示为gray
    cv2.waitKey(0)
    

  5. 关键点匹配
    # BFMatcher解决匹配
    bf = cv2.BFMatcher()
    matches = bf.knnMatch(des1,des2, k=2)
    #print(matches)
    #print(len(matches))
    # 调整ratio
    good = []
    for m,n in matches:if m.distance < 0.75*n.distance:good.append([m])
    #img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)
    img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
    cv2.imshow("BFmatch", img5)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    kNN匹配的说明:
    近邻匹配,在匹配的时候选择k个和特征点最相似的点,如果这k个点之间的区别足够大,则选择最相似的那个点作为匹配点,通常选择k=2,也就是最近邻匹配。
    kNN算法的核心思想
    如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
    cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)下的匹配效果
    整个线条比较杂乱,并且还有比较多的匹配错误
    cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)下的匹配效果

    明显优于上面的匹配
    当调整ratio的时候,匹配也会发生变化,会过滤一些错误的匹配点。根据经验,ratio一般取值为0.6,0.7。

参考资料

  1. 应用OpenCV和Python进行SIFT算法的实现
  2. OpenCv学习笔记14–图像描述符匹配算法、以及目标匹配

OpenCV和Python进行SIFT算法——两张图片的关键点匹配相关推荐

  1. 【Opencv】Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图)

    Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图) 全景图拼接 思路 具体步骤 代码与结果 代码 效果测试1 效果测试2 全景图拼接 思路 这个就是简单对左右两张图进行拼接,希望 ...

  2. surf和sift算法被申请专利后部分opencv版本无法使用后的安装pycharm+opencv使用surf和sift算法教程

    安装pycharm+opencv教程使用surf和sift算法 surf和sift算法在pycharm中的问题 安装过程 使用的软件版本 安装步骤 一.pycharm的安装 二.尝试打开pycharm ...

  3. python图像拼接_python实现两张图片拼接为一张图片并保存

    本文实例为大家分享了python实现两张图片拼接为一张图片并保存的具体代码,供大家参考,具体内容如下 这里主要用Python扩展库pillow中Image对象的paste()方法把两张图片拼接起来 f ...

  4. 【SIFT算法】极值检测关键点精确定位

    文章链接:https://blog.csdn.net/q_z_r_s 机器感知 一个专注于SLAM.机器视觉.Linux 等相关技术文章分享的公众号 从论文摘要中可以知道,SIFT算法的第一步就是进行 ...

  5. python学习之将两张图片生成为全景图片

    文章目录 1.全景图片的介绍 2.如何实现 2.1.实现原理 2.2.实现代码 3.运行效果 1.全景图片的介绍 全景图通过广角的表现手段以及绘画.相片.视频.三维模型等形式,尽可能多表现出周围的环境 ...

  6. python基于pandas使两个表格之间匹配某一属性

    import pandas as pd import numpy as np #编码距离,用于匹配最相近的中文字符串 def edit_distance(word1, word2):len1 = le ...

  7. chatgpt赋能python:Python将两张图片拼接成一张图:让您的图片处理更高效!

    Python将两张图片拼接成一张图:让您的图片处理更高效! 作为一个有着10年Python编程经验的工程师,我发现Python成为了许多项目的主要语言,其中涵盖了很多关于图像处理的应用程序.在本文中, ...

  8. SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

    图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...

  9. 比较两张图片的相似性

    1.原图上可以发现的信息,两张图拍摄角度不一样,图一拍的比较正,聚焦近:图二拍的有点倾斜,聚焦远.光照不一样,图一光照亮度要比图二高.图片中水泥模子干湿程度不一样,图一的水泥已经完全干了:图二还是水泥 ...

最新文章

  1. LeetCode: Max Points on a Line
  2. 动画库NineOldAndroids
  3. windows 上ping输入到指定文件中
  4. php 截取字符串的方法,php截取字符串的方法介绍
  5. lombok @EqualsAndHashCode 注解的影响
  6. secureCRT连接服务器和文件传输( 一步搞定)
  7. 回顾丨2021数据库大咖讲坛(第6期)视频PPT互动问答
  8. Android 系统(250)---main log导入到uart口
  9. linux mysql查看所有表_linux下查看指定进程的所有连接信息
  10. silverlight 二级导航
  11. kafka linux根目录满,Linux磁盘空间满的诡异问题解决方案
  12. xs资料网-jdpaint编程图档下载_限时下载 | 西门子、三菱、欧姆龙PLC电气设计与编程自学宝典(3册)...
  13. 我的世界1.12.2java下载_我的世界1.12.2电脑版下载
  14. bpsk调制matlab,matlab BPSK 调制与解调
  15. 华硕aura完全卸载_AURA神光同步是什么意思?AURA SYNC神光同步教程
  16. 网络流中 InputStream.available() = 0 问题探究
  17. spiders的使用
  18. 昨晚,谷歌发布了一个可怕的人工智能!
  19. 快学Scala 学习笔记-1: (第一章到第三章)
  20. 社科院与杜兰大学金融管理硕士——承载梦想,带自己遨游世界的“风帆”

热门文章

  1. 宽带拨号失败服务器未响应什么意思,宽带拨号服务器未响应
  2. 图解PMP项目管理马斯洛需求层次理论在公司管理中的应用!
  3. 柯莱特CTO谈企业选择CRM的六大目标
  4. 1加6投屏_全球首批!一场最“快”的OnePlus 6 加油聚会
  5. 【人工智能】AI究竟能为你的生意做什么(以及不能做什么)
  6. 年轻人,看你骨骼惊奇,我这有一份来自阿里的Android开发学习指南,不仅能让你月入5w,度过中年危机都不是问题!
  7. Html快速入门之基本介绍
  8. A Survey of Learning on Small Data(二)
  9. elasticsearch分词器Jcseg安装手册
  10. 多核程序设计 linux,多核程序设计Linux多线程编程.ppt