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正则表达式教程之二:捕获篇
Mar 02 Python
node.js获取参数的常用方法(总结)
May 29 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 Python
django 快速启动数据库客户端程序的方法示例
Aug 16 Python
python中导入 train_test_split提示错误的解决
Jun 19 Python
python 对一幅灰度图像进行直方图均衡化
Oct 27 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 Python
使用scrapy实现增量式爬取方式
Jun 21 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
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
PHP实现的简单缓存类
2015/07/29 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
php中使用GD库做验证码
2016/03/31 PHP
Yii2中datetime类的使用
2016/12/17 PHP
详解PHP队列的实现
2019/03/14 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
js的2种继承方式详解
2014/03/04 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
浅谈下拉菜单中的Option对象
2015/05/10 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
python生成随机验证码(中文验证码)示例
2014/04/03 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
欢迎词怎么写
2015/01/23 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
2015年公务员工作总结
2015/04/24 职场文书
房屋所有权证明
2015/06/19 职场文书
经营场所证明范本
2015/06/19 职场文书