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脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
python使用win32com库播放mp3文件的方法
May 30 Python
Python简单的制作图片验证码实例
May 31 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
python中sys.argv函数精简概括
Jul 08 Python
对Python函数设计规范详解
Jul 19 Python
python的re模块使用方法详解
Jul 26 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
python中操作文件的模块的方法总结
Feb 04 Python
python 利用 PIL 将数组值转成图片的实现
Apr 12 Python
pytorch实现ResNet结构的实例代码
May 17 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 fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
jQuery on()绑定动态元素出现的问题小结
2016/02/19 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
Vue表单实例代码
2016/09/05 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
Vue自定义指令详解
2017/07/28 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部
2019/09/16 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
vue 组件简介
2020/07/31 Javascript
[45:56]Ti4正赛第一天 VG vs NEWBEE 3
2014/07/19 DOTA
Python群发邮件实例代码
2014/01/03 Python
python中sets模块的用法实例
2014/09/30 Python
wxPython窗口中文乱码解决方法
2014/10/11 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
python程序封装为win32服务的方法
2021/03/07 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
Python PyQt5整理介绍
2020/04/01 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
共筑中国梦演讲稿
2014/04/23 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
爱的教育观后感
2015/06/17 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
vue响应式原理与双向数据的深入解析
2021/06/04 Vue.js
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL