1. sift = cv2.xfeatures2d.SIFT_create() 实例化函数
参数说明:sift为实例化的sift函数spa
2. kp = sift.detect(gray, None) 找出图像中的关键点3d
参数说明: kp表示生成的关键点,gray表示输入的灰度图,code
3. ret = cv2.drawKeypoints(gray, kp, img) 在图中画出关键点blog
参数说明:gray表示输入图片, kp表示关键点,img表示输出的图片图片
4.kp, dst = sift.compute(kp) 计算关键点对应的sift特征向量it
参数说明:kp表示输入的关键点,dst表示输出的sift特征向量,一般是128维的class
第一步:进行高斯模糊,得到不一样模糊度的图片test
第二步:进行直接的降采样,得到多分辨的图片import
第三步:将高斯模糊后的图片进行相减操做得到差分金字塔,使用DOC公式
第四步:对差分金字塔进行上下金字塔的比较,得到极值点
第五步:使用泰勒展开式,得到精确的极值点
第六步:使用herrian公式,经过特征向量变化,比较λ1和λ2的大小,用于消除边界点
第七步:使用sobel算子,计算特征点的梯度大小和梯度方向
第八步:统计特征点临近位置的梯度方向,作出直方图,求出特征点的主要方向
第九步:对应于特征的主要方向,进行旋转,保持特征点大小的方向不变性
第十步:对领域的特征点进行统计,按照4*4的数目,每一个区域生成8个方向,即每一个方向的出现的次数做为特征,通常使用16个区域,即16*8= 128个特征
shift特征点:用来进行侦查和描述图片的特征,它在空间尺度中寻找极值点,并提取位置,尺度(梯度大小),旋转不变量(方向)
流程:
第一步:先对图像进行高斯模糊,得到5-6张的模糊后的图片,高斯方程为G(x, y, σ) = 1/(2pi*σ^2) * e^-(x^2+y^2)/2σ^2,σ越大,高斯模糊的程度就越高
这里的G(x, y, σ)方程存在一些错误
这是高斯模糊后的图片
第二步:构造多分辨金字塔,多分辨金字塔的构造直接使用降采样不须要模糊的操做,这里能够使用平均降采样
第三步:构造高斯差分金字塔, 图中的每组5张图片为原始图片通过不一样σ高斯参数模糊后得到的图。将5张图进行上下的相减操做,得到右边的差分图
下面这个式子表示的是高斯差分金字塔,即不一样的高斯项进行相减,最后*I(x, y)表示差分金字塔的大小值
第四步:对得到的高斯差分金字塔,查找极值点, 对于一个点是不是极值点,将其上面一幅图对应的9个点+下面一幅图对应的9个点,加上该点周围的8的点,判断这个点是不是极值点
第五步:若是是极值点,即为关键点,这里咱们对关键点作一个精确的定位,这里使用泰勒公式进行展开
D(x) = D + ∂ D^T / ∂x * x + 1/2 * x^T * ∂D^2 / ∂^X^2 * x x表示的是x轴上的偏移量,对x进行求导等于0,解得最终的结果代回D(x),D(x)为最终的极值点
该图使用简化的泰勒展开式,求解0这一点的近似值
最下面的D(x, y, z) 为泰勒的二阶展开式
将上述进行简单表示,这就是偏移的D(x), 即得到实际的极值点
第六步:消除边界效应
使用harris角点检测的原理, 求出H(x, y) 即构造的梯度变化矩阵,求解λ1和λ2, 若是λ1>>λ2则表示为边界点,进行去除
第七步:使用sobel算子,每一个特征点获得三个信息,得到位置, 计算梯度的大小,以及梯度的方向
第八步:统计相邻部分的梯度的方向,画出直方图,把直方图中出现次数最多的做为主方向,若是次方向的次数大于主方向的0.8,那么次方向也是辅助方向
第九步:将梯度的方向进行按照原来的方向进行旋转,以保证梯度旋转的不变性
第十步:对特征点进行领域的位置统计,来生成sift特征向量, 对于左边的那个图,从4*4个领域中统计八个方向,所以有4*8个sift,右边有16个即16*8=128个特征向量
代码:
第一步:读入图片
第二步:进行灰度化
第三步:使用cv2.xfeatures2d.SIFT_create() 实例化sift函数
第四步:使用sift.detect(gray, None) 生成关键点
第五步:使用cv2.drawKeypoints 进行画图操做
第六步:使用sift.compute(kp) 求得关键点对应的128个特征向量
import numpy as np import cv2 img = cv2.imread('test_1.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) sift = cv2.xfeatures2d.SIFT_create() # 找出关键点 kp = sift.detect(gray, None) # 对关键点进行绘图 ret = cv2.drawKeypoints(gray, kp, img) cv2.imshow('ret', ret) cv2.waitKey(0) cv2.destroyAllWindows() # 使用关键点找出sift特征向量 kp, des = sift.compute(gray, kp) print(np.shape(kp)) print(np.shape(des)) print(des[0])