1. sift = cv2.xfeatures2d.SIFT_create() 实例化

参数说明:sift为实例化的sift函数

2. kp = sift.detect(gray, None)  找出图像中的关键点

参数说明: kp表示生成的关键点,gray表示输入的灰度图,

3. ret = cv2.drawKeypoints(gray, kp, img) 在图中画出关键点

参数说明:gray表示输入图片, kp表示关键点,img表示输出的图片

4.kp, dst = sift.compute(kp) 计算关键点对应的sift特征向量

参数说明:kp表示输入的关键点,dst表示输出的sift特征向量,通常是128维的

第一步:进行高斯模糊,获得不同模糊度的图片

第二步:进行直接的降采样,获得多分辨的图片

第三步:将高斯模糊后的图片进行相减操作获得差分金字塔,使用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])

机器学习进阶-图像特征sift-SIFT特征点 1.cv2.xfeatures2d.SIFT_create(实例化sift) 2. sift.detect(找出关键点) 3.cv2.drawKeypoints(画出关键点) 4.sift.compute(根据关键点计算sift向量)的更多相关文章

  1. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..

    1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...

  2. 机器学习进阶-图像特征harris-角点检测 1.cv2.cornerHarris(进行角点检测)

    1.cv2.cornerHarris(gray, 2, 3, 0.04)  # 找出图像中的角点 参数说明:gray表示输入的灰度图,2表示进行角点移动的卷积框,3表示后续进行梯度计算的sobel算子 ...

  3. 机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

    1. cv2.matchTemplate(src, template, method)  # 用于进行模板匹配 参数说明: src目标图像, template模板,method使用什么指标做模板的匹配 ...

  4. 机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)

    1.cv2.erode(src, kernel, iteration) 参数说明:src表示的是输入图片,kernel表示的是方框的大小,iteration表示迭代的次数 腐蚀操作原理:存在一个ker ...

  5. 机器学习进阶-图像金字塔与轮廓检测-图像金字塔-(**高斯金字塔) 1.cv2.pyrDown(对图片做向下采样) 2.cv2.pyrUp(对图片做向上采样)

    1.cv2.pyrDown(src)  对图片做向下采样操作,通常也可以做模糊化处理 参数说明:src表示输入的图片 2.cv2.pyrUp(src) 对图片做向上采样操作 参数说明:src表示输入的 ...

  6. 机器学习进阶-图像形态学变化-礼帽与黑帽 1.cv2.TOPHAT(礼帽-原始图片-开运算后图片) 2.cv2.BLACKHAT(黑帽 闭运算-原始图片)

    1.op = cv2.TOPHAT  礼帽:原始图片-开运算后的图片 2. op=cv2.BLACKHAT 黑帽: 闭运算后的图片-原始图片 礼帽:表示的是原始图像-开运算(先腐蚀再膨胀)以后的图像 ...

  7. 机器学习进阶-图像形态学操作-梯度运算 cv2.GRADIENT(梯度运算-膨胀图像-腐蚀后的图像)

    1.op = cv2.GRADIENT 用于梯度运算-膨胀图像-腐蚀后的图像 梯度运算:表示的是将膨胀以后的图像 - 腐蚀后的图像,获得了最终的边缘轮廓 代码: 第一步:读取pie图片 第二步:进行腐 ...

  8. 机器学习进阶-图像形态学操作-膨胀操作 1.cv2.dilate(进行膨胀操作)

    1.cv2.dilate(src, kernel, iteration) 参数说明: src表示输入的图片, kernel表示方框的大小, iteration表示迭代的次数 膨胀操作原理:存在一个ke ...

  9. 机器学习进阶-图像基本操作-数值计算 1.cv2.add(将图片进行加和) 2.cv2.resize(图片的维度变换) 3.cv2.addWeighted(将图片按照公式进行重叠操作)

    1.cv2.add(dog_img, cat_img)  # 进行图片的加和 参数说明: cv2.add将两个图片进行加和,大于255的使用255计数 2.cv2.resize(img, (500, ...

随机推荐

  1. bzoj5019: [Snoi2017]遗失的答案

    Description 小皮球在计算出答案之后,买了一堆皮肤,他心里很开心,但是一不小心,就忘记自己买了哪些皮肤了.==|||万 幸的是,他还记得他把所有皮肤按照1-N来编号,他买来的那些皮肤的编号( ...

  2. bzoj4980: 第一题

    Description 神犇xzyo听说sl很弱,于是出了一题来虐一虐sl.一个长度为2n(可能有前缀0)的非负整数x是good的,当且仅当 存在两个长度为n(可能有前缀0)的非负整数a.b满足a+b ...

  3. Java学习——Applet菜单

    程序功能:在窗口中添加菜单栏,在菜单栏添加菜单项,并添加下拉菜单和 2 级菜单,通过选择菜单项可以执行不同操作,生成如下图所示窗口. package cys; import java.awt.*; i ...

  4. Java-Runoob-高级教程-实例-方法:10. Java 实例 – 标签(Label)

    ylbtech-Java-Runoob-高级教程-实例-方法:10. Java 实例 – 标签(Label) 1.返回顶部 1. Java 实例 - 标签(Label)  Java 实例 Java 中 ...

  5. 保持url唯一性 解决多个网站首页问题

    原文地址:http://www.seowhy.com/bbs/thread-2694339-1-1.html 在网站SEO优化过程中,经常会遇到这样或者那样的常见技术型问题,达闻现将此类常见技术问题总 ...

  6. jQuery的遍历

    jQuery有众多的方法,但是有些方法过于累赘,所以就精简了一些重要的方法,记住这些方法的(名字,功能,参数) jQuery的遍历 1.add() 将元素添加到集合中 2.children() 返回被 ...

  7. 1136 A Delayed Palindrome (20 分)

    Consider a positive integer N written in standard notation with k+1 digits a​i​​ as a​k​​⋯a​1​​a​0​​ ...

  8. Android 通过联系人姓名查询联系人号码

    <!-- 读联系人权限 --><uses-permission android:name="android.permission.READ_CONTACTS" / ...

  9. MySQL数据库order by 奇慢无比

    今天遇到个奇葩的问题, sql 数据量很大 有where 和order by,不加order by 速度很快,加了就很慢 一.首先我们对这条sql执行查询计划: explain select t.or ...

  10. SAS FORMAT 逻辑库存储 【输出格式 没有找到或无法加载】解决方法

    SAS FORMAT 逻辑库存储 [输出格式  没有找到或无法加载]解决方法:需要指定FORMAT 搜索的路径:OPTIONS FMTSEARCH=(F WORK); 以下为完整示例代码: 00@DA ...