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. bzoj5011: [Jx2017]颜色

    Description 可怜有一个长度为n的正整数序列Ai,其中相同的正整数代表着相同的颜色. 现在可怜觉得这个序列太长了,于是她决定选择一些颜色把这些颜色的所有位置都删去. 删除颜色i可以定义为把所 ...

  2. [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列

    为easyui的datagrid.treegrid增加表头菜单,用于显示或隐藏列 /** * @author 孙宇 * * @requires jQuery,EasyUI * * 为datagrid. ...

  3. Hive之示例一:基本操作与案例

    1. 创建数据库,切换数据库 create database testdb; use testdb; 2. 创建管理表 create table emp( empno int, empname str ...

  4. YAML配置,spring boot 配置文件

    1 概念YAML是一种人们可以轻松阅读的数据序列化格式,并且它非常适合对动态编程语言中使用的数据类型进行编码.YAML是YAML Ain't Markup Language简写,和GNU(" ...

  5. meta 标签禁止缩放失效

    之前我们能通过设置meta来禁止用户缩放页面 <meta content="width=device-width, initial-scale=1.0, maximum-scale=1 ...

  6. [UE4]HorizontalBox,整体向右对齐

  7. SCCM 2012 R2实战系列之一:SQL安装

    大家好,从今天开始跟大家一起分享自己学习SCCM 2012 R2的一些心得和具体的部署配置,希望能帮到大家.由于SCCM部署的步骤比较复杂,内容也比较多,所以我把SCCM整个部署过程分为以下三个章节: ...

  8. PLMN概念和应用设置

    PLMN概念和应用设置   1 PLMN概念 PLMN: PLMN(Public Land Mobile Network,公共陆地移动网络) 该网路必须与公众交换电话网(PSTN)互连,形成整个地区或 ...

  9. tp3.2分页

    tp3.2分页 使用tp3.2自带的分页类 <?php // +----------------------------------------------------------------- ...

  10. 限制EditText最多输入n位,设置EditText最大输入长度;

    1.比较笨的方法: /** * 设置edittext最大的输入限制 * @param editText * @param length */ private void setMaxLength(Edi ...