【图像处理之图像的特征检测1】SIFT算法(未完待续)

本文为本人入门学习所用,由参考多方资料整理而成,完成后将加上参考文献

SIFT简介及相关特点

SIFT全称:尺度不变特征转换(Scale-invariant feature transform)

是一种用来侦测与描述影像中的局部性特征的算法:它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由David Lowe在1999年所发表,2004年完善总结。

SIFT算法的特点有:

1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

2. 独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

而SIFT算法在一定程度上可解决:

1. 目标的旋转、缩放、平移(RST)

2. 图像仿射/投影变换(视点viewpoint)

3. 光照影响(illumination)

4. 目标遮挡(occlusion)

5. 杂物场景(clutter)

6. 噪声

尺度空间理论

尺度空间的思想

尺度空间理论的基本思想是:在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。

尺度空间方法将传统的单尺度图像信息处理技术纳入尺度不断变化的动态分析框架中,更容易获取图像的本质特征。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。

尺度空间满足视觉不变性。该不变性的视觉解释如下:当我们用眼睛观察物体时,一方面当物体所处背景的光照条件变化时,视网膜感知图像的亮度水平和对比度是不同的,因此要求尺度空间算子对图像的分析不受图像的灰度水平和对比度变化的影响,即满足灰度不变性和对比度不变性。另一方面,相对于某一固定坐标系,当观察者和物体之间的相对位置变化时,视网膜所感知的图像的位置、大小、角度和形状是不同的,因此要求尺度空间算子对图像的分析和图像的位置、大小、角度以及仿射变换无关,即满足平移不变性、尺度不变性、欧几里德不变性以及仿射不变性。也可以认为就是使得计算机模拟人的视觉使得不会犯指鹿为马的错误。

尺度空间的数学表示

SIFT算法是在不同的尺度空间上查找关键点,而尺度空间的获取需要使用高斯模糊来实现,Lindeberg等人已证明高斯卷积核是实现尺度变换的唯一变换核,并且是唯一的线性核。

高斯卷积只是表现尺度空间的一种形式,例如在KAZE特征检测算法中用来表现尺度空间的形式变成了PM方程

一个图像的尺度空间,定义为一个变化尺度的高斯函数与原图像的卷积。

其中,*表示卷积运算,

m,n表示高斯模板的维度(由确定)。(x, y)代表图像的像素位置尺度空间因子,值越小表示图像被平滑的越少,相应的尺度也就越小。大尺度(模糊的比较狠,比较大)对应于图像的概貌特征,小尺度对应于图像的细节特征。

高斯模糊以及SIFT的实现概述

高斯模糊

对图像进行直接的二维高斯模糊,因为边界点无法处理将造成像素缺失出现黑边。所以一般的处理方法是将二维高斯模糊拆分为两个一维的高斯模板相乘进行替代。

高斯模糊相比于图像的简单平滑可以保留图像的全局特征但是无法对边缘或者纹理信息进行有效的保护,标准差越大越接近于均值滤波,也就是滤的越狠。邻域中心的像素具备最大的权值

拆分为两个一维的高斯卷积计算在计算边界的时候模板矩阵超出边界的部分将不做计算;此外这种方法的优点为可以减小运算的时间复杂度。

关于卷积,高斯模糊相关知识参见图像处理的关于图像增强部分

SIFT实现步骤

SIFT主要思路:

1)构造图像的尺度空间表示

2)在尺度空间中搜索极值点

3)由极值点建立描述特征向量

4)用特征描述向量进行相似度匹配

Lowe将SIFT算法分解为如下四步:

1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。

2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。

3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。

4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

SIFT具体实现步骤

根据上面的概述,我们第一步就是要构建连续的尺度空间;通过连续变化尺度参数获得多尺度下的尺度空间表示序列

回忆上述章节:

关于SIFT算子的优点:

1. 目标的旋转、缩放、平移(RST)

2. 图像仿射/投影变换(视点viewpoint)

3. 光照影响(illumination)

4. 目标遮挡(occlusion)

5. 杂物场景(clutter)

6. 噪声

SIFT主要思路:

1)构造图像的尺度空间表示

2)在尺度空间中搜索极值点

3)由极值点建立描述特征向量

4)用特征描述向量进行相似度匹配

关于尺度因子:

尺度空间因子,值越小表示图像被平滑的越少,相应的尺度也就越小。大尺度(模糊的比较狠,比较大)对应于图像的概貌特征,小尺度对应于图像的细节特征。

尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。

高斯金字塔的创建

根据上述步骤,第一步就是创建尺度空间,SIFT算子便是根据高斯金字塔创建尺度空间

图像金字塔是同意图像在不同分辨率下抽样得到的一组结果,它是早期图像多尺度的一种表示形式,由不同的高斯核函数卷积得到,多尺度表示随着尺度参数增加,冗余信息也随着增多,多尺度表示的优点在于图像的局部特征可以用简单的形式在不同尺度上描述。

金字塔表示则难以分析图像的局部特征。

图像金字塔多分辨率表示(用于图像分割)表示的是每层分辨率减少固定比率,生成快,占用存储空间少。

尺度空间在实现时使用高斯金字塔表示,高斯金字塔的构建分为两部分:

1. 对图像做不同尺度的高斯模糊;

2. 对图像做降采样(隔点采样)。

图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。原图像为金子塔的第一层,每次降采样所得到的新图像为金字塔的一层(每层一张图像),每个金字塔共n层。金字塔的层数根据图像的原始大小和塔顶图像的大小共同决定,其计算公式如下:

后边t的取值可以为0到log2min(m,n)之间的某一整数,此时需要考察顶层图像最小维数的对数值;因为这是金字塔每层隔点采样的结果。

其中M,N为原图像的大小,t为塔顶图像的最小维数的对数值。如,对于大小为512*512的图像,当塔顶图像为4*4时,n=7,当塔顶图像为2*2时,n=8。高斯金字塔的组数一般为log2min(m,n)-3因为如果到第九层1*1,这就没有意义了(比高斯模板还要小)

为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。如上图所示,将图像金字塔每层的一张图像使用不同参数做高斯模糊,使得金字塔的每层含有多张高斯模糊图像,将金字塔每层多张图像合称为一组(Octave),金字塔每层只有一组图像,组数和金字塔层数相等,每组含有多张(也叫层Interval)图像。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的

高斯差分金字塔

本节的目的是算出极值点,为下一步骤:2)在尺度空间中搜索极值点做准备

2002年Mikolajczyk在详细的实验比较中发现尺度归一化的高斯拉普拉斯函数的极大值和极小值同其它的特征提取函数,例如:梯度,Hessian或Harris角特征比较,能够产生最稳定的图像特征。

【归一化目的就是将不同尺度上的评判结果统一到一个尺度上,从而可以作比较,作计算。图像归一化就是通过一系列变换(利用图像的不变矩寻找一组参数,使其能够消除其他变换函数对图像变换的影响),将待处理的原始图像转换成响应的唯一标准形式(该图像对平移,旋转,缩放等仿射变换具备不变特性)基于矩的图像归一化过程包括4个步骤:坐标中心化,x-shearing归一化,缩放归一化以及旋转归一化】

而Lindeberg早在1994年就发现高斯差分函数(Difference of Gaussian ,简称DOG算子)与尺度归一化的高斯拉普拉斯函数非常近似。其中的关系可以从如下公式推导得到:

利用差分近似代替微分,则有:

因此有

其中k-1是个常数,并不影响极值点位置的求取。

如图所示

红色曲线表示的是高斯差分算子,而蓝色曲线表示的是高斯拉普拉斯算子。Lowe使用更高效的高斯差分算子代替拉普拉斯算子进行极值检测,如下:

在实际计算时,使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,如下图所示,进行极值检测。

空间极值点检测

关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图3.4所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

由于要在相邻尺度进行比较,如图右侧每组含4层的高斯差分金子塔,只能在中间两层中进行两个尺度的极值点检测,其它尺度则只能在不同组中进行。为了在每组中检测S个尺度的极值点,则DOG金字塔每组需S+2层图像,而DOG金字塔由高斯金字塔相邻两层相减得到,则高斯金字塔每组需S+3层图像,实际计算时S在3到5之间。

当然这样产生的极值点并不全都是稳定的特征点,因为某些极值点响应较弱,而且DOG算子会产生较强的边缘响应。

1)构造图像的尺度空间表示

2)在尺度空间中搜索极值点

3)由极值点建立描述特征向量

4)用特征描述向量进行相似度匹配

3)由极值点建立描述特征向量

关键点定位

以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。

关键点定位的主要步骤有四个关键点,分别是:关键点的精确定位,消除边缘响应,有限差分法求导,三阶矩阵求逆

关键点的精确定位

以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。

时间: 2024-08-24 21:29:06

【图像处理之图像的特征检测1】SIFT算法(未完待续)的相关文章

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序的是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希尔(shell)排序 希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示: ==> 图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动 如图3所示,相比插入排序

多项式艺术:浅谈FFT和NTT算法(未完待续)

什么是多项式? 百度百科说:“由若干个单项式相加组成的代数式叫做多项式.多项式中每个单项式叫做多项式的项,这些单项式中的最高次数,就是这个多项式的次数.” 也就是说,形如的式子,就叫做多项式.这样的式子,也能写作.很显然,多项式加上(或是减上)多项式也是多项式,复杂度是的.但是,如果多项式想要乘上一个多项式,那么也可以,最简单的方法却是的. 不过,FFT算法会告诉你,就够了. 多项式乘法 我们说的,多项式想要乘上一个多项式,那就是多项式乘法,人称“卷积”.我们方才所看到的,被称为多项式的“系数表

几种常用排序算法(bubble、select、insert、shell、未完待续)

接下来两天重新看看几种常用的排序算法. 1.冒泡排序法 每次从 i=0开始比较相邻的元素,若arr[i]>arr[i+1],则交换它们.直到把最大的元素推向最后.回到 i=0,直至完成. 1 import java.util.Scanner; 2 class bubble 3 { 4 public static void main(String[] args) 5 { 6 int n,temp; 7 int i,j; 8 int[] arr=new int[10000]; 9 Scanner s

EM算法-未完

借助于文章[1]中的内容把EM算法的过程顺一遍,加深一下印象. 关于EM公式的推导,一般会有两个证明,一个是利用Jesen不等式,另一个是将其分解成KL距离和L函数,本质是类似的. 下面介绍Jensen EM的整个推导过程. Jensen不等式 回顾优化理论中的一些概念.设f是定义域为实数的函数,如果对于所有的实数x,f′′(x)≥0,那么f是凸函数.当x是向量时,如果其hessian矩阵H是半正定的(H≥0),那么f是凸函数.如果f′′(x)>0或者H>0,那么称f是严格凸函数. Jense

【未完待续】Java蓝桥杯--算法训练(1)典型问题的递归框架

预备练习(一) 字母的全排列问题: 1 package package1; 2 3 //对字母进行全排列 4 import java.util.*; 5 6 public class A1 { 7 8 static List f(String s) { 9 List lst = new Vector(); 10 11 // 出口 12 if (s.length() == 1) { 13 lst.add(s); 14 return lst; 15 } 16 17 // 下面是递归的相似性 18 /

哈工大深研院数字图像处理第二次大作业:水果自动识别(2)HSV空间聚类及SIFT算法目标识别

老规矩,直接贴报告~ Programe list: Programe was developed in the condition of Windows aswell as Linux server, programming language is Matlab (www.mathworks.com). Classify.m, Kmeans.m: function for K-means clustering. main_Kmeans.m: main function for K-means c

SIFT算法的应用--目标识别之Bag-of-words模型

原文:http://blog.csdn.net/v_JULY_v/article/details/6555899 SIFT算法的应用 -目标识别之用Bag-of-words模型表示一幅图像 作者:wawayu,July.编程艺术室出品. 出处:http://blog.csdn.net/v_JULY_v . 引言 本blog之前已经写了四篇关于SIFT的文章,请参考九.图像特征提取与匹配之SIFT算法,九(续).sift算法的编译与实现,九(再续).教你一步一步用c语言实现sift算法.上,及九(

sift算法c语言源代码详细注释

前段时间在做三维测量方面的研究,需要得到物体表面三维数据,sift算法是立体匹配中的经典算法,下面是对RobHess的SIFT源代码的注释.部分内容参考网上,在这里向各位大神表示感谢! http://write.blog.csdn.net/postedit/46620015 /*头文件*/ #ifndef SIFT_H #define SIFT_H #include "cxcore.h" /******************************** Structures ****

OPENCV下SIFT算法使用方法笔记

这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋.也是醉了!!!!实在看不下去,来点干货.我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这些库完全可以让我们进行傻瓜似的操作.但实际用起来的时候还不是那么简单.下文将对一个典型的基于OPENCV的SIFT特征点提取以及匹配的例程进行分析,并由此分析详细的对OPENCV中SIFT算法的使用进行一个介绍. OPENCV下SIFT特征点提取与匹配的大致流程如下: 读取图片->特征点检测(位置,角度,层)->特征点描述的提取