图像特征点及特征描述子总结

别来无恙 提交于 2019-11-29 19:16:52

参考博客

https://blog.csdn.net/qq_28193895/article/details/80845803
https://blog.csdn.net/u013989576/article/details/49226611
https://blog.csdn.net/tostq/article/details/49314017
https://www.cnblogs.com/zyly/p/9542164.html
https://www.cnblogs.com/gfgwxw/p/9440785.html
https://www.cnblogs.com/wyuzl/p/7838103.html
https://www.cnblogs.com/sonicmlj/p/9564182.html
https://blog.csdn.net/dreamguard/article/details/83988814
https://blog.csdn.net/yangying1992/article/details/100809629
https://www.cnblogs.com/jiahenhe2/p/7930802.html
https://blog.csdn.net/jiaoyangwm/article/details/79986729

1.Susan

原理
用一个圆形模板在图像上移动,若模板内的像素灰度与模板中心的像素(被称为核Nucleus)灰度值小于一定的阈值,则认为该点与核Nucleus具有相同的灰度,满足该条件的像素组成的区域就称为USAN(Univalue Segment Assimilating Nucleus)。边缘处的点的USAN大小小于或等于圆形模板的一半。
在这里插入图片描述
算法步骤
(1)在图像上放置一个37个像素的圆形模板,模板在图像上滑动,依次比较模板内各个像素点的灰度值与模板核的灰度,判断是否属于USAN区域。判别如下:
c(r,r0)={1I(r)I(r0)t0I(r)I(r0)>t c(r,r_0) = \begin{cases} 1& |I(r)-I(r_0)| \leq t \\ 0&|I(r)-I(r_0) | >t \end{cases}
(2)统计圆形模板中和核心点有相似亮度的像素点数 n(r0)n(r_0)
n(r0)=reD(r0)c(r,r0) n(r_0) = \sum_{reD(r_0)}c(r,r_0)
其中D(r0)D(r_0)是以r0r_0为中心的圆形模板区域
(3)使用如下的角点响应函数。若某个像素点的USAN值小于某一特定阈值,则该点被认为时初始角点,其中,g可以设定为USAN最大面积的一半。
R(r0)={gn(r0)n(r0)<g0n(r0)g R(r_0) = \begin{cases} g-n(r_0)& n(r_0) < g \\ 0 & n(r_0) \ge g \end{cases}
(4)对初始角点进行非极值抑制来求得最后的角点。
优缺点

  • 完全不设计梯度计算,因此抗噪声能力较强,运算量也较小
  • 图像的对比度较大,则可以选择较大的t值,而图像的对比度较小,则可选取较小的t值
  • 不仅具有边缘检测能力,对角点的检测效果也较好

2.FAST

原理
在FAST角点检测算子中,一般以半径为3.4像素,外围共16个像素的圆作为模板来筛选特征点。
在这里插入图片描述
最初的检测方法就是检测在这样的圆环上的16个像素点中,如果有n个连续的点都比中心像素p的强度都大,或都小的话,这样的中心点就是角点,实际上比较强度时,需要加上阈值t。一般n取12
Spx={dIpxIptdarkersIpt<Ipx<Ip+tsimiliarbIp+tIpxbrighter S_{p-x} = \begin{cases} d&I_{p-x} \leq I_p-t & darker\\ s&I_p -t < I_{p-x} <I_p+t & similiar\\ b&I_p+t \leq I_{p-x} & brighter \end{cases}
如果需要提高检测速度,只需要检测四个点就可以了,首先比较第1和9个像素,如果两点像素强度都在中心点像素的一定范围内(阈值t),则中心点像素不是角点,否则,再检测第5和13点如果上述四点中至少有三个点同中心点不同,则可以说明这个是角点。

通过机器学习做角点分类器

(1) ID3分类步骤
①首先选取进行角点提取的应用场景下的多张图片;
②使用FAST算法找出每副图像的特征点
③对于图上任意像素点p,FAST定义的周围16个像素可以用x,x{1,2,3,,16}x,x \in \{1,2,3,\dots,16\}表示位置, p-x表示以p为中心像素点,对应的x位置的像素;
④任选16个位置中的一个x,把集合P分为三个部分Pd,Ps,PbP_d, P_s, P_b 其中PdP_d的定义如下,PsPbP_s和P_b的定义类似:
Pb={pP:Spx=b} P_b = \{ p \in P: S_{p-x} = b\}
⑤定义一个新的布尔变量KpK_p,如果p是一个角点,那些KpK_p为真,否则为假;
⑥使用ID3算法(决策树分类器)来查询每一个子集;
⑦递归计算所有的子集直至KpK_p的熵为0;
⑧被创建的决策树就用于其他的图片的FAST检测。
(2)非极大值抑制
定义角点响应函数
V=max(xSbrightIpxIpt,xSdarkIpxIpt) V = max \bigg( \sum_{x \in S_{bright}} |I_{p-x} - I_p| - t, \sum_{x \in S_{dark}} |I_{p-x} - I_p| -t \bigg)
①为每一个检测到的特征点计算他响应的大小(score function)V。
②考虑两个相邻的特征点,并比较它们的V值。
③V值较低的点会被删除

优缺点

  • 计算速度快,可以应用于实时场景中
  • 容易收到噪声的影响,阈值t的影响也较大

3.BRIEF

Brief为特征描述子,对已检测到的特征进行描述,是一种二进制编码描述子,由于BRIEF仅仅是特征描述子,所以事先要得到特征点的位置,可以利用FAST特征点检测算法或Harris角点检测算法或SIFT,SURF等算法检测特征点的位置。接下来在特征点领域利用BRIEF算法建立特征描述符。

算法步骤
①为减少噪声干扰,先对图像进行高斯滤波(方差为2,高斯窗口为9x9)
②以特征点为中心,取SxS的邻域窗口。在窗口内随机选取一对点,比较这两者像素的大小,进行如下的二进制赋值。
τ(p;x,y)={1ifp(x)<p(y)0otherwise \tau(p;x,y) = \begin{cases} 1 & if p(x) < p(y) \\ 0 & otherwise \end{cases}
其中p(x)和p(y)是随机点x和y处的像素值。

③在窗口中随机选取N对随机点,重复步骤2的二进制赋值,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。

随机采样一对点的方法共有以下五种,其中方法二较好。
(1)xi,yix_i,y_i都cheng均匀分布[S2,S2]\bigg[ - \frac{S}{2},\frac{S}{2} \bigg]
(2)xi,yix_i,y_i都呈高斯分布[0,125S2]\bigg [0,\frac{1}{25}S^2 \bigg ],准则采样服从各向同性的同一高斯分布
(3)xix_i服从高斯分布[0,125S2]\bigg [0,\frac{1}{25}S^2 \bigg ]yiy_i服从高斯分布[xi,1100S2]\bigg[x_i,\frac{1}{100}S^2 \bigg],采用分为2步进行:首先在原点处为xix_i进行高斯采样,然后在中心为xix_i处为yiy_i进行高斯采样。

(4)xi,yix_i,y_i在空间量化极坐标下的离散位置处进行随机采样。

(5)xi=(0,0)T,yix_i = (0,0)^T,y_i在空间量化极坐标下的离散位置进行随机采样。

五种方法生成的256对随机点如下(一条线段的两个端点是一对):
在这里插入图片描述
应用
利用BRIEF特征进行配准
经过上面的特征提取算法,对一幅图像中的每一个特征点,都得到了一个256Bit的二进制编码。接下来对有相似或重叠部分的两幅图像进行配准。
特征配对是利用汉明距离进行判决:

  • 两个特征编码对应bit位上相同元素的个数小于128的,一定不是配对的
  • 一幅图像上特征点与另一幅图上特征编码对应bit位上相同元素的个数最多的特征点配成一对

优缺点

  • 抛弃了传统用梯度直方图描述区域的方法,改用检测随机响应,大大加快了描述子建立速度
  • 生成的二进制描述子便于高速匹配,计算Hamming距离只需要通过异或操作加上统计二进制编码中“1”的个数的操作,这些通过底层的运算即可实现
  • 缺点就是旋转不变性较差

4.LOG算子和DOG算子

4.1 高斯拉普拉斯算子(LoG,Laplacian of Gaussian)

在图像中,边缘可以看做是位于一阶导数较大的像素处。因此,我们可以求图像的一阶导数来确定图像的边缘。一阶导数的极大值就是二阶导数的零值。所以利用二阶导数的零点求图像的边缘。但是图像的噪声导数的影响较大,所以一般先用高斯滤波器对图像进行高斯滤波从而去噪,再利用Laplace算子对图像的边缘进行求解。Laplace算子定义为两个方向的内积,符号表示Δ\Delta

Δ=2=[xy][xy]T=2x2+2y2 \Delta = \nabla^2 = \bigg[ \frac{\partial}{\partial x}\frac{\partial}{\partial y} \bigg]\bigg[ \frac{\partial}{\partial x}\frac{\partial}{\partial y} \bigg]^T = \frac{\partial^2}{\partial x^2}+ \frac{\partial^2}{\partial y^2}
使用二阶差分代替二阶函数,则
Δf(x,y)=Δxf(x,y)+Δyf(x,y)=f(x+1,y)f(x,y)+f(x1,y)f(x,y)+f(x,y+1)f(x,y)+f(x,y1)f(x,y)=f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y) \begin{aligned} \Delta f(x,y) & = \Delta_xf(x,y) + \Delta_yf(x,y) \\ & = f(x+1,y)-f(x,y)+f(x-1,y)-f(x,y)+f(x,y+1)-f(x,y)+f(x,y-1)-f(x,y) \\ & = f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y) \end{aligned}
那么卷积模板为:
[010140010] \left[ \begin{matrix} 0 & 1 & 0 \\ 1 & -4 & 0 \\ 0 & 1 & 0 \end{matrix} \right]
如果考虑四个方向:
Δf(x,y)=Δxf(x,y)+Δyf(x,y)+Δxyf(x,y)+Δyxf(x,y) \Delta f(x,y) = \Delta_x f(x,y)+\Delta_y f(x,y)+\Delta_{xy} f(x,y)+\Delta_{yx} f(x,y)
那么卷积模板为
[111181111] \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{matrix} \right]
由于Laplace算子对噪声很敏感,所以一般利用高通滤波器进行平滑处理,所以引入了高斯拉普拉斯算子(LoG,Laplacian of Gaussian)
对图像I(x,y)I(x,y),首先通过尺度为σ\sigma的高斯平滑
Gσ(x,y)=12πσ2exp(x2+y22σ2) G_\sigma(x,y) = \frac{1}{\sqrt{2\pi \sigma^2}}exp \bigg(- \frac{x^2+y^2}{2\sigma^2} \bigg)
再使用Laplace算子检测边缘
ΔGσI(x,y)=[ΔGσ(x,y)]I(x,y) \Delta |G_\sigma * I(x,y)| = [\Delta G_\sigma(x,y)]*I(x,y)
该式证明如下:
ddt2[h(t)f(t)]=ddtf(τ)h(tτ)dτ=f(τ)ddt2h(tτ)dτ=f(t)ddt2h(t) \begin{aligned} \frac{d}{dt^2}[h(t) * f(t)] & = \frac{d}{dt} \int f( \tau )h(t- \tau)d\tau \\ & = \int f(\tau) \frac{d}{dt^2}h(t-\tau)d\tau \\ & = f(t) * \frac{d}{dt^2}h(t) \end{aligned}
所以高斯拉普拉斯算子等价于先对高斯函数求二阶导,再与原图进行卷积
其中归一化的二维高斯核为:G(x,y,σ)=12πσ2ex2+y22σ2G(x,y,\sigma) = \frac{1}{2\pi \sigma^2}e^{- \frac{x^2+y^2}{2 \sigma^2}}将高斯拉普拉斯算子展开:
LoG=ΔGσ(x,y)=2Gσ(x,y)x2+2Gσ(x,y)y2=12πσ2x2+y22σ2σ4e(x2+y2)/2σ2 LoG = \Delta G_\sigma(x,y) = \frac{\partial^2G_\sigma(x,y)}{\partial x^2} + \frac{\partial^2G_\sigma(x,y)}{\partial y^2} = \frac{1}{2\pi \sigma^2}\frac{x^2+y^2 - 2\sigma^2}{\sigma^4}e^{-(x^2+y^2)/2\sigma^2}

4.2 高斯差分函数(DoG,Difference of Gaussian)

DoG即对不同尺度下的高斯函数的差分,DoG算子表达如下:

DoG=Gσ1Gσ2=12π[1σ1e(x2+y2)/2σ121σ2e(x2+y2)/2σ22] DoG = G_{\sigma_1} - G_{\sigma_2} = \frac{1}{\sqrt{2\pi}} \bigg[\frac{1}{\sigma_1}e^{-(x^2+y^2)/2\sigma_1^2} - \frac{1}{\sigma_2}e^{-(x^2+y^2)/2\sigma_2^2} \bigg]
由于归一化的LoGLoG算子:
Lnorm=σ2(Gxx(x,y,σ)+Gyy(x,y,σ))=σGσ L_{norm} = \sigma^2(G_{xx}(x,y,\sigma)+G_{yy}(x,y,\sigma)) = \sigma \frac{\partial G}{\partial \sigma}
而由导数定义:GσG(x,y,kσ)G(x,y,σ)kσσ\frac{\partial G}{\partial \sigma} \approx \frac{G(x,y,k\sigma)-G(x,y,\sigma)}{k\sigma-\sigma}
所以:G(x,y,kσ)G(x,y,σ)(k1)σ22GG(x,y,k \sigma) -G(x,y,\sigma) \approx (k-1)\sigma^2\nabla^2G
即DoG算子和LoG算子具有类似的波形,仅仅是幅度不同,不影响极值点的检测,而DoG算子的时间复杂度明显低于LoG,因此一般使用DoG代替LoG算子
在这里插入图片描述

5.Harris角点检测

原理

用一个固定的窗口在图像上进行任意方向的滑动,比较滑动前和滑动后的两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度的变化,那么我认为该窗口中存在角点。

用数学方法刻画角点特征
当窗口发生[u,v]移动时,那么滑动前与滑动后对应的窗口像素值灰度变化描述如下:
E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2 E(u,v) = \sum_{x,y} w(x,y)[I(x+u,y+v)-I(x,y)]^2

  • [u,v]是窗口的偏移量
  • (x,y)是窗口内所对应的像素坐标位置,窗口有多大,就有多少位置
  • w(x,y)是窗口函数,一般是以窗口中心为原点的高斯函数,最简单的是窗口内所有的像素对应的权重都设为1,如下图的两种情况

公式E(u,v)E(u,v)的进一步推导
由泰勒展开可知:
f(x+u,y+v)f(x,y)+ufx(x,y)+vfy(x,y) f(x+u,y+v) \approx f(x,y) +uf_x(x,y) + vf_y(x,y)
则:
[I(x+u,y+v)I(x,y)]2[I(x,y)+uIx+vIyI(x,y)]2=u2Ix2+2uvIxIy+v2Iy2=[u,v][Ix2IxIyIxIyIy2][uv]=[u,v]([Ix2IxIyIxIyIy2])[uv] \begin{aligned} &\sum[I(x+u,y+v)-I(x,y)]^2 \\ \approx &\sum[I(x,y)+uI_x+vI_y-I(x,y)]^2 \\ = &\sum u^2I_x^2+2uvI_xI_y+v^2I_y^2 \\ =&\sum[u,v] \left[ \begin{matrix} I_x^2&I_xI_y \\ I_xI_y&I_y^2 \end{matrix}\right]\left[ \begin{matrix} u\\v \end{matrix}\right] \\ =&[u,v] \bigg(\sum \left[ \begin{matrix} I_x^2&I_xI_y \\ I_xI_y&I_y^2 \end{matrix}\right] \bigg)\left[ \begin{matrix} u\\v \end{matrix}\right] \end{aligned}
所以E(u,v)E(u,v)可以更新为:
E(u,v)=[u,v]M[uv]M=x,yw(x,y)[Ix2IxIyIxIyIy2] E(u,v) = [u,v] M \left[ \begin{matrix} u\\v \end{matrix}\right] \\ M = \sum_{x,y} w(x,y) \left[ \begin{matrix} I_x^2&I_xI_y \\ I_xI_y&I_y^2 \end{matrix}\right]
矩阵M分析
在这里插入图片描述
下图是对这三种情况窗口中的对应像素的梯度分布进行绘制:
在这里插入图片描述
虽然使用E(u,v)E(u,v)描述角点的基本思想,然而对于角点的判断最终仅仅使用矩阵M的性质来判断(网上有较多证明)

角点的响应函数
R=det(M)k(trace(M))2 R = det(M)-k(trace(M))^2

  • det(M)=λ1λ2det(M) = \lambda_1 \lambda_2
  • trace(M)=λ1+λ2trace(M) = \lambda_1 + \lambda_2

这些特征值决定了一个区域是角,边缘还是平面。

  • 当|R|很小时,即λ1\lambda_1λ2\lambda_2很小时,该区域为平面。
  • 当R<0时,即λ1\lambda_1远远大于λ2\lambda_2或者λ2\lambda_2远远大于λ1\lambda_1时,该区域为边缘
  • 当R很大时,即λ1\lambda_1λ2\lambda_2都很大且近似相等,该区域为角点。

优缺点

  • 该算子亮度和对比度变化不敏感
  • 该算子具有旋转不变性
  • 算子具有尺度不变性

6.SIFT算子

原理

SIFT算子是把图像中检测到的特征点用一个128维的特征向量进行描述,因此一幅图像经过SIFT算法后表示为一个128维的特征向量集,该特征向量集具有对图像缩放,平移,旋转不变的特征,对于光照、仿射和投影变换也有一定的不变性,是一种非常优秀的局部特征描述算法。

算法步骤
1.尺度空间的极值点检测
2.关键点精确定位
3.关键点方向的确定
4.特征向量的生成

尺度空间极点检测

尺度空间

构造尺度空间是为了找到满足尺度不变性的特征。尺度空间中各个尺度图像的模糊程度逐渐变大,能够模拟人在距离由近到远时目标在视网膜上形成的过程,尺度越大,图像越模糊。图像和高斯函数的卷积运算能对图像进行模糊,且不同尺度的高斯核可以得到不同程度的模糊图像,一幅图像的高斯尺度可以通过图像和不同尺度的高斯核卷积得到:
L(x,y,σ)=G(x,y,σ)I(x,y) L(x,y,\sigma) = G(x,y,\sigma)*I(x,y)
其中,G是高斯函数:
G(x,y,σ)=12πσ2ex2+y22σ2 G(x,y,\sigma) = \frac{1}{2\pi \sigma^2}e^{\frac{x^2+y^2}{2\sigma^2}}
其中,σ\sigma是尺度空间因子,是高斯正态分布的标准差,反映了图像被模糊的程度,其值越大图像越模糊,对应的尺度也就越大,L(x,y,σ)L(x,y,\sigma)对应高斯尺度空间。

为了检测在不同尺度下都存在的特征点,而检测特征点较好的算子是高斯拉普拉斯(LoG,上文有介绍),由于LoG的运算量较大,所以通常用高斯差分函数(DoG,上文有介绍)来代替。

高斯金字塔

在这里插入图片描述

金字塔生成中设计一些具体参数的选取和设定,不展开详谈

极值点的检测

在这里插入图片描述
为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻的点时,该点就是极值点。如图所示,中间的监测点要和其所在图像的3x3领域8个像素点,以及其相邻的上下层的3x3领域18个像素点,共26个像素点进行比较。

特征点的精确定位和删除

计算机中存储的图像数据是离散的,而我们之前找到的极值点也就是离散空间中的极值点,但是离散空间中的极值点并不是真实的连续空间中的极值点。所以需要对DoG空间进行拟合处理,以找到极值点的精确位置和尺度。另外,我们还需要去除那些在边缘位置的极值点,以提高关键点的稳定性。

计算特征点的方向

为了实现特征点的旋转不变性,因此需要计算特征点的角度。在计算特征点的方向时是根据特征点所在的高斯尺度图像中的局部特征计算出的。该高斯尺度σ是已知的,并且该尺度是相对于该图像所在的组的基准图像的。所谓的局部特征就是特征点的邻域区域内所有像素的梯度幅角和梯度幅值

sift算法设计到的东西太多,有时间再慢慢补充。

7.ORB

ORB(Oriented FAST and Rotated BRIEF)是一种快速特征提取和描述算法。特征提取是由FAST算法改进的。ORB特征是将FAST特征点的检测方法和BRIEF特征描述子结合起来,并在它们原来的基础上做了改进和优化

FAST算法改进

由于FAST算法提取出的特征点不具有尺度不变性,这导致图像经过缩放后无法匹配到相应的特征点。为了改进这一点,需要使用图片的尺度金字塔,在不同尺度计算FAST特征点。具体做法为设置一个比例因子scaleFactor(通常取1.2)和金字塔的层数nlevels(通常取8)。将原图像按比例因子缩小成nlevels幅图像。缩放后的图像为:I’= I/scaleFactork(k=1,2,…, nlevels)。nlevels幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点。

BRIEF算法的改进

BRIEF描述子不具备旋转不变性,理想的特征点描述子应该具备旋转不变性,使得图像在经过一定的旋转后仍然能够识别匹配其中的特征点。BRIEF描述子选取点对的时候,是以当前特征点为原点,以水平方向为X轴,以垂直方向为Y轴建立坐标系。当图片发生旋转时,坐标系不变,同样的取点模式取出来的点却不一样,计算得到的描述子也不一样,这是不符合我们要求的。ORB在计算BRIEF描述子时建立的坐标系是以特征点为圆心,以特征点和取点区域的质心的连线为X轴建立2维坐标系。这样一来,无论图像如何旋转,ORB选取点对的坐标系是固定的。在不同的旋转角度下,我们以同一取点模式取出来的点是一致的。这就解决了旋转一致性的问题。
质心Q的计算公式如下:
M00=X=RRY=RRI(x,y)M10=X=RRY=RRxI(x,y)M01=X=RRY=RRyI(x,y)Qx=M10M00,Qy=M01M00 \begin{aligned} M_{00} = \sum_{X=-R}^R \sum_{Y=-R}^RI(x,y) \\ M_{10} = \sum_{X=-R}^R \sum_{Y=-R}^RxI(x,y) \\ M_{01} = \sum_{X=-R}^R \sum_{Y=-R}^RyI(x,y) \\ Q_x = \frac{M_{10}}{M_{00}},Q_y = \frac{M_{01}}{M_{00}} \end{aligned}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!