目录

SIFT算法

SIFT实现流程

SIFT特性与原理

SIFT代码示例

SURF算法

拓展

关键点KeyPoints剖析


SIFT算法

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

SIFT实现流程

1.实例化SIFT

sift = cv2.SIFT_create()

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

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

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

  1. detect:该函数可用来从一张图像或一组图像中检测特征(即关键点)。
  2. compute:该函数可以用来从关键点中提取(即计算)描述符。
  3. detectAndCompute:该函数可以同时执行检测与计算。
  4. 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特性与原理

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

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐