图像特征-sift(scale invariant feature transform)

目录

图像尺寸空间

 多分辨金字塔

 高斯差分金字塔(DOG)​编辑

 DOG空间极值检测

 关键点的精确定位

消除边界响应

 特征点的主方向

 生成特征描述

​编辑

 特征向量生成

 opencv中sift函数的使用


图像尺寸空间

在一定的范围内,无论物体是大还是小,人眼都可以分辨出来,然而计算机要有相同的能力却很难,所以要让机器能够对物体在不同尺度下有一个统一的认识,就需要考虑图像在不同的尺度下都存在的特点。

尺度空间的获得一般通过高斯模糊来实现

图像特征-sift(scale invariant feature transform)_第1张图片

 的不同的高斯函数决定了对图像的平滑程度,越大的值对应图像越模糊.

为方差-表示变化程度多分辨金字塔

图像特征-sift(scale invariant feature transform)_第2张图片

 多分辨金字塔

 图像特征-sift(scale invariant feature transform)_第3张图片

 高斯差分金字塔(DOG)图像特征-sift(scale invariant feature transform)_第4张图片

 

 DOG空间极值检测

为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当期大于(或者小于)所有相邻点时,该点就是极值点。如下图所示,中间的检测点要和其所在图像的3*3邻域8个像素点,以及其相邻的上下两层的3*3邻域18个像素点,共26个像素点进行比较。

 第一层和最后一层不能作比较

图像特征-sift(scale invariant feature transform)_第5张图片

 关键点的精确定位

 这些候选关键点是DOG空间的局部极值点,而且这些极值点均为离散的点,精确定位极值点的一种方法是:对尺度空间DOG函数进行曲线拟合,计算其极值点,从而实现关键点的精确定位.

 图像特征-sift(scale invariant feature transform)_第6张图片图像特征-sift(scale invariant feature transform)_第7张图片

消除边界响应

 图像特征-sift(scale invariant feature transform)_第8张图片

 特征点的主方向

 图像特征-sift(scale invariant feature transform)_第9张图片

每个特征点可以得到三个信息,即位置、尺度和方向.具有多个方向的关键点可以被复制成多份,然后方向值分别赋给复制后的特征点,一个特征点就产生多个坐标、尺度等,但方向不同的特征点。

 生成特征描述

在完成关键点的梯度计算后,使用直方图统计领域内像素的梯度和方向。 

图像特征-sift(scale invariant feature transform)_第10张图片

 为了保证特征矢量的旋转不变性,要以特征点为中心,在领域内将坐标轴旋转\theta角度,即将坐标轴旋转为特征点的主方向。

 

图像特征-sift(scale invariant feature transform)_第11张图片

图像特征-sift(scale invariant feature transform)_第12张图片

 旋转之后的主方向为中心取8*8的窗口,求每个像素的梯度幅值和方向,箭头方向代表梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算,最后在每个4*4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一份种子点,即每个特征的由4个种子点组成,每个种子点有8个方向的向量信息。

 特征向量生成

 图像特征-sift(scale invariant feature transform)_第13张图片

 opencv中sift函数的使用

代码如下:

import cv2
import numpy as np


def cv_show(name, img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread('E:/anaconda3/picture/test_1.jpg')   #读取图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)    #灰度图
cv_show('gray',gray)

#得到特征点
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)   #关键点kp

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

cv2.imshow('drawKeypoints', img)
cv2.waitKey()
cv2.destroyAllWindows()

# 计算特征
kp, des = sift.compute(gray, kp)     #传入关键点是什么
print(np.array(kp).shape)
print(des.shape)      #每个关键点的维度
print(des[0])

输出结果:

图像特征-sift(scale invariant feature transform)_第14张图片

 

 

 

你可能感兴趣的:(计算机视觉,图像处理,人工智能)