SIFT提取特征
SIFT特征提取:
角点检测:
Morvavec角点检测算子:基于灰度方差的角点检测方法,该算子计算图像中某个像素点沿水平、垂直方向上的灰度差异,以确定角点位置
Harris角点检测算子:不止考察水平,垂直4个方向上的灰度差异,而是考察了所有方向上的灰度差异,并且具有旋转不变性和部分放射变换的稳定性。
Shi-Tomasi角点检测算子:通过考察自相关矩阵M的两个特征值中的较小者来确定角点,大部分情况下,有比Harris更好的检测效果。
FAST算子:通过考察像素点与其邻域内16个像素点的差异来确定特征点(角点),并且通过分割测试算法对检测效率做了极大的提升。
SIFT算子(Scale Invariant Feature Transform):尺度不变特征变换(尺度不变:按比例缩放)
基于尺度空间的,对图像缩放,旋转,甚至仿射变换保持不变性的图像局部特征描述算子。SIFT提取图像的局部特征,在尺度空间中寻找极值点,并提取出其位置,尺度,方向信息。
算法实质:在不同的尺度空间中查找关键点(特征点),计算关键点的大小,方向,尺度信息,利用这些这些信息组成关键点对特征点进行描述,sift所查找的关键点都是十分突出,不会因为光照,仿射和噪声等因素而变换的稳定的特征点。匹配的过程就是匹配关键点(特征点)的过程。流程如下:

参考博客:https://blog.csdn.net/hxg2006/article/details/80398701
Dense-SIFT
图像识别问题之所以采用密集采样,是因为密集采样后的点,会通过训练后的分类器进行进一步的筛选。在研究目标图像表示或者理解时,dense sift 更好,因为即使密集采样的区域不能够被准确匹配,这块区域也包含了表达图像内容的信息。
sif提取特征
输入:一张图像,设置的长宽的最大值
每次移动长度的参数
1.图像转换为double类型,如果为rgb,先转成灰度图像,再转换为double类型,否则直接转为double类型
2.读取图像的长宽,是否大于输入的图像的最大值,如果大于,则按比例缩小图像
I = imresize(I, maxImSize/max(im_h, im_w), 'bicubic');
[im_h, im_w] = size(I);
3.使用稠密sift提取特征
1)将三维转换成两维:i=mean(i,3)
2)归一化:i=i /max(i(:)) max(i(:))所有点的最大值
3)在0到2π之间截取16段,每一段长度:angle_step = 2 * pi / num_angles
angle_step = 2 * pi / num_angles;
angles = 0:angle_step:2*pi;
angles(num_angles+1) = []; % bin centers
4)生成高斯低通滤波器
f_wid = 4 * ceil(sigma) + 1; % ceil:向上取整
G = fspecial('gaussian', f_wid, sigma);G是5×5大小的矩阵
[GX,GY] = gradient(G);求梯度
GX = GX * 2 ./ sum(sum(abs(GX)));%2与矩阵中对应元素相除
GY = GY * 2 ./ sum(sum(abs(GY)));%得到了GX,GY,分别为5×5的
5)根据滤波器GX,GY,在水平方向和垂直方向对图像I进行滤波(滤波之后和原来图像大小相同)
https://blog.csdn.net/sxj0820/article/details/79883233(filter2方法讲解)
I_X = filter2(G_X, I, 'same'); % vertical edges
I_Y = filter2(G_Y, I, 'same'); % horizontal edges
计算反正切
I_theta = atan2(I_Y,I_X);
去除I_theta中不是数据的情况 I_theta(find(isnan(I_theta)))=0
6)计算网格:
采样的图像块,64×64
移动16个像素
网格大小27×37
收集的块个数:999个
grid_x = patch_size/2:grid_spacing:wid-patch_size/2+1;(37)
grid_y = patch_size/2:grid_spacing:hgt-patch_size/2+1;(27)
7)计算方向图片
计算每一个方向通道
% compute each orientation channel
tmp = (cosI*cos(angles(a))+sinI*sin(angles(a))).^alpha;
tmp = tmp .* (tmp > 0);
% weight by magnitude
I_orientation(:,:,a) = tmp .* I_mag;
% Outputs:
[grid_x,grid_y] = meshgrid(grid_x, grid_y);
[nrows, ncols, cols] = size(sift_arr);
规范化sift描述符
sift_arr = reshape(sift_arr, [nrows*ncols num_angles*num_bins*num_bins]);
sift_arr = normalize_sift(sift_arr);
sift_arr = sift_arr';
SIFT提取特征的更多相关文章
- Sift算子特征点提取、描述及匹配全流程解析
Sift之前的江湖 在Sift横空出世之前,特征点检测与匹配江湖上占据霸主地位的是角点检测家族.先来探究一下角点家族不为人知的恩怨情仇. 角点家族的族长是Moravec在1977年提出的Moravec ...
- 利用SIFT进行特征匹配
SIFT算法是一种基于尺度空间的算法.利用SIFT提取出的特征点对旋转.尺度变化.亮度变化具有不变性,对视角变化.仿射变换.噪声也有一定的稳定性. SIFT实现特征的匹配主要包括四个步骤: 提取特征点 ...
- 卷积神经网络提取特征并用于SVM
模式识别课程的一次作业.其目标是对UCI的手写数字数据集进行识别,样本数量大约是1600个.图片大小为16x16.要求必须使用SVM作为二分类的分类器. 本文重点是如何使用卷积神经网络(CNN)来提取 ...
- SLAM算法中提取特征总结
我们要知道三维空间中的点在图像中的位置,就需要提取特征与特征匹配了. 1.检测特征点 2.计算描述子 3.特征匹配 1.检测特征点 我们用到的检测特征点的方法是FAST算法,最大的特点就是快! 算法原 ...
- One-hot 编码/TF-IDF 值来提取特征,LAD/梯度下降法(Gradient Descent),Sigmoid
1. 多值无序类数据的特征提取: 多值无序类问题(One-hot 编码)把“耐克”编码为[0,1,0],其中“1”代表了“耐克”的中 间位置,而且是唯一标识.同理我们可以把“中国”标识为[1,0],把 ...
- sift算法特征点如何匹配?
https://www.zhihu.com/question/23371175 我需要把一张照片和训练集中的图片进行匹配.我把一张照片提取特征值并建立kd树,然后把训练集的图片依次读进来,然后把图片的 ...
- OpenCV-Python sift/surf特征匹配与显示
import cv2 import numpy as np def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch): h1, w1 ...
- 使用DeepWalk从图中提取特征
目录 数据的图示 不同类型的基于图的特征 节点属性 局部结构特征 节点嵌入 DeepWalk简介 在Python中实施DeepWalk以查找相似的Wikipedia页面 数据的图示 当你想到" ...
- shingling算法——提取特征,m个hash函数做指纹计算,针对特征hash后变成m维向量,最后利用union-find算法计算相似性
shingling算法用于计算两个文档的相似度,例如,用于网页去重.维基百科对w-shingling的定义如下: In natural language processing a w-shinglin ...
随机推荐
- datatable转layui表格v2[分页and带模板]【偏实例】
本项目由普通mvc+webapi接口构成.按执行顺序,代码如下:主控制器:public ActionResult Index(int id=0) { ViewData["myid" ...
- Spring Boot @EnableAutoConfiguration解析
刚做后端开发的时候,最早接触的是基础的spring,为了引用二方包提供bean,还需要在xml中增加对应的包<context:component-scan base-package=" ...
- JavaScript 数据类型转换表
下表显示了将不同的JavaScript值转换为Number,String和Boolean的结果: 原始值 转换为Number 转换为String 转换为Boolean false 0 "fa ...
- mongoose模糊查询
注:nodejs服务器时候遇到了这样一个bug,就是mongoose模糊查询时候,我需要查询的数据时自定义id_(number类型)以及用户名(string类型). bug如下: nodejs服务器报 ...
- Struts2 OGNL表达式、ValueStack
OGNL简介 OGNL,即Object-Graph Navigation Language,对象视图导航语言,是一种数据访问语言,比EL表达式更加强大: EL只能从11个内置对象中取值,且只能获取属性 ...
- SQL的简单函数(极客时间)
SQL的函数 函数就是将我们经常使用的代码封装起来, 需要的时候直接调用, 提高代码效率和可维护性. SQL函数一般是在数据上执行, 可以方便地转换和处理数据. 常用的SQL函数 SQL提供了一些常用 ...
- 1.说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程?
作者:中华石杉 面试题 说一下的 dubbo 的工作原理?注册中心挂了可以继续通信吗?说说一次 rpc 请求的流程? 面试官心理分析 MQ.ES.Redis.Dubbo,上来先问你一些思考性的问题.原 ...
- netcore2.2以及netcore3.0下的swagger使用
自从core3.0发布后,中间有很多东西跟以往用到的2.2版本相差特别多,今天主要来说一下swagger不同版本下的使用. swagger就是一个可视化接口工具,为了方便让调用者能够很好的了解接口以及 ...
- 获取List<object>中对象的属性值
List<object> ls = new List<object>(); ls.Add(,name="sqm"}); ls.Add(,name=" ...
- 更换Ubuntu软件源
对于Ubuntu系统, 不同的版本的源都不一样,每一个版本都有自己专属的源. 而对于 Ubuntu 的同一个发行版本,它的源又分布在全球范围内的服务器上.Ubuntu 默认使用的官方源的服务器在欧洲, ...