SIFT
概述
SIFT算法是CV领域在DL进入之前的20年中,最重要的成果。
尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在尺度空间中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由David Lowe在1999年所发表,2004年完善总结。
注:David G. Lowe,英属不列颠哥伦比亚大学(UBC)本科+斯坦福博士(1985)。UBC教授,Google资深科学家。
个人主页:
http://www.cs.ubc.ca/~lowe/
他在个人主页中提供了一份CV界知名的公司或研究机构的名单:
http://www.cs.ubc.ca/~lowe/vision.html
尺度空间
尺度空间(scale space)思想最早是由Iijima于1962年提出的,后经witkin和Koenderink等人的推广逐渐得到关注,在计算机视觉领域使用广泛。
尺度空间理论的基本思想是:在图像信息处理模型中引入一个被视为尺度的参数,通过连续变化尺度参数获得多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。
尺度空间方法将传统的单尺度图像信息处理技术纳入尺度不断变化的动态分析框架中,更容易获取图像的本质特征。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。
尺度空间的应用实例就是图像金字塔。
尺度空间的视觉不变性
视觉不变性是对尺度空间算子提出的一种要求:
1.对图像的分析不受图像的灰度水平和对比度变化的影响,即满足灰度不变性和对比度不变性。这主要体现了物体的光照变化。
2.对图像的分析和图像的位置、大小、角度以及仿射变换无关,即满足平移不变性、尺度不变性、欧几里德不变性以及仿射不变性。这主要体现了物体的空间位置变化。
DOG & LOG
DOG(Difference of Gaussians)和LOG(Laplacian of Gaussian)是尺度空间常用的两种算子。
DOG的定义如下:
DOG实际上就是两个不同方差的Gaussian核做差。它最典型的用法就是《图像处理理论(二)》中提到的高斯差分金字塔。
LOG的计算分2步:
1.计算Gaussian核和图像的卷积 G(x,y)∗f(x,y) G ( x , y ) ∗ f ( x , y ) 。
其中:
2.对第1步的结果应用Laplace算子。
Laplace算子的定义为:
其中:
因为:
一般将 [ΔG(x,y)] [ Δ G ( x , y ) ] ,称为LOG算子。
从上图可以看出两者的函数图像是非常相似的。
参见:
http://blog.csdn.net/kezunhai/article/details/11579785
高斯拉普拉斯算子(Laplace of Gaussian)
构建DOG金字塔
《图像处理理论(二)》中提到的DOG金字塔只用了一个5*5的Gaussian核。如果使用多种Gaussian核,就可得到如下所示的DOG金字塔。
上图中,尺度相同,Gaussian核不同的图片被分为一组(Octave)。
空间极值点检测
关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。
为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。
如上图所示,中间的检测点要与同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。
当然这样产生的极值点并不全都是稳定的特征点,因为某些极值点响应较弱,而且DOG算子会产生较强的边缘响应,因此需要剔除不稳定的边缘响应点。
关键点
离散空间的极值点并不是真正的极值点,上图显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。
为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。使用图像梯度的方法求取局部结构的稳定方向。对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像 3σ 3 σ 邻域窗口内像素的梯度和方向分布特征。
在完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向:
方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。
因此,对于有多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建。这些关键点梯度相同,但方向不同。仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。
实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并且离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值,检测结果如下图所示:
通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向。
关键点特征描述
接下来就是为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。
Lowe建议描述子使用在关键点尺度空间内4*4的窗口中计算的8个方向的梯度信息,共4x4x8=128维向量表征。
表示步骤如下:
1.确定计算描述子所需的图像区域。
特征描述子与特征点所在的尺度有关,因此,对梯度的求取应在特征点对应的高斯图像上进行。将关键点附近的邻域划分为d * d(Lowe建议d=4)个子区域,每个子区域做为一个种子点,每个种子点有8个方向。
2.将坐标轴旋转为关键点的方向,以确保旋转不变性。
3.将邻域内的采样点分配到对应的子区域内,将子区域内的梯度值分配到8个方向上,计算其权值。
4.插值计算每个种子点八个方向的梯度。
5.如上统计的4x4x8=128个梯度信息即为该关键点的特征向量。特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理,对于图像灰度值整体漂移,图像各点的梯度是邻域像素相减得到,所以也能去除。
6.描述子向量门限。非线性光照,相机饱和度变化对造成某些方向的梯度值过大,而对方向的影响微弱。因此设置门限值(向量归一化后,一般取0.2)截断较大的梯度值。然后,再进行一次归一化处理,提高特征的鉴别性。
7.按特征点的尺度对特征描述向量进行排序。
总结
SIFT大概算是最复杂的算子了,上文仅是概括描述,省略了大量公式及其推导,但仍然花了很大篇幅才讲完。可以想见,设计一个比SIFT还好的算子会有多么困难,人工设计特征走到这里,差不多也就到头了,后面的天下是属于DL的。
参考
http://blog.csdn.net/zddblog/article/details/7521424
SIFT算法详解
https://mp.weixin.qq.com/s/wYiwuBt8VVYOheJ_jgCHgA
一文读懂图像局部特征点检测算法!
https://mp.weixin.qq.com/s/sM78DCOK3fuG2JrP2QaSZA
SIFT与CNN的碰撞:万字长文回顾图像检索任务十年探索历程(上)
https://mp.weixin.qq.com/s/yzVMDEpwbXVS0y-CwWSBEA
SIFT与CNN的碰撞:万字长文回顾图像检索任务十年探索历程(下)
YUV & YCbCr & RGB
在RGB颜色空间中,红,绿,蓝是基本元素。RGB格式是显示器通常使用的格式。
然而,人类视觉系统(HVS)相比亮度来说对于颜色不是那么敏感的。通过把亮度与颜色信息分离,并对亮度值取更高的分辨率可以更有效地表示一个颜色图像。这就是所谓的YUV颜色空间。Y表示亮度,B-Y(即U)、R-Y(即V)是色差信息。
实际使用中,为了更有效率,又定义了YCbCr格式。两个Y、Cb和U、Cr和V的含义相同,但是表示方法不同。YCbCr在YUV的基础上,进行了比例和偏置变换。
相关的定义及转换标准是:ITU-R Recommendation BT.601(标清)和ITU-R Recommendation BT.709(高清)。