SIFT讲解(SIFT的特征点选取以及描述是重点)

目录

    • SIFT是什么?
    • 尺度空间理论
    • SIFT特征点提取
    • SIFT特征点描述

SIFT是什么?

SIFT ,即尺度不变特征变换( Scale-invariant feature transform,SIFT) ,一种特征描述方法。具有
尺度鲁棒性
旋转鲁棒性
光照鲁棒性

SIFT本身包括了特征点筛选及特征点描述的步骤。

尺度空间理论

尺度空间
效果
SIFT的特征点筛选目的:寻找在不同尺度空间下的极值点,保证这些特征点在放大或者缩小的条件下均存在。
(这一特点与Harris检测特征点比较的话发现,Harris对尺度变换的鲁棒性较差)
SIFT的特征点筛选方法:DoG近似LoG。
LoG(Laplacian of Gaussian) :使用不同sigma获得不同的尺度空间图像,然后通过Laplacian算子获得极值。这一运算过程可以用DoG(Difference-of-Gaussian)近似。拉普拉斯其实就是二阶导数,产生的零交叉点就是我们所要获取的极值。
关于LoG与DoG的更多知识可以转到:图像分割-LOG检测器和DOG检测器
DoG步骤:
DoG步骤
得到的结果与LoG结果非常相似,在DoG结果图中,我们用亮度表达差分值的大小。在纹理比较丰富、边缘区域具有比较大的值。
理解:高斯卷积核其实是一种加权的平均。在灰度变化不剧烈的地区,一个像素值的大小和周围像素值得大小基本相等,所以不管加权的参数是哪样,得到的加权结果其实是相似的,所以做差分之后这种区域的差分值会很小。灰度变化剧烈的地区则反之,差分值会很大。

SIFT特征点提取

在SIFT特征点选取中所用到的DoG:
DOG
这时候就出现了一个问题:随着sigma的增加,它需要更大的高斯窗口进行平滑模糊处理。(sigma越大高斯函数越扁平)会使无法处理的区域增加,同时计算量增加。在空间滤波中我们学习到,3* 3模板进行卷积时对图像最外一层像素是无法处理的,5*5是周围两层像素。
解决方法:图像金字塔,回顾知识:Opencv——图像金字塔与图像尺寸缩放
图像金字塔
当k增加到2时,我们将图像缩小为1/2尺寸,这叫降采样。再使用sigma0的模板处理。我们发现,图像缩小了二分之一,而sigma却没有改变。重复该操作,进行降采样。同一个Octave的图像具有相同的尺寸。
在图像金字塔处理之后,我们将就是检测DoG极值了。
描述
关于获取一个octave的图像的详细过程可以参考文章最末的原理讲解,那个是十分详细的。
这样得出来的极值的性质如何?
极值性质
当然这些得到的极值点是候选点。在得到候选点之后就要对候选点的特征进行描述,以达到匹配的目的。

SIFT特征点描述

使用梯度值对特征点进行表述,计算像素的梯度值和梯度方向。相对像素的亮度值,梯度对光照具有更好的鲁棒性。
当图像处于一个刚体状态时(没有剧烈形变),某像素与它周围像素的关系应该是近乎恒定的。对一个区域进行描述的话得到的描述子将更加稳定。
我们先假设一个候选点:
候选点
然后计算它周围一定区域的梯度值,比如8*8区域。
梯度值
1、将得到的角度值进行36等分。
2、在特征点对应的尺度空间计算梯度值。
3、利用高斯核对梯度进行计算权重。
也就是说该像素周围像素的权重由两个值决定:一个是本身梯度大小、第二个是离考察像素点的距离。
取决因素
建立一个36维的直方图,每次累加的值就是它的权重
直方图
其实到了这一步已经可以很好地描述了。
但是注意,此刻的角度计算得到的是一个绝对角度,是与水平方向成的角度。当图像旋转后显然这种描述方法就有问题了。
解决方法:获取一个具有代表性的方向作为主方向。通常选择梯度值最大的那个角度分量作为主方向,获得更具有旋转鲁棒性的描述方法。
主方向
主方向
选择完主方向后,将周围图像以主方向计算相对角度。这样就算图像进行旋转,主方向也会进行旋转,相对角度保持相对恒定状态。
代码实现可以参考第二个链接。
要是想要调用Opencv库函数,则要参考毛星云的《Opencv3编程入门的》417页,
我在我的Opencv安装包中没有找到这个nonfree文件夹,以后再解决这个问题。网上大部分调库代码也需要一些自己添加库。
在这里插入图片描述
参考链接:

SIFT算法详解
基于C++和OpenCv的SIFT_图像局部特征检测算法代码的实现
《数字图像处理PPT.李竹版》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统多线程实现_操作系统中的线程实现

操作系统多线程实现Each process has an address space. There is one thread of control in every traditional OS. Sometimes, it is viable to have multiple threads of control in the similar address space which is running in quasi-parallel. Though they were separ…

mysql怎么消除冗余,mysql剔除冗余数据

mysql删除冗余数据-- -- 1. 查询冗余数据SELECT t.id FROM t_lifeservice_orders t WHERE t.orderStatus 2 GROUP BY t.channelCode, t.orderNum, t.orderStatus HAVING COUNT(t.orderStatus) > 1;-- -- 2. 定义删除冗余数据存储过程DROP PROCEDURE IF EXISTS proc_delete_…

04-图像的形状绘制

一、线段绘制 cv2.line(dst,(100,100),(400,400),(0,0,255),2,cv2.LINE_AA) 参数一:目标图片数据 参数二:当前线段绘制的起始位置(也就是两点确定一条直线) 参数三:当前线段绘制的终止位置(也就是两点确定…

(1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的证明过程

问题出现:《数字信号处理第三版》第90页刘顺兰版 最后一步怎么得到的? 思路:观察答案,有一个自然对数项。关键就是如何提取出这一项。 我的证明过程如下: 参考链接: 【和差化积】

php 移植 arm 精简,php5.4.5移植到arm-linux摘要,lighttpd配置

php5.4.5移植到arm-linux摘要.因为有嵌入WEB服务的需求,再常识了N多的开源的嵌入服务后最终选择了lighttpd.Apache太大支了,而且在arm上对swf的支持不好.其他的都不怎么理想.lighttpd的移植过程就省略了。这里只摘要了PHP移植,采用fastcgi与lighttpd 协作…

05-图像的美化

一、彩色图片直方图 cv2.calcHist([image],[0],None,[256],[0.0,255.0]) 该方法的所有参数都必须用中括号括起来!!! 参数一:传入的图片数据 参数二:用于计算直方图的通道,这里使用的是灰度直方图&#xff…

java 检查目录是否存在_如何检查Java目录是否存在?

java 检查目录是否存在We are using the File class that is an abstract representation of file and directory path. To check if a directory exists we have to follow a few steps: 我们正在使用File类 ,它是文件和目录路径的抽象表示。 要检查目录是否存在&a…

Eclipse for android 中设置java和xml代码提示功能(转)

1、设置 java 文件的代码提示功能 打开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist > Auto activation triggers for Java ,设置框中默认是一个点, 现在将它改为: 以下为引用内容: .a…

MySQL 定时器EVENT学习

MySQL 定时器EVENT学习 MySQL从5.1开始支持event功能,类似oracle的job功能。有了这个功能之后我们就可以让MySQL自动的执行数据汇总等功能,不用像以前需要操作的支持了。如linux crontab功能 。 创建测试表CREATE TABLE t( v VARCHAR(100) NOT NULL…

如何利用FFT(基2时间以及基2频率)信号流图求序列的DFT

直接用两个例子作为模板说明: 利用基2时间抽取的FFT流图计算序列的DFT 1、按照序列x[k]序号的偶奇分解为x[k]和x2[k],即x1[k]{1,1,2,1}, x2[k]{-1,-1,1,2} 2、画出信号流图并同时进行计算 计算的时候需要参考基本蝶形单元: 关键在于 (WN) k…

matlab4.0,matlab 4.0

4.1fort-9:0.5:9if(t>0)y-(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);elsey(3*t^2)5;fprintf(y%.2ft%.2f\n,y,t);endend编译结果:y248.00t-9.00y221.75t-8.50y197.00t-8.00y173.75t-7.50y152.00t-7.00y131.75t-6.50y113.00t-6.00y95.75t-5.50y80.00t-5.00y65.75t-4.50y…

图形学 射线相交算法_计算机图形学中的阴极射线管

图形学 射线相交算法阴极射线管 (Cathode Ray Tube) Ferdinand Barun of Strasbourg developed the cathode ray tube in the year 1897. It used as an oscilloscope to view and measure some electrical signals. But several other technologies exist and solid state mov…

Constructor总结

一个类如果没有构造那么系统为我们在背后创建一个0参数的构造,但是一旦我们创建了但参数的构造,那么默认的构造就没了。 View Code 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace Console…

Python连接MySQL及一系列相关操作

一、首先需要安装包pymysql(python3所对应) 我使用的是Anaconda全家桶,打开cmd,进入Anaconda下的Scripts文件夹下输入命令:pip install pymysql进行下载安装 二、我使用的编译器为Anaconda所带的Jupyter Notebook 1,在mysql中…

微机原理—可编程计数器/定时器8253概念详解

目录前言【1】定时处理方法1、定时的方法:2、定时和计数器【2】8253计数/定时器1、特点:2、芯片引脚以及电路:3、连接方式:4、工作原理:5、寄存器配置a、初始化操作(三个通道单独初始化)b、读出…

php静态分析工具window,window_SpeedPHP框架核心调试工具,在日常的编程开发当中,开发 - phpStudy...

SpeedPHP框架核心调试工具在日常的编程开发当中,开发者经常会使用到对变量的调试,而sp框架提供的变量调试输出函数——dump正好满足了变量调试的需求。下面来介绍一下dump函数的使用方法。dump —— 变量格式化输出函数用法:dump($vars, $out…

python 温度转换程序_Python程序将米转换为码

python 温度转换程序There are many problems where we have to calculate the distance in yards at the end but initially, the measurements are given in meters. So for such type of problems, the solution is converting the initial parameters into yards and then …

Oracle转Sqlserver 记录

使用了微软的SSMA帮忙,但是目前只有表能帮忙转,其他的还是要手动改,- - oracle 可以这样查询AppServiceInfoaspdb ,调用其他库的表。SQL是: aspdb.dob.AppServiceInfo si数据库需要和 aspdb ASPDB_Capacity 在siinf…

形参与实参在函数中的传递

#include <iostream> #include <cstring> using namespace std; void myFun(int a[]); int main() {int a[10];cout<<"aaa"<<sizeof(a)<<endl;//40 int为4&#xff0c;a为10个int&#xff0c;故为40cout<<"yy"<<…

带你走进缓存世界

我们搞程序的多多少少都了解点算法。总体来讲&#xff0c;算法是什么&#xff1f;算法就是“时间”和“空间”的互换策略。我们常常考究一个算法的时间复杂度或空间复杂度&#xff0c;如果我们有绝对足够的时间或空间&#xff0c;那么算法就不需要了&#xff0c;可惜这种条件是…