python利用opencv实现SIFT特征提取与匹配


Posted in Python onMarch 05, 2020

本文实例为大家分享了利用opencv实现SIFT特征提取与匹配的具体代码,供大家参考,具体内容如下

1、SIFT

1.1、sift的定义

SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。

1.2、sift算法介绍

SIFT由David Lowe在1999年提出,在2004年加以完善 。SIFT在数字图像的特征描述方面当之无愧可称之为最红最火的一种,许多人对SIFT进行了改进,诞生了SIFT的一系列变种。SIFT已经申请了专利(所以现在opencv使用这个算法,需要低的版本)。

SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

SIFT算法具有如下一些特点:

1)SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;
2)区分性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;
3)多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;
4)高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;
5)可扩展性,可以很方便的与其他形式的特征向量进行联合。

1.3、特征检测

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

1.4、特征匹配

SIFT特征匹配主要包括2个阶段:

第一阶段:SIFT特征的生成,即从多幅图像中提取对尺度缩放、旋转、亮度变化无关的特征向量。
第二阶段:SIFT特征向量的匹配。

SIFT特征的生成一般包括以下几个步骤:

1)构建尺度空间,检测极值点,获得尺度不变性。
2)特征点过滤并进行精确定位。
3)为特征点分配方向值。
4)生成特征描述子。以特征点为中心取16×16的邻域作为采样窗口,将采样点与特征点的相对方向通过高斯加权后归入包含8个bin的方向直方图,最后获得4×4×8的128维特征描述子。当两幅图像的SIFT特征向量生成以后,下一步就可以采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取图1的某个关键点,通过遍历找到图像2中的距离最近的两个关键点。在这两个关键点中,如果最近距离除以次近距离小于某个阈值,则判定为一对匹配点。

2、python实现

2.1、准备工作

由于SIFT已经申请了专利,所以在高版本的opencv中,会出现错误,以前是opencv4.0.1,然后安装版本为opencv3.4.2.16
卸载以前的版本(低版本,可以试试直接运行代码):

pip uninstall opencv-python
pip uninstall opencv-contrib-python

用命令行(CMD),采用pip方式:

pip install opencv_python==3.4.2.16 
pip install opencv-contrib-python==3.4.2.16

python利用opencv实现SIFT特征提取与匹配

2.2、代码实现

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on 2019年6月14日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2019-06-14'
from matplotlib import pyplot as plt
from imagedt.decorator import time_cost
import cv2
print('cv version: ', cv2.__version__)

def bgr_rgb(img):
 (r, g, b) = cv2.split(img)
 return cv2.merge([b, g, r])

def orb_detect(image_a, image_b):
 # feature match
 orb = cv2.ORB_create()
 kp1, des1 = orb.detectAndCompute(image_a, None)
 kp2, des2 = orb.detectAndCompute(image_b, None)
 # create BFMatcher object
 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
 # Match descriptors.
 matches = bf.match(des1, des2)
 # Sort them in the order of their distance.
 matches = sorted(matches, key=lambda x: x.distance)
 # Draw first 10 matches.
 img3 = cv2.drawMatches(image_a, kp1, image_b, kp2,
    matches[:100], None, flags=2)
 return bgr_rgb(img3)

@time_cost
def sift_detect(img1, img2, detector='surf'):
 if detector.startswith('si'):
 print("sift detector......")
 sift = cv2.xfeatures2d.SURF_create()
 else:
 print("surf detector......")
 sift = cv2.xfeatures2d.SURF_create()
 # find the keypoints and descriptors with SIFT
 kp1, des1 = sift.detectAndCompute(img1, None)
 kp2, des2 = sift.detectAndCompute(img2, None)
 # BFMatcher with default params
 bf = cv2.BFMatcher()
 matches = bf.knnMatch(des1, des2, k=2)
 # Apply ratio test
 good = [[m] for m, n in matches if m.distance < 0.5 * n.distance]
 # cv2.drawMatchesKnn expects list of lists as matches.
 img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)
 return bgr_rgb(img3)

if __name__ == "__main__":
 # load image
 image_a = cv2.imread('G:/2018and2019two/qianrushi/wuluo1.jpg')#绝对路径
 image_b = cv2.imread('G:/2018and2019two/qianrushi/wuluo2.jpg')
 # ORB
 # img = orb_detect(image_a, image_b)
 # SIFT or SURF
 img = sift_detect(image_a, image_b)
 plt.imshow(img)
 plt.show()

2.3、运行结果

采用同一张图片:

python利用opencv实现SIFT特征提取与匹配

两张有重叠部分的代码:

python利用opencv实现SIFT特征提取与匹配

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
wxPython 入门教程
Oct 07 Python
python with statement 进行文件操作指南
Aug 22 Python
django中send_mail功能实现详解
Feb 06 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
对Python的交互模式和直接运行.py文件的区别详解
Jun 29 Python
让你的Python代码实现类型提示功能
Nov 19 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
python中threading开启关闭线程操作
May 02 Python
Python正则表达式如何匹配中文
May 27 Python
详解Python中第三方库Faker
Sep 25 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
python画图常规设置方式
Mar 05 #Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 #Python
python入门之井字棋小游戏
Mar 05 #Python
解决Python图形界面中设置尺寸的问题
Mar 05 #Python
python实现简单井字棋小游戏
Mar 05 #Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 #Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 #Python
You might like
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
原生javascript实现图片无缝滚动效果
2016/02/12 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
js实现文章目录索引导航(table of content)
2020/05/10 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
vue 中this.$set 动态绑定数据的案例讲解
2021/01/29 Vue.js
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python实现简单登录验证
2016/04/13 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
python中if及if-else如何使用
2020/06/02 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
视光学毕业生自荐书范文
2014/02/13 职场文书
本科应届生自荐信
2014/06/29 职场文书
2016年学校禁毒宣传活动工作总结
2016/04/05 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript