学习SIFT算法过程中的释疑

SIFT第四步:消除边界和低对比度的特征 Key points generated in the previous step produce a lot of key points. Some of them lie along an edge, or they don’t have enough contrast. In both cases, they are not useful as features. So we get rid of them. The approach is similar to the one used in the 阅读详情

介绍SIFT算法的文章

David G. Lowe, "Distinctive image features from scale-invariant keypoints,"International Journal of Computer Vision, 60, 2 (2004), pp. 91-110

文章一开始就给出了sift特征的关键步骤:

1. 利用尺度空间,检测极值点

2. 对极值点(关键点)精确定位,以及剔除一些不好的特征点

3. 对关键点生成方向参数

4. 生成关键点的特征描述符


一开始接触SIFT算法,在这些步骤中,还有很多不理解的地方,看了原文和一些blog,才有点感觉,这里总结下这个过程中的疑问和答案。


1. 一些基本概念

2. 为什么是DOG算子,Gaussian算子,为什么不是LOG算子? 

3. 为什么原图像有时长宽扩大一倍?为什么需要高斯金字塔的降采样,形成octave的形式?

4. 多尺度是指哪些?

5. 什么是octave?

6. 空间尺度的连续性怎么理解?

7. 对旋转不变性、亮度变化不变性体现在什么地方?


参考的一些blog,写的真不错:

http://blog.youkuaiyun.com/sunminmin2011/article/details/8130090

http://wenku.baidu.com/view/dc5fffec102de2bd9605886e.html

http://www.360doc.com/content/11/1230/23/3054335_176200661.shtml

http://blog.youkuaiyun.com/abcjennifer/article/details/7639681

有关特征的一些概念:

图像的变化形式: 旋转、尺度变换、仿射变换、视角变换、光照变化等。

不变量:     同一场景下,图像有些变化,但图像中仍有保持稳定不变的特征,对这些特征的描述,就称为不变量

尺度不变量: 图像尺度有变化时,那些不变的特征就称为尺度不变量

旋转不变量: 图像旋转时,那些不变的特征就称为旋转不变量

常用的图像特征: 角点(局部极值点)、边缘、轮廓

稳定的特征向量: 将多种特征组合、变换,形成稳定的特征向量,即不受图像尺度、旋转等变换的影响。

多尺度下的极值点:一般来说,测试一点是否是极值点,就是比较此点与周围的点,当此点比周围的点都大时,其就是极值点;但多尺度下的极值点,不仅要求此点在原图上是极值点,还要求其比其他尺度空间的同范围的点值都大。这个性质就是尺度不变量,这个是定义。

特征描述子(符):拿到特征点后,利用特征点及其邻域的信息,如梯度等,转化为一个数值向量,最好与特征点的位置,scale等空间特征无关。这个数值向量形成了特征空间。无论特征点的空间位置及其他环境如何变化,特征空间对其的描述表示,保持稳定。

-------------------

1. 基础知识:尺度空间理解

一般的尺度变换理解:

尺度,首先从信号处理来理解这个概念,对信号的尺度变换,就对信号进行缩放,比如对时域扩展,频域就收缩 !!!-_-, 要复习信号的一些知识。

对图像的尺度变换的形式: 一种就是将图像直接缩放成不同的大小。常见金字塔抽样,就是这种尺度变换的一种。

其他尺度变换的形式:

高斯尺度变换

小波变换

以及更泛化的 多分辨率尺度变换

http://blog.youkuaiyun.com/tanxinwhu/article/details/7048370 尺度空间理解介绍


2. 为什么是DOG算子,Gaussian算子,为什么不是LOG算子? 

DOG/LOG算子就是借助高斯尺度变换的特征。确切的说应该是LOG特征,Mikolajczyk发现LOG的极值点(极大值和极小值)比梯度(一阶导数),Hessian(二阶导数矩阵),及harris角点具有更稳定的特征。而DOG具有近似LOG的性质,且比LOG的运算效率更高。

Gaussian滤波器,压制高频信息,而DOG算子在Gaussian滤波器压制高频的基础上,又压制了低频的区域,形成一个带通滤波器。带通,指指定频带通过,在空域上,表现为指定尺度的细节图像保留下来。这个要比普通的高频锐化算法 检测细节的效果好,因为高频锐化不仅增强了细节,还增强了高频噪声。图像增强时,DOG算法中两个高斯核的半径之比通常为4:1或5:1。

    DOG算子如何简化计算?

    而与LOG算子比较,DOG算子其尺度变化更自由,当高斯核半径比为1:1.6时,才是LOG算子的近似。

    DOG算子具有LOG归一化的近似的性质,计算更方便、速度更快,所以采用DOG算子。


3. 为什么原图像有时长宽扩大一倍?

有时采用双线性插值扩大一倍,目的同高斯金字塔降采样一样,是为了scale上扩大采集特征点的范围,以实用多尺度scale的匹配


有了高斯尺度空间,大的标准差对应图像概貌,提取云朵之类的低频特征比较丰富的特征点,小的标准差对应图像细节,提取高频细节比较丰富的特征点,为什么还需要高斯金字塔的降采样,形成octave的形式?

应该是为了达到图像匹配时,有尺度缩放不变性的能力。形成了关键点的坐标(scale, x, y)三维空间的形式。尺度不变性,其实就是具有提取多尺度的特征,以适应各种尺度的场景。


4. 多尺度是指哪些?

1. 高斯系数的变化:  在图像大小不变的情况下,改变高斯函数标准差的大小,其比例系数1, k, k^2,... , k^n

2. 空间分辨率的变化: 金字塔式抽样,改变图像大小,对图像进行间隔抽样,或者双线性插值抽样。

如下图:



5. 什么是octave?

octave不一定就是高斯系数变化从1到 K^7,得到八个图像,一般不需要这么多,3-5个处理层次就可以了。每一级空间抽样(空间分辨率变化)都会有自己独立的octave高斯尺度处理。这样原文里的scale图示就比较好理解了。



6. 空间尺度的连续性怎么理解?

每相邻两个octave之间的序列 高斯函数有一定联系。

如octave1,其序列高斯函数为 1, k, k^2,... , k^n, octave2 高斯序列函数为 2*1,2 * k, 2 * k^2,... ,2 * k^n.

由于取k = 2^(1/s), octave1中第s层的高斯函数,就等于octave2中的第一层的高斯函数。从这个层面上,高斯空间尺度就连起来了。

其好处是什么? 应该是针对特征点的选取,尺度空间连续,那么如特征点的选取,在不同尺度就不会有遗漏。若值选取一个最大尺度,和一个最小尺度, 那么就只会选取出最大尺度的特征点,以及最细节的特征点,而中间尺度的细节特征点就没选取到,这就是尺度空间不连续造成的。个人理解。

而空间分辨率上,降采样还是要做的,即octave1与octave2即使部分序列的高斯函数一样,但其图像的大小还是不同的。


7. 对旋转不变性体现在什么地方?

特征点是依赖于位置信息的,所以也隐含着角度旋转的信息。要除去旋转角度信息的依赖性,就是设计一种旋转不变的特征描述子。

一般特征点附近的 梯度 方向,加上特征点的位置,尺度,都是特征点的信息。将这些信息转换为方向无关的信息。

计算特征点的方向,然后将坐标轴旋转为特征点的方向,这样就保证了以后的计算与方向无关了。

计算出这个特征点的16*16邻域的所有点的梯度和方向。再划分为4*4的小窗口,计算每个小窗口的8个主方向(将每个方向上的梯度值累加),形成4*4*8=128的描述子。文章里介绍的更清楚。


对亮度变化不变性体现在什么地方?

对上述描述子,进行归一化,这样就降低了亮度变化的不变性。


什么样的点是不好的特征点?为什么?

去除低对比度的关键点和不稳定的边缘响应点。

对于特征对比度,给定一个阈值,只有大于这个阈值才保留。

而对于边缘响应,通过hessien矩阵来计算其主曲率。将主曲率大的响应点去除。对于边缘响应点,其曲率也是比较大的。

SIFT简述——第一步,计算高斯差分金字塔 一、高斯差分金字塔 首先需要了解高斯模糊的概念, 阅读详情

相关推荐

Android Studio小白安装教程,以及第一个Android项目案例的调试运行

从小白的角度出发,兼顾安装细节,手把手教你安装Android Studio,并成功运行第一个Android项目

weiybin的博客 8600

Sift算法的6种版本源程序

压缩包内包括至少6个不同版本的Sift算法的源代码,我已成功调试并运行了其中三个版本的源代码:(1)siftC语言版本 vc6.0+opencv1.0下运行,(2)David Lowe版本,siftDemoV4 matlab下运行,(3)Vedaldi版本,matlab下运行。剩下的几个版本还没测试过。

Windows平台安卓逆向工程:从APK拆解到动态调试的完整工具链指南

安卓逆向工程是深入理解移动应用内部机制的关键技术,它通过静态与动态分析相结合的方法,揭示应用的代码逻辑、数据流和通信协议。其核心原理在于对APK文件进行解包、反编译和运行时监控,从而还原应用的设计思路与实现细节。这项技术的价值不仅在于安全评估和漏洞挖掘,也为开发者学习优秀架构、进行兼容性调试提供了独特视角。在应用场景上,它广泛用于移动安全研究、协议分析、恶意软件检测以及合法合规的第三方功能扩展。本文聚焦于Windows环境下的实战流程,详细解析了以Apktool、JADX和Frida为核心的工具链搭建与使用

889

PCL点云参数估计算法之RANSAC和LMEDS

RANSAC算法 RANSAC算法的输入是一组观测数据(往往含有较大的噪声或无效点),一个用于解释观测数据的参数化模型以及一些可信的参数。RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证: 有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。 用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是...

qq_29462849的博客 2374

flutter连接VScode和夜神模拟器 与连接android studio

android studio配置 1.去官方下载android studio,注意选择你所需要的系统下载 2.1下载之后一直next. 其中有一个创建捷径路径,点击下方的don,t create不创建, 继续next,其他的没什么重要的. 2.2, 有一项是选择编程语言(langage),会java选java,不会的选dart,两种差不多,dart学的简单一点 配置下载完成后让studio软件自己下载他所需要的sdk. 不要自己去官网下载sdk. 这坑我走过,东西太多了,配置一个又有下一个需要下载,头疼 以

qq_45073409的博客 2194

Android Studio SDK&Gradle&JDK等工具的正确使用

AS在安装使用过程中可能会占用C盘大量空间,对于C盘容量本来就小的人来说非常不友好,其实我们可以自定义安装路径。

安卓开发&音视频开发 6243

【图像算法】SIFT中LoG和DoG比较

转载自: 小魏的修行路 在实际计算时,三种方法计算的金字塔组数noctaves,尺度空间坐标σ,以及每组金字塔内的层数S是一样的。同时,假设图像为640*480的标准图像。金字塔层数: 其中o_min = 0,对于分辨率为640*480的图像N=5。每组金字塔内图像数: S=3,即在做极值检测时使用金子塔内中间3张图像。 对于LoG每组金字塔内有S+2张图像(S=-1,0,1,2,

This is MyC 2282

Android Studio 学习心得

总之,Android Studio 是一款非常强大的 Android 应用程序开发工具,需要我们通过不断学习和实践,不断提高自己的技能和能力。而在学习过程中也会不断的加强自身的编码能力和学习能力。注:部分内容与代码来源于优快云。

how_olad_are_you的博客 1355

Android Studio 2024:从零到一构建你的首个Android应用

本文为Android开发新手提供了使用Android Studio 2024从零开始构建首个应用的完整指南。内容涵盖环境准备、项目创建、代码与界面初识、模拟器配置及项目结构解析,并特别针对新手入门常见问题提供了实用的调试与避坑建议,帮助开发者顺利完成从安装到运行‘Hello World’应用的全过程。

weixin_28677451的博客 382

一次重拾Android Studio开发的经历

一次重拾Android Studio的开发经历 作为一个非专业码农,有时候必须要穿梭于不同的编程语言之间,近来再次编完单片机,又去编上位机!没有队友的时候只能自己上,也比有一堆猪队友强! 前言 正题 解决办法 前言 由于近来闲来无事,就打算搞搞事情,恰巧有个机会,有个同学的项目有进展,他们没有人会写Code,这事情只能落到我头上(这是个悲剧!)。其主要算是一个简单的小型化设备,用到...

Hold人民币的博客 1108

安卓开发心得+简易记账本

Android作为新兴的手机操作系统,适应潮流的发展,在一定程度上迎合了现代人们最求效率和最求完美的心态,再加上的它的先进之处,所以 Android 的发展很快,Android 的应用资源也越来越广泛,现在的 Android 正在快速形成一个只能手机王国,给人们提供日常娱乐和办公的平台,无论在哪些方面,Android 的表现总是能够让人满意, 它正在快速地占领手机终端,未来的智能手机领域将是 Android 的天下,越来越多的人选用 Android平台的手机。最后,与其他开发者和社区保持联系也非常重要。

weixin_71777765的博客 1321

Android Studio 的安装与使用

学习目标: 提示:这里可以添加学习目标 安装Android Studio并运行HelloWorld 学习内容: 提示:这里可以添加要学的内容 1、下载Android SDK,需要翻墙 下载网址:https://developer.android.google.cn/studio 2、安装SDK,前提是你得安装好JDK且配置好环境变量。否则在安装过程会出现如下找不到JDK的问题。 2、 搭建 Studio开发环境 3、 掌握 Hello World的实现 学习时间: 提示:这里可以添加计划学习的时间 例

weixin_51182309的博客 317

从零搭建安卓开发环境:Android Studio + Kotlin + 模拟器跑通第一个APP

移动应用开发的起点往往是环境搭建,而非直接编写代码。Android平台中,Android Studio作为官方集成开发环境,内置了JDK运行时和Gradle构建工具,统一管理SDK版本、依赖库与编译流程。理解这些组件的分工与协作,可以避免依赖下载失败、模拟器无法启动等新手常见问题。无论是个人开发者还是小团队,以Kotlin进行原生应用开发时,先跑通模拟器中的空工程,等于完成了从理论到实践的跨越。通过配置国内镜像源、合理规划磁盘空间、创建虚拟设备,开发环境才能真正形成闭环。一个完整的安卓开发环境搭建过程,涵盖

weixin_30691649的博客 272

安卓APK算法逆向实战:JEB+Smalidea动态调试提取注册机核心逻辑

在软件安全与逆向工程领域,算法提取是一项关键技术,它涉及将编译后的二进制代码还原为可理解的逻辑过程。其核心原理是通过静态分析与动态调试相结合,深入程序运行时内部,观察数据流与控制流,从而理解并重建原始算法。这项技术的价值在于安全评估、漏洞挖掘、兼容性开发及遗留系统分析等多个方面。典型的应用场景包括分析软件授权验证机制、理解第三方库的内部行为、恢复丢失的源代码等。本文聚焦于安卓平台,针对常见的注册机类APK,详细演示如何利用JEB反编译工具与Smalidea动态调试插件,从混淆的字节码中精准定位并提取关键算法

403

Android 如何调试已经运行在手机/模拟器中的软件界面的布局(像素,大小,padding,layout margin等) 用 Layout Inspector 工具

在已经运行在手机/模拟器上的软件的某个界面上,组件的大小、组件之间的间隔(padding, layout_margin等参数)如何得知?“现在这个Android应用运行在手机,在这个界面中,这个组件的大小、这两个组件之间的距离……在多人开发软件的过程中,有一类人(设计师)负责设计软件界面的样子,有一类人(程序员)负责用编程语言去实现具体的功能。实现之后,设计师指着程序员写出来的软件说:“你这个界面这里的间隔和我给的不一样大”……菜单中你不止可以搜索某个工具窗口,也可以搜索某个操作的快捷键是什么,等等。

wuyujin1997的博客 1338

android学习路径

开发 Android 应用的学习路径通常包括多个阶段,涵盖从基础知识到高级技能的各个方面。

weixin_71629819的博客 1069
上一篇: 多线程编程中需要知道的操作系统的概念
下一篇: 程序中时间的表示及时间函数的的选择
viewcode
博客等级 码龄16年 993粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值