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 相关文章推荐
python发送伪造的arp请求
Jan 09 Python
Python Nose框架编写测试用例方法
Oct 26 Python
python编写微信远程控制电脑的程序
Jan 05 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
Python requests发送post请求的一些疑点
May 20 Python
Python实现简单的用户交互方法详解
Sep 25 Python
python的pytest框架之命令行参数详解(上)
Jun 27 Python
django中瀑布流写法实例代码
Oct 14 Python
python实现按关键字筛选日志文件
Dec 24 Python
如何基于Python + requests实现发送HTTP请求
Jan 13 Python
python实现简单颜色识别程序
Feb 19 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
php邮件发送的两种方式
2020/04/28 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
详解vue axios二次封装
2018/07/22 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
2019/05/21 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
打开电脑上的QQ的python代码
2013/02/10 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
python pandas模块基础学习详解
2019/07/03 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
计算机专业个人求职自荐信
2013/09/21 职场文书
初中地理教学反思
2014/01/11 职场文书
学习十八大的心得体会
2014/09/01 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
电力培训学习心得体会
2016/01/11 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书