项目原因,需要对图像特征进行检测,以前在学习opencv时就知道有一些常用的特征检测算法,但因为时间久远,重新了解并简单记录一下。因为对特征检测的要求并不高,因此主要关于传统特征检测方法,且主要关于SIFT。

特征检测与描述

​ 特征:局部图像特征(也称为感兴趣点、关键点、突出点)被定义为一个具体的pattern不同于周围邻近的像素,通常关联着一个或多个图像的属性。这样的属性包括但不限于边缘edges、角点corners、区域regions。

​ 描述符:描述符term detector指的是能够使用高维特征向量描述特征点的算法/技术。

介绍

​ SIFT(Scale-Invariant Feature Transform):尺度不变特征转换。相比角点检测算法Harris和shi-tomas,SIFT算法具有角度和尺度不变性,不论平移、旋转、缩放、亮度和噪声对特征点检测没有影响,而且计算准确,速度快。

​ 优势:获取大量的图片特征信息对于物体识别来说是至关重要的,SIFT能够生成大量的特征,它们密集的覆盖了整个图像的尺度和位置,例如,对于一个500*500像素的图片将能够产生大约2000个稳定的特征。

​ 特征匹配并不是原论文所阐述的重点,主要是为了检验SIFT的效率,特征匹配阶段主要使用欧氏距离和临近算法。

SIFT算法步骤

  • 尺度空间极值检测Scale-space extrema detection:应用高斯差分金字塔(difference-of-Gaussian function)识别出具有尺度和方向不变性的潜在感兴趣点。
  • 关键点搜索与定位Keypoint localization:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度,关键点的选择依据于它们的稳定性。
  • 特征点方向赋值 Orientation assignment:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。
  • 关键点描述符 Keypoint descriptor:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度,这些梯度被变换成为一种表示,这种表示允许比较大的局部形状的变形和光照变化。

​ 具体的公式推导和细节参考原论文或其他博客。

实现:

​ 两种方式,使用opencv自带的SIFT算法或者手撸SIFT。

opencv:

​ 参考:https://opencv.apachecn.org/#/docs/4.0.0/5.4-tutorial_py_sift_intro

import numpy as np
import cv2 as cv

img = cv.imread('source1.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # bgr转灰度
sift = cv.SIFT_create() # sift对象 opencv>=4.4.0 但实际上我的版本是4.1.1.26也支持..不知道为啥
# 低版本使用:sift = cv.xfeatures2d.SIFT_create()

kp = sift.detect(gray, None) # 检测 kp关键点对象
"""
sift.detect第二个参数填入mask,指定检测图像的某个区域
mask_matrix = np.zeros(img.shape[:2], np.uint8)
mask_matrix[0:100 , 0:100] = 1 # H W 选定ROI
kp = sift.detect(gray, mask_matrix)
"""
img = cv.drawKeypoints(img, kp, img) # 画点

cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

​ 使用opencv实现较为简单,注意SIFT的专利已于2020年3月6日到期,opencv也将SIFT特征移出了contrib仓库。

手撸:

​ 参考:https://github.com/rmislam/PythonSIFT

参考

​ Lowe D G. Object recognition from local scale-invariant features[C]//Proceedings of the seventh IEEE international conference on computer vision. Ieee, 1999, 2: 1150-1157.

​ Salahat E, Qasaimeh M. Recent advances in features extraction and description algorithms: A comprehensive survey[C]//2017 IEEE international conference on industrial technology (ICIT). IEEE, 2017: 1059-1063.

​ Li Y, Wang S, Tian Q, et al. A survey of recent advances in visual feature detection[J]. Neurocomputing, 2015, 149: 736-751.

​ Tuytelaars T, Mikolajczyk K. Local invariant feature detectors: a survey[J]. Foundations and trends® in computer graphics and vision, 2008, 3(3): 177-280.

​ Joshi K, Patel M I. Recent advances in local feature detector and descriptor: a literature survey[J]. International Journal of Multimedia Information Retrieval, 2020, 9(4): 231-247.

SIFT - Scale-Invariant Feature Transform

Introduction to SIFT (Scale-Invariant Feature Transform)

SIFT角点检测算法原理

SIFT算法原理解释

你真的理解图像处理经典算法SIFT吗?最全面综述:尺度不变特征转换