【局部特征】SIFT算法描述(附python实例代码)

文章目录

  • 局部特征SIFT
    • 实质
    • 特点
    • 尺度空间
    • 高斯金字塔
      • 高斯金字塔的构建分为两步:
    • SIFT特征计算步骤
      • SIFT——计算高斯差分(DoG)空间
        • DoG函数
        • DoG高斯差分金字塔
        • DoG局部极值检测
      • SIFT——特征点(又叫关键点)方向估计
      • SIFT——计算特征点描述子
    • 完整代码如下

局部特征SIFT

基于尺度空间不变的特征,是用于图像处理领域的一种描述。可在图像中检测出关键点,是一种 局部特征描述子

实质

在不同的尺度空间上查找关键点,并计算出关键点的方向。
【局部特征】SIFT算法描述(附python实例代码)_第1张图片

特点

  • 具有良好的不变性
    旋转、尺度缩放、平移、亮度变化
    对视角变化、仿射变换和噪声也有一定程度的稳定性
  • 独特性好,信息量丰富
    适用于在海量特征数据库中进行快速、准确的匹配
  • 多量性
    即使少数物体也可以产生大量SIFT特征
  • 计算快
    经优化的SIFT匹配算法甚至可以达到实时性

尺度空间

使用不同o 的LOG对图片进行滤波
在这里插入图片描述

使用LOG,则后续计算量较大,故使用DOG来代替LOG,用差分代替微分。
在这里插入图片描述
【局部特征】SIFT算法描述(附python实例代码)_第2张图片

高斯金字塔

高斯金字塔就是在传统金字塔的基础上,图像的金字塔模型是指将原始图像不断降阶采样,对每一层用不同的参数σ做高斯模糊,使得每一层金字塔有多张高斯模糊图像,这样一组图像是一个octave。

高斯金字塔的构建分为两步:

(1)对图像做高斯平滑;
(2)对图像做降采样。
【局部特征】SIFT算法描述(附python实例代码)_第3张图片
octave(i+1)的第一张(从下往上数)图像是由octave(i)中的倒数第三张图像降采样得到

SIFT特征计算步骤

  • 在DoG尺度空间中获取极值点,即关键点
    LoG尺度空间和DoG尺度空间
  • 对关键点处理
    位置插值(获得精确的关键点)
    去除边缘点
  • 关键点的方向估计
  • 关键点描述子的生成
    区域坐标旋转
    计算采样区域的直方图

SIFT——计算高斯差分(DoG)空间

DoG函数

在这里插入图片描述

DoG高斯差分金字塔

【局部特征】SIFT算法描述(附python实例代码)_第4张图片

DoG局部极值检测

【局部特征】SIFT算法描述(附python实例代码)_第5张图片

【局部特征】SIFT算法描述(附python实例代码)_第6张图片
判断极值点:以X为检测点,其周围的点,除了同层所包围的8个点外,还有上一层的9个点与下一层的9个点(考虑26个点

SIFT——特征点(又叫关键点)方向估计

本算法采用梯度直方图统计法,统计以关键点为原点,一定区域内的图像像素点确定关键点方向。

  • 在尺度上计算梯度直方图
    8方向――以特征点为中心、以3×1.5o为半径
  • 直方图的峰值方向代表了关键点的主方向,方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向
  • 为了匹配的稳定性,将超过最高值80%的方向,称为辅方向

【局部特征】SIFT算法描述(附python实例代码)_第7张图片
为了保证特征矢量具有旋转不变性,需要以特征点为中心,将特征点附近邻域内的图像旋转一个方向角0。即将原图像x轴转到与主方向相同的方向。
【局部特征】SIFT算法描述(附python实例代码)_第8张图片

SIFT——计算特征点描述子

对于每一个关键点,都拥有位置、尺度以及方向三个信息。为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。

在旋转后的坐标上采样16x16的像素窗

【局部特征】SIFT算法描述(附python实例代码)_第9张图片

完整代码如下

import numpy as np
import cv2 as cv
img = cv.imread('H:/pictures/home.jpg')
gray= cv.cvtColor(img,cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)
img=cv.drawKeypoints(gray,kp,img)

cv.imshow("SIFT", img)
cv.imwrite('sift_keypoints.jpg',img)
cv.waitKey(0)
cv.destroyAllWindows()

【局部特征】SIFT算法描述(附python实例代码)_第10张图片
【局部特征】SIFT算法描述(附python实例代码)_第11张图片

你可能感兴趣的:(计算机视觉,计算机视觉,机器学习,算法,opencv,slam)