今天介绍一种特征提取算法:BRISK(Binary Robust Invariant Scalable Kepoints)
BRISK是Stefan等人在ICCV11上发表的。通过对原论文进行泛读后,对该算法有了一定的了解。
原论文地址如下:
BRISK是一种改进的BRIEF算法,该算法具有高计算效率和旋转、尺度不变性的特点,对噪声也有一定鲁棒性。
该算法总的来说分为以下几步:
构建尺度空间
尺度空间的建立通过对原图像进行降采样实现,尺度空间包括n个octaves和n个intra-octaves,一般来说n的值为4。那么我们就有一个8层的图形金字塔。图像金字塔是一种以多分辨率来解释图像的结构,在SIFT特征提取中也有用到,如下所示:
BRISK中用到的图形金字塔每层octaves是通过缩放因子2来降采样,而每层intra-octaves则通过缩放因子1.5来降采样。最终的8层octaves尺寸如下图所示:
如果原图长为18像素,那么intra-octave0将被下采样为12个像素,octave1则为9个。
建立完这8张不同的尺度图像之后,下一步要对每一层尺度空间进行FAST 9-16关键点检测,阈值这里为T。
FAST 9-16关键点检测可以自行CSDN搜索或者等我的FAST学习笔记发表。
得到关键点后,下一步则是对关键点进行非极大值抑制,具体就是将特征点和金字塔中的上下尺度图层(2*9个点)和当前图层邻域(8个点)共26个邻域点的FAST Score进行比较,只保留这26个点中FAST Score最大的点,非极大值抑制过滤了一些关键点,使得提取出来的点,更具有代表性。
通过非极大值抑制后得出的点由于是在不同的尺度图层中表示的,所以离散度也有所不同。这样得出的点并不能精准表达特征。接下来还需要进一步定位他们。
亚像素和连续尺度细化
论文中提到 “将图像显着性视为一个连续量,不仅在整个图像上,而且在比例尺维度上。我们采用亚像素和连续尺度细化方法。”
为了精简亚像素和连续尺度细化的过程,原论文中使用了在三个目标图层的最小二乘意义上的二次方程拟合方法。
看到这里的时候我也有点一头雾水,但是可以通过这幅图简单理解:
我们通过尺度空间构建只得到了8个不同的尺度图层,但是设想如果最大的FAST Score值坐落于两个连续尺度中间呢?如上图中红色点所示。
为了解决这个问题,我们采用以下方法:对于三个连续图层di,ci和di-1和三个连续图层中的三个相应关键点进行最小二乘意义的二次方程拟合,得到上图右侧红色方程。为了防止重采样,在每层采用3*3像素的score patch。然后对x和y方向上插值,得到准确的极值点和坐标位置,再对尺度方向进行一维插值,得到关键点所对应的尺度。这就求得了关键点位置和关键点尺度。下一步将会用到。
关键点描述
论文中提到BRISK描述子可以作为一个二值化字符串通过连接亮度比较测试集表示。然而,一种更有效的办法:识别关键点方向并做方向归一化,这种做法可以强化旋转不变性。
采样模式和旋转估算
BRISK的一个重要概念就是使用采样关键点邻域的模式。如下图所示:
以关键点为中心,构建不同半径的同心圆,每个圆有不同等间隔采样点,在图中表示为蓝色圆点。所有采样点包括特征点共N个。为了避免混叠效应,所有采样点都应进行半径为r方差为σ的高斯滤波。N个采样点会产生N*(N-1)/2个采样点对。局部梯度值g可以被表示为以下公式:
这里的为像素灰度值,是关键点尺度,p表示关键点位置。
集合A是所有采样点对。
这里的两个阈值S和L分别是短距离S和长距离L,阈值分别设置为,,t是关键点所在尺度。
最后的特征点主方向可以通过以下公式计算:
这里g使用长距离计算。
构建描述子
为了构建旋转和尺度归一化描述子,论文中运用了在关键点旋转的采样方式,旋转角度为。向量描述子由所有的短距离二进制编码来描述,编码方式如下:
表示旋转角度,最终通过以上公式生成了一个512的二进制编码,这也就是BRISK64。
特征点匹配
这里使用了Hamming距离来实现特征点匹配,不懂得同学自行百度。
这里配上一张论文中的实验图像,可以看出BRISK的旋转不变性。
参考资料:
https://senitco.github.io/2017/07/12/image-feature-brisk/