python+OpenCV笔记(三十二):特征检测——SIFT与SURF示例

python+OpenCV笔记(三十二):特征检测——SIFT与SURF示例,第1张

python+OpenCV笔记(三十二):特征检测——SIFT与SURF示例

目录

SIFT算法

SIFT实现流程

SIFT特性与原理

SIFT代码示例

SURF算法

拓展

关键点KeyPoints剖析


SIFT算法

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

SIFT实现流程

1.实例化SIFT

sift = cv2.SIFT_create()

2.找出关键点并计算描述符

keypoints, descriptors = sift.detectAndCompute(gray, None)

特征检测与描述符提取的相关函数:

    detect:该函数可用来从一张图像或一组图像中检测特征(即关键点)。compute:该函数可以用来从关键点中提取(即计算)描述符。detectAndCompute:该函数可以同时执行检测与计算。descriptorSize()、descriptorType()、defaultNorm()

3.画出关键点

API:

img = cv2.drawKeypoints(image, keypoints, outImage, color, flags)

参数:

image:输入的灰度图像keypoints:从原图中获得的关键点,这也是画图时所用到的数据outImage:输出的图片color:颜色flags:绘图功能的标识设置
有以下4种:
1. cv2.DRAW_MATCHES_FLAGS_DEFAULT:只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标
2. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size,和方向,是最能显示特征的一种绘制方式
3. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就是一个初始化好了的,size与type都是已经初始化好的变量
4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制 SIFT特性与原理

    旋转、缩放、平移不变性区分性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配解决图像仿射变换,投影变换的关键的匹配光照影响小目标遮挡影响小噪声景物影响小

SIFT实现原理参考:

https://www.cnblogs.com/my-love-is-python/p/10414135.html

SIFT代码示例
import cv2
import numpy as np

img = cv2.imread('E:/test3.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT_create()
kp, des = sift.detectAndCompute(gray, None)  # 找到关键点

img = cv2.drawKeypoints(gray, kp, img)  # 绘制关键点

cv2.imshow('SIFT', img)
cv2.waitKey(0)

原图:

 SIFT检测结果:

修改drawKeyPoints函数,flags使用cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS

img = cv2.drawKeypoints(gray, kp, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

SURF算法

(注:目前SURF为专利授权算法,只有在opencv_contrib构建中使用了 OPENCV_ENABLE_NONFREE  CMake标志时才可用)

应用SURF进行特征检测与描述符的提取只需要将SIFT的示例代码稍作修改:

SIFT代码:

sift = cv2.SIFT_create()
kp, des = sift.detectAndCompute(gray, None)  # 找到关键点

修改后的SURF代码:

surf = cv2.xfeatures2d.SURF_create()
kp, des = surf.detectAndCompute(gray, None)  # 找到关键点

拓展 关键点KeyPoints剖析

pt:即点,包含图像中关键点的位置x,yangle:表示特征的方向,如前面处理过的图像中的径向线的方向。如果检测关键点的算法能够找到它,则设置它,否则设置为-1size:表示特征的直径response:表示关键点的强度,可对关键点排序或者滤除强度较弱的关键点等等octave:表示发现该特征的图像金字塔层。这是一个非常强大而实用的概念,广泛用于在检测关键点以及使用关键点进一步检测图像上可能大小不同的对象时,实现尺度独立,或者说尺度不变性。为了实现该功能,用相同的算法处理同一图像的不同尺度版本(仅缩小版本),称每一个尺度为金字塔的一个分组或一层。class_id:为一个关键点或者一组关键点分配自定义的标识符

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5721577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存