FAST(features from accelerated segment test)是一种角点检测算法,可以用于提取特征点,后来也长用于目标跟踪等计算机视觉任务中。FAST角点检测算法最初由 Edward Rosten 和 Tom Drummond 提出,并于2006年正式发表。如名字所示,FAST算法最大的优势就是计算效率,相比于其他特征检测算法(例如SIFT、SUSAN、Harris和DOG等)更加快速。此外,通过应用机器学习方法,FAST可以在计算时间和资源等方面得到进一步的性能提升。由于快速高效的性能,FAST角点检测算法非常适合实时视频处理应用。
FAST角点检测算法主要考虑像素点邻域的圆形窗口上的16个像素。如下图所示,作者认为,以像素 p
为中心的周围圆环上的16个像素中,如果有连续 n
个像素点的灰度值都比 p
点的灰度值大或都小,则认为 p
是一个角点。
实际上,在比较像素灰度值时,需要加上一个阈值 t
。
S p → x = { d , I p → x ≤ I p − t ( d a r k e r ) s , I p − t < I p → x < I p + t ( s i m i l a r ) b , I p − t ≤ I p → x ( b r i g h t e r ) 其 中 , p → x 表 示 像 素 点 p 周 围 圆 环 上 的 像 素 点 x , ( x = 1 , 2 , . . . , 16 ) , S p → x 表 示 p 点 灰 度 对 应 的 区 间 类 别 S_{p \rightarrow x} = \begin{cases} d, \quad I_{p \rightarrow x} \leq I_{p}-t \quad (darker)\\ s, \quad I_{p}-t < I_{p \rightarrow x} < I_{p}+t \quad (similar)\\ b, \quad I_{p}-t \leq I_{p \rightarrow x} \quad (brighter) \end{cases}\\ 其中,p \rightarrow x\ 表示像素点p周围圆环上的像素点x,(x=1,2,...,16),S_{p \rightarrow x}表示p点灰度对应的区间类别 Sp→x=⎩⎪⎨⎪⎧d,Ip→x≤Ip−t(darker)s,Ip−t<Ip→x<Ip+t(similar)b,Ip−t≤Ip→x(brighter)其中,p→x 表示像素点p周围圆环上的像素点x,(x=1,2,...,16),Sp→x表示p点灰度对应的区间类别
也就是说,如果 p
点邻域有连续 n
个点比较的结果为 S p → x = d 或 b S_{p \rightarrow x} = d \ 或 \ b Sp→x=d 或 b,则认为 p
是角点。一般情况下, n
取12,称为FAST-12;实际中, n=9
的效果会更好一些。
由上面的分析可知,对于图像上的每个像素点,我们都需要遍历其邻域圆环上的16个像素点。实际的运用中,我们可以采用一种更加高效的检测方法,只需要检测第1,9,5和13四个位置的像素,就可以剔除掉一大部分非角点的像素。具体的做法是:
先检测第1和第9个像素,如果它们都与中心像素点 p
相似(即 S p → x = s S_{p \rightarrow x} = s Sp→x=s),说明点 p
不是角点;否则继续检测第5和第13个像素点,如果这4个像素点中至少有3个像素点不相似( S p → x = d 或 b S_{p \rightarrow x} = d \ 或 \ b Sp→x=d 或 b),则可以认为点 p
是角点,否则 p
肯定不是角点。
如果你已经理清楚了上面的4点检测思想,可以跳过下面这段补充理解:
- 首先,上面的4点检测方法是针对 n=12 而言的,对于 n=9 不适用
- 另外,对于 n=12 的情况,即需要保证连续12个像素点的灰度值均大于或小于中心像素点才是角点。因此,如果第1和第9个像素都与中心像素相似,则无论如何都不可能保证连续12个像素满足角点的条件,即此时的
p
不可能是角点;- 若继续考虑第5和第13个像素(即1,5,9,13一起考虑),如果不能满足至少3个像素与
p
不相似,显然p
就无法保证连续12个点与它不相似的条件,p
就肯定不是角点;- 否则,可以认为
p
是一个角点。事实上这是一种粗略的角点筛选,检测这4个点只能保证剔除不是角点的像素,还无法保证这个点就是角点。如果想要提高检测精度,可以继续检测完全部的16个像素,毕竟在剔除大部分非角点像素后,即使再检测完16个像素的计算量也会比原来少了很多。
上述方法的缺点:
n<12
时,上述的高效检测方法不再适用t
值,需要人为设置, t
越大,检测到的角点数量越少BRIEF(Binary Robust Independent Elementary Features)是一种特征描述子,而不是一种特征提取算法,因此不同于Harris、FAST、SIFT、SURF等特征检测算法。BRIEF算法由Michael Calonder等人在ECCV2010上上提出,采用了二进制串来描述特征,相比于SIFT的浮点型描述子而言,BRIEF描述子生成的速度更快,且其特征匹配速度也大大提升。
BRIEF算法的主要思想是,在特征点邻域的 s×s
窗口内随机选取 n
个点对,通过比较这些点对来生成一个二进制串作为该特征点的特征描述子。
注意:BRIEF只是特征描述子,特征点的提取要靠别的特征提取算法来完成,如FAST等。
具体的步骤:
先对整幅图像提取特征点
为了减少噪声影响,对图像进行高斯滤波(因为BRIEF随机选取点对,对噪声比较敏感)
对于某个特征点,在其 T(x,y)={1,if p(x)<p(y)0.otherwise其中,p(x)、p(y)分别为随机点对(x,y)的灰度值s×s
的邻域内随机选取一个点对,比较两个点的大小:
T ( x , y ) = { 1 , i f p ( x ) < p ( y ) 0. o t h e r w i s e 其 中 , p ( x ) 、 p ( y ) 分 别 为 随 机 点 对 ( x , y ) 的 灰 度 值 T(x,y)=\begin{cases} 1, \quad if\ p(x)
重复第3步 n
次,将 n
次比较的结果组合一个二进制串作为该特征点的特征描述子。一般 n
取128,256或512。
假设在特征点 s×s
的邻域内随机选取的某个点对为(x,y),作者提供了5种方法:
因为是很简单的二进制串,BRIEF算法直接采用汉明距离来匹配两个特征点。(注意:汉明距离是指两个二进制串中对应位置不同元素的个数)
经过大量实验数据测试,对于 n=256
即256维的BRIEF特征描述子,不匹配特征点的描述子的汉明距离在128左右,匹配点对描述子的汉明距离则远小于128。
因此,可以通过以下方法来判断特征点是否匹配:
优点: 算法简单,时间和空间复杂度较低,特征匹配快
缺点: 容易受噪声影响,不具有尺度不变性和旋转不变性
ORB(Oriented Fast and Rotated Brief)是一种特征提取算法,它将FAST和BRIEF算法结合起来并做了改进。ORB算法的速度非常快,并且解决了BRIEF描述子不具备旋转不变性的问题,ORB算法是最常见的传统特征检测算法之一。
ORB算法的核心就是,使用FAST算法进行特征检测,然后使用BRIEF算法来进行特征描述。
当然,如果ORB算法就仅仅到此为止,那就没什么特点了,所以它在此基础上做了一些改进。由前面的介绍知道,FAST和BRIEF算法并没有解决图像旋转不变性和尺度不变性的问题。ORB算法其实也没有解决尺度不变性的问题,但是在OpenCV的ORB算法的实现中通过引入图像金字塔来改善了这方面的性能。ORB算法主要解决了BRIEF描述子不具备旋转不变性的问题,具体的做法是:
ORB算法提出了灰度质心法,即计算特征点邻域内所有像素的灰度质心,而通过特征点与质心就可以得到一个向量,将这个向量作为特征点的方向,当图像发生旋转时,通过计算主方向旋转的角度就可以得到图像的旋转变换信息,从而实现旋转不变性。
如上图所示,P为特征点,Q为邻域内的灰度质心,向量PQ就是特征点的方向。质心的计算方法如下:
m 00 = ∑ x = − r r ∑ y = − r r I ( x , y ) m 10 = ∑ x = − r r ∑ y = − r r x I ( x , y ) m 01 = ∑ x = − r r ∑ y = − r r y I ( x , y ) 将 上 面 公 式 统 一 起 来 就 是 : m i j = ∑ x = − r r ∑ y = − r r x i y j I ( x , y ) 其 中 , I ( x , y ) 是 像 素 点 ( x , y ) 的 灰 度 值 , i , j 只 取 0 或 1 , r 为 邻 域 半 径 。 于 是 , 灰 度 质 心 可 以 表 示 为 : Q = ( m 10 m 00 , m 01 m 00 ) 因 此 , P Q ⃗ 就 是 特 征 点 的 方 向 , 特 征 点 的 角 度 表 示 为 : θ = a r c t a n ( m 01 , m 10 ) m_{00}=\sum_{x=-r}^{r}\sum_{y=-r}^{r} I(x,y)\\ m_{10}=\sum_{x=-r}^{r}\sum_{y=-r}^{r} xI(x,y)\\ m_{01}=\sum_{x=-r}^{r}\sum_{y=-r}^{r} yI(x,y)\\ 将上面公式统一起来就是:m_{ij}=\sum_{x=-r}^{r}\sum_{y=-r}^{r} x^{i}y^{j}I(x,y)\\ 其中,I(x,y)是像素点(x,y)的灰度值,i,j只取0或1,r为邻域半径。于是,灰度质心可以表示为:\\ Q=(\frac{m_{10}}{m_{00}},\frac{m_{01}}{m_{00}})\\ 因此,\vec{PQ}就是特征点的方向,特征点的角度表示为:\\ \theta = arctan(m_{01},m_{10}) m00=x=−r∑ry=−r∑rI(x,y)m10=x=−r∑ry=−r∑rxI(x,y)m01=x=−r∑ry=−r∑ryI(x,y)将上面公式统一起来就是:mij=x=−r∑ry=−r∑rxiyjI(x,y)其中,I(x,y)是像素点(x,y)的灰度值,i,j只取0或1,r为邻域半径。于是,灰度质心可以表示为:Q=(m00m10,m00m01)因此,PQ就是特征点的方向,特征点的角度表示为:θ=arctan(m01,m10)
Steer BRIEF:
得到了特征点的角度 θ \theta θ,接下来任务就是如何让BRIEF具备旋转不变性了,实现这个目标的方法就是 “Steer BRIEF”。我们知道,BRIEF是通过n个点对来产生一个描述向量的。我们将这n个点对组成一个矩阵S:
S = [ x 1 x 2 . . . x 2 n y 1 y 2 . . . y 2 n ] S=\begin{bmatrix} x_{1} & x_{2} &... & x_{2n}\\ y_{1} & y_{2} & ... & y_{2n}\end{bmatrix} S=[x1y1x2y2......x2ny2n]
然后构造一个旋转矩阵,将S旋转到相应的方向上:
S θ = R θ S 其 中 , R θ 为 旋 转 矩 阵 : R θ = [ c o s θ s i n θ − s i n θ c o s θ ] S_{\theta} = R_{\theta}S\\ 其中,R_{\theta}为旋转矩阵:R_{\theta}=\begin{bmatrix} cos\theta & sin\theta\\ -sin\theta & cos\theta\end{bmatrix} Sθ=RθS其中,Rθ为旋转矩阵:Rθ=[cosθ−sinθsinθcosθ]
然后就可以用 S θ S_{\theta} Sθ 作为校正后的BRIEF描述子了。
第十四节、FAST角点检测(附源码) https://www.cnblogs.com/zyly/p/9542164.html
BRIEF 特征点描述算法 https://blog.csdn.net/Chenyukuai6625/article/details/75195935
第十六节、基于ORB的特征检测和特征匹配 https://www.cnblogs.com/zyly/p/9622873.html