大纲
引言
SIFT算法是为了解决图片的匹配问题,想要从图像中提取一种对图像的大小和旋转变化保持鲁棒的特征,从而实现匹配。这一算法的灵感也十分的直观:人眼观测两张图片是否匹配时会注意到其中的典型区域(特征点部分),如果我们能够实现这一特征点区域提取过程,再对所提取到的区域进行描述就可以实现特征匹配了。于是问题就演变成了以下几个子问题:
- 应该选取什么样的点作为特征点呢?:人眼对图像中的高频区域更加的敏感,由此我们应该选择变化剧烈的边缘或者角点进行检测,这里我们选择检测角点。(这里的intuition不是很明白,但感觉来说可能是我们提取的是特征点进行匹配,而边缘往往是由多个点组成。)
- 怎样使得选取的特征点有尺度不变性呢?:使用高斯金字塔获取不同尺寸下的图像变体,由这些变体获得尺度不变特征。
- 怎样使得选取的特征点有缩放不变性呢?:使用高斯金字塔获取不同尺寸下的图像变体,每个变体里都提取特征点再缩放回原大小以获得图像不同尺寸下的特征点。
- 怎样使得选取的特征点有旋转不变性呢?:后续采取将特征点区域旋转到主方向的设定以获得旋转不变性。
- 如何描述特征点区域呢?: 使用特征点区域内每个方向的梯度赋值,类似HOG算子。
以上几个问题在SIFT算法里都用了很有意思的trick,后续会一一介绍。
一、高斯金字塔
引入高斯金字塔的目的在引言中已经介绍过了–解决图片缩放及尺度变化下特征提取的问题,高斯金字塔的Intuition有两个:1. 人看物体时近大远小,可以对图片下采样实现(金字塔->组);2. 人看物体时近处清晰,远处模糊,可以对图像高斯平滑实现(高斯->层);具体的推导可以参见我的另一篇博客:
Opencv学习笔记(六)图像金字塔
在SIFT里,高斯金字塔的层数和组数有着如下设定:
组数: O = [ l o g 2 m i n ( M , N ) ] − 3 O=[log_2min(M,N)]-3 O=[log2min(M,N)]−3
层数: S = n + 3 S=n+3 S=n+3
组数的设定是来自于提出SIFT算法的原始论文给出的经验值,理论上来说知要 O ≤ [ l o g 2 m i n ( M , N ) ] O\leq[log_2min(M,N)] O≤[log2min(M,N)]即可,层数的设定则是有着理论依据的,这里的 n n n是我们想要提取特征点的图片层数,由于提取出高斯金字塔后需要计算层间差分以获得高斯差分金字塔(DOG, Difference of Gausssian),高斯金字塔层数需要比DOG层数多1,而计算特征值时要求在尺度层面,即上下相邻层间计算,则DOG层数要比特征层数多2,则要求 S = n + 3 S=n+3 S=n+3。
附:在SIFT中对于高斯金字塔有几个需要补充的知识点。
- SIFT算法中的S指的是"scale"即尺度的概念,这一概念有别于传统的图像尺寸,而是一种连续变化的参数,在高斯金字塔里的 σ \sigma σ就是这样一个尺度空间的参数,更特殊的,高斯核是唯一可以产生连续多尺度变化的线性核,这就是为什么我们用高斯金字塔,这一部分内容涉及到尺度空间的概念,可以自行了解。
- 图像金子塔一文中提到了两个基础参数,层间尺度变化系数 k k k和初始尺度 σ 0 \sigma_0 σ0,在原始算法中规定 k = 2 o + r n , r = 0 , 1... , n + 2 k=2^{o+\frac{r}{n}},r={0,1...,n+2} k=2o+nr,r=0,1...,n+2,由于每组的起始层是由前一组倒数第三层降采样得到,实际上保证了每组开始的尺度为 σ 0 , 2 σ 0 , 3 σ 0 . . . \sigma_0,2\sigma_0,3\sigma_0... σ0,2σ0,3σ0...。此外我们提到 σ 0 = 1.6 \sigma_0=1.6 σ0=1.6,而实际拍摄图片时相机已经原始景物进行了一次尺度变换,此变换的系数原文设定经验值为 σ ′ = 0.5 \sigma'=0.5 σ′=0.5,由此我们得到 σ 0 = 1. 6 2 − σ ′ 2 = 1.52 \sigma_0=\sqrt{1.6^2-\sigma'^2}=1.52 σ0=1.62−σ′2=1.52。这一式子的来历为:高斯滤波体现为高斯核与原图进行卷积 f ( x ) ⨂ G ′ ( x ) f(x)\bigotimes G'(x) f(x)⨂G′(x),两次高斯滤波的级联相当于 f ( x ) ⨂ ( G ′ ( x ) ⨂ G ( x ) ) f(x)\bigotimes (G'(x) \bigotimes G(x)) f(x)⨂(G′(x)⨂G(x)),而两个高斯卷积的结果仍为高斯卷积,且方差满足平方和关系,可用时域卷积或者傅里叶变换证明,详见参考文献。
二、高斯差分金字塔
通过高斯金字塔,我们获取了不同尺度的图片,接下来的问题是如何获取高频区域呢,一个很简单的思路就是按照边缘检测的算法使用差分滤波器如拉普拉斯滤波器、sobel滤波器在图片上滑动找到灰度值变化剧烈的区域。而经前人研究,归一化的高斯拉普拉斯算子的极大值极小值相较于其他特征提取函数可以获得最稳定的图像特征,因此我们打算使用归一化的高斯拉普拉斯算子在多尺度图片上提取特征,但是使用这种方式提取复杂度会很高,又尺度归一化高斯拉普拉斯算子和DOG函数有着如下关系:
G ( x , y , k σ ) − G ( x , y , σ ) ≈ ( k − 1 ) σ 2 ∇ 2 G G(x,y,k\sigma)-G(x,y,\sigma)\approx(k-1)\sigma^2 \nabla^2 G G(x,y,kσ)−G(x,y,σ)≈(k−1)σ2∇2G
证明如下:
忽略高斯函数系数:
G ( x , y , σ ) = 1 σ 2 e x p ( − x 2 + y 2 2 σ 2 ) ∂ G ∂ x = − x σ 4 e x p ( − x 2 + y 2 2 σ 2 ) ∂ 2 G ∂ x 2 = − σ 2 + x 2 σ 6 e x p ( − x 2 + y 2 2 σ 2 ) ∇ 2 G ( x , y ) = ∂ 2 G ∂ x 2 + ∂ 2 G ∂ y 2 = − 2 σ 2 + x 2 + y 2 σ 6 e x p ( − x 2 + y 2 2 σ 2 ) ∂ G ∂ σ = − 2 σ 2 + x 2 + y 2 σ 5 e x p ( − x 2 + y 2 2 σ 2 ) ⇒ σ ∇ 2 G = ∂ G ∂ σ \begin{aligned} &G(x,y,\sigma)=\frac{1}{\sigma^2}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\frac{\partial{G}}{\partial x}=-\frac{x}{\sigma^4}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\frac{\partial^2{G}}{\partial x^2}=\frac{-\sigma^2+x^2}{\sigma^6}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\nabla^2 G(x,y)=\frac{\partial^2{G}}{\partial x^2}+\frac{\partial^2{G}}{\partial y^2}\\ &\qquad \qquad \ =\frac{-2\sigma^2+x^2+y^2}{\sigma^6}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\frac{\partial{G}}{\partial \sigma}=\frac{-2\sigma^2+x^2+y^2}{\sigma^5}exp(-\frac{x^2+y^2}{2\sigma^2})\\ &\Rightarrow\\ &\sigma\nabla^2G=\frac{\partial G}{\partial \sigma} \end{aligned} G(x,y,σ)=σ

最低0.47元/天 解锁文章
16万+

被折叠的 条评论
为什么被折叠?



