特征点检测:CenSurE: Center Surround Extremas for Realtime Feature Detection and Matching

  • 1. CenSurE 特征
    • 1.1 寻找极值
    • 1.2 二级滤波
    • 1.3 使用盒式的 CenSurE
    • 2.4 使用八角形的 CenSurE
    • 2.5 非最大值抑制
    • 2.6 线抑制
    • 1.7 滤波器计算
  • 2. OpenCV 中的 `cv::StarDetector` 类

Reference:

  1. CenSurE: Center Surround Extremas for Realtime Feature Detection and Matching

文章提出了一套尺度不变的中心环绕极值检测器(center-surround detectors: CenSurE),并在稳定性(视点变化时的特征的持续性)和准确性(视点变化时特征的一致定位)上做了评估。(算法是个好算法,但是这文章写的有点烂,细节讲的很不清晰)

1. CenSurE 特征

该方法要求在所有尺度计算所有特征,并选择跨尺度和位置的极值。这种策略需要非常快的计算,在这里使用简化的双层内核作为中心环绕滤波器。主要关注点是寻找旋转不变但易于计算的 kernel。

1.1 寻找极值

该算法先在所有位置和尺度上计算简化的中心环绕滤波器,并找到局部领域中的极值。再通过使用 Harris 度量+消除那些具有弱边缘响应的的方式过滤极值点。

1.2 二级滤波

Lowe 在 SIFT 中使用 DoG(Difference of Gaussian) 来近似 LoG(Laplacian of Gaussian) ,但我们寻求更简单的近似,使用双层的中心环绕滤波器,也就是说,它们将图像值乘以 1 1 1 或 − 1 -1 −1。下图显示了具有不同程度对称性的一系列双层滤波器。圆形滤波器最近似拉普拉斯算子,但最难计算。其他滤波器可以使用积分图快速计算,并且从八边形到六边形再到盒式滤波器的计算成本逐渐降低。我们研究了两个端点:八边形用于更好的性能,而盒式用于更小的计算量。

1.3 使用盒式的 CenSurE

用正方形替换圆形 BLoG 中的两个圆圈(上左图),形成 CenSurE-DOB。这生成了基础的中心环绕哈尔小波(center-surround Haar wavelet)。Figure 1(d) 显示了块大小为 n n n 的通用中心环绕小波。内盒的大小为 ( 2 n + 1 ) × ( 2 n + 1 ) (2n+1)\times (2n+1) (2n+1)×(2n+1),外盒的大小为 ( 4 n + 1 ) × ( 4 n + 1 ) (4n+1)\times (4n+1) (4n+1)×(4n+1)。卷积是通过乘法和求和完成的。如果 I n I_n In​ 是内部权重、 O n O_n On​ 是外盒权重,那么为了使该滤波器的 D C DC DC 相应为零,我们必须有:
O n ( 4 n + 1 ) 2 = I n ( 2 n + 1 ) 2 (1) \tag{1} O_n(4n+1)^2 = I_n(2n+1)^2 On​(4n+1)2=In​(2n+1)2(1)我们还必须对跨尺度的每个小波的面积差进行标准化(毕竟使用的面积大小不同,面积大的得到的响应还是更大一些):
I n ( 2 n + 1 ) 2 = I n + 1 ( 2 ( n + 1 ) + 1 ) 2 (2) \tag{2} I_n(2n+1)^2=I_{n+1}(2(n+1)+1)^2 In​(2n+1)2=In+1​(2(n+1)+1)2(2)我们对中心环绕 Haar 小波使用一组七个尺度,分别为块大小 n = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] n=[1,2,3,4,5,6,7] n=[1,2,3,4,5,6,7]。由于块大小 1 1 1 和 7 7 7 是边界,因此检测到的特征的最小尺度对应的块大小为 2 2 2。(这里啥意思? 1 1 1 的不就是最小的么)这大致对应与 σ \sigma σ 大小为 1.885 1.885 1.885 的 LoG。 这五个尺度涵盖了 2 1 2 2\frac{1}{2} 221​ 的 octave,尽管尺度是线性的。当然添加更多的块大小,如 8 8 8、 9 9 9 等也很容易。

2.4 使用八角形的 CenSurE

盒形的差分显然不是旋转不变的内核。特别的,DOB 在 45 ° 45° 45° 平面内旋转的表现不佳。另一方面,八边形更接近圆形,并且比 DOB 更好的近似 LoG。

在使用八边形时,通过内部和外部加权相加执行卷积的基本思想保持不变。与 DOB 中一样,必须找到权重 I n I_n In​ 和 O n O_n On​,使得 DC 响应为 0 0 0 并且所有滤波器都根据八边形的面积进行标准化。

如 Figure 1(b)所示,八边形可以用垂直边(m)的高度和倾斜边(n)来表示。

2.5 非最大值抑制

我们计算图像中每个像素的七个滤波器响应。然后我们在尺度空间上执行非极大值抑制------简而言之,如果响应大于(最大情况)或小于(最小情况)其在局部邻域中的相邻响应,则响应被抑制。该领域中的最大值或最小值的像素是特征点位置。我们使用 3 × 3 × 3 3\times 3\times 3 3×3×3 领域进行非极大值抑制。

滤波器响应的大小给出了特征强度的指示。强度越大,越有可能被重复。弱响应很可能不稳定。因此,我们可以应用一个阈值来过滤掉弱响应

由于我们所有的响应都是在原始图像上计算的,没有进行下采样,所以我们所有的特征位置都很好地定位,并且我们不需要执行子像素插值。

2.6 线抑制

沿着边缘或线的特征很难定位,因此它们不太稳定。这种定义不佳的峰值沿直线的主曲率很大,但垂直方向的主曲率很小,因此可以使用主曲率之比过滤掉。使用特定尺度下响应函数的二阶矩矩阵来过滤掉这些响应:
H = [ ∑ L x 2 ∑ L x L y ∑ L x L y ∑ L y 2 ] (3) \tag{3} H=\left[\begin{array}{cc} \sum L_x^2 & \sum L_x L_y \\ \sum L_x L_y & \sum L_y^2 \end{array}\right] H=[∑Lx2​∑Lx​Ly​​∑Lx​Ly​∑Ly2​​](3) L x L_x Lx​ 和 L y L_y Ly​ 是响应函数 L L L 沿 x x x 和 y y y 方向的导数。在一个窗口上进行求和,该窗口线性依赖于特定特征点的尺度:尺度越高,窗口大小越大。注意这是尺度自适应的 Harris 度量,它与 SIFT 用于过滤线相应的 Hessian 矩阵不同。一旦计算出 Harris 度量,它的迹接行列式就可以用来计算主曲率之比。我们对该比率使用阈值 10 10 10,并在块大小为 2 2 2 的最小尺度上使用 9 × 9 9\times 9 9×9 窗口。

Harris 度量的计算成本比 SIFT 使用的 Hessian 矩阵计算量更大。然而,这种度量只需要计算一小部分特征点,即响应超过阈值的尺度空间最大值,因此不存在计算瓶颈。根据我们经验,它在抑制线响应方面比 Hessian 做得更好。

1.7 滤波器计算

CenSurE 的关键是能够有效地计算所有尺寸的双层滤波器。盒子滤波器可以使用积分图来完成。积分图 I I I 是图像的中间表示,包含图像 N N N 的高度 y y y 和宽度 x x x 的灰度像素值之和,即:
I ( x , y ) = ∑ x ′ = 0 x ∑ y ′ = 0 y N ( x ′ , y ′ ) (4) \tag{4} I(x, y)=\sum_{x^{\prime}=0}^x \sum_{y^{\prime}=0}^y N\left(x^{\prime}, y^{\prime}\right) I(x,y)=x′=0∑x​y′=0∑y​N(x′,y′)(4)积分图是递归计算的,只需要对图像进行一次扫描。一旦计算出积分图,只需四次加减法即可计算任何矩形区域的光强和,计算量与图像大小无关(就加减法计算而言)。

修改后的积分图可以用来计算其他多边形滤波器。这里的想法是,任何梯形面积都可以在常数时间内计算,使用两个不同的倾斜积分图的组合,其中像素的和表示角度面积和。倾斜程度由参数 α \alpha α 控制:
I α ( x , y ) = ∑ y ′ = 0 y ∑ x ′ = 0 x + α ( y − y ′ ) N ( x ′ , y ′ ) (5) \tag{5} I_\alpha(x, y)=\sum_{y^{\prime}=0}^y \sum_{x^{\prime}=0}^{x+\alpha\left(y-y^{\prime}\right)} N\left(x^{\prime}, y^{\prime}\right) Iα​(x,y)=y′=0∑y​x′=0∑x+α(y−y′)​N(x′,y′)(5)当 α = 0 \alpha=0 α=0,这就是标准的矩形积分图。当 α < 0 \alpha<0 α<0 时,求和面积向左倾斜;当 α > 0 \alpha>0 α>0 时,求和面积向右倾斜(Fig.2, left)。利用增量技术可以使计算斜积分图像和矩形积分图像时间相同。

将具有相同斜度的两个区域加在一起,确定具有平行水平边的梯形的一端(Fig.2, right);另一端是类似的,使用不同的倾斜。每个梯形需要三个加法,就像矩形的情况一样。最后,多边形滤波器可以分解为1个(盒形)、2个(六边形)和3个(八边形)梯形,这是计算这些滤波器的相对成本。

2. OpenCV 中的 cv::StarDetector

OpenCV 中实现的 CenSurE 算法称为 STAR 算法,对 CenSurE 算法进行了一些改进。

  1. STAR 滤波器的形状是两个交错重叠的正方形,构成一个八角形。

  2. STAR 算法选择 17个尺度递增的检测器 n = [ 1 , 2 , 3 , 4 , 6 , 8 , 11 , 12 , 16 , 23 , 32 , 45 , 46 , 64 , 90 , 128 , − 1 ] n=[1, 2, 3, 4, 6, 8, 11, 12, 16, 23, 32, 45, 46, 64, 90, 128, -1] n=[1,2,3,4,6,8,11,12,16,23,32,45,46,64,90,128,−1]

  3. 滤波器的卷积运算基于积分图,但没有直接计算八角形的强度和,而是分别用积分图像和倾斜积分图分别计算后相加。

    StarDetector 类的构造函数为:

    /*!The "Star" Detector.The class implements the keypoint detector introduced by K. Konolige.*/
    class StarDetectorImpl : public StarDetector
    {public://! the full constructorStarDetectorImpl(int _maxSize=45, int _responseThreshold=30,int _lineThresholdProjected=10,int _lineThresholdBinarized=8,int _suppressNonmaxSize=5);void detect( InputArray image, std::vector<KeyPoint>& keypoints, InputArray mask=noArray() ) CV_OVERRIDE;protected:int maxSize;int responseThreshold;int lineThresholdProjected;int lineThresholdBinarized;int suppressNonmaxSize;
    };
    

这套源码写的感觉也有点不太行,最好自行修改一下:

  • 代码内为了加速计算,忽略 s i z e = 1 , 2 , m a x size=1, 2, max size=1,2,max 的情况,将它们取负了:

    sizes1[0] = -sizes1[0];
    sizes1[1] = -sizes1[1];
    sizes1[maxIdx] = -sizes1[maxIdx];

    后面再做过滤:

    featureSize = s_ptr[maxPt.y*sstep + maxPt.x]) >= 4

    问题在于可能有相近 response 但是稍微小一点的会被忽略。建议在选取 scale 做计算时直接去掉小的 scale。

特征点检测:CenSurE: Center Surround Extremas for Realtime Feature Detection and Matching相关推荐

  1. 实时车道检测--A Novel Vision-Based Framework for Real-Time Lane Detection and Tracking

    A Novel Vision-Based Framework for Real-Time Lane Detection and Tracking SAE Technical Paper 2019-01 ...

  2. 刘知远 陈慧敏:流言止于“智”者——网络虚假信息的特征与检测

    来源:清华大学藤影荷声 本文约5000字,建议阅读10分钟 本文为你介绍网络虚假信息的一些特征和检测方法. 互联网的深度普及加速了"信息时代"的到来,网络中每个人都可以以极低甚至& ...

  3. python opencv识别点个数_python+OpenCV 特征点检测

    1.Harris角点检测 Harris角点检测算法是一个极为简单的角点检测算法,该算法在1988年就被发明了,算法的主要思想是如果像素周围显示存在多于一个方向的边,我们认为该点为兴趣点.基本原理是根据 ...

  4. 【OpenCV入门教程之十七】OpenCV重映射 SURF特征点检测合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨) ...

  5. OpenCV特征点检测------Surf(特征点篇)

    Surf(Speed Up Robust Feature) Surf算法的原理                                                              ...

  6. python+OpenCV 特征点检测

    1.Harris角点检测 Harris角点检测算法是一个极为简单的角点检测算法,该算法在1988年就被发明了,算法的主要思想是如果像素周围显示存在多于一个方向的边,我们认为该点为兴趣点.基本原理是根据 ...

  7. 一种人脸68特征点检测的深度学习方法

    该人脸68特征点检测的深度学习方法采用VGG作为原型进行改造(以下简称mini VGG),从数据集的准备,网络模型的构造以及最终的训练过程三个方面进行介绍,工程源码详见:Github链接 一.数据集的 ...

  8. SURF算法与SIFT算法的性能比较——图像特征点检测与提取算法分析

    图像特征点提取算法的算法研究(SURF和SIFT算法) 1. 摘要 计算机视觉中,很大一部分研究集中在图像特征提取和特征生成算法上.对图像的优化,不同于一般数学问题的优化方法,图像的优化是对像素点,在 ...

  9. 基于梯度方向、极化变换和聚类算法的图像主特征直线检测

    基于梯度方向.极化变换和聚类算法的图像主特征直线检测 基于机器学习和图像处理的直线检测 代码主要思路: 1)借助类LSD直线检测,提取图像各个方向梯度:2)对像素中的各个梯度方向做极化变换:3)对计划 ...

最新文章

  1. Shuffle 相关
  2. 数据分析之pandas常见的数据处理(四)
  3. MySql系统变量explicit_defaults_for_timestamp
  4. 叶明哲 | 数据中心空调那点事
  5. matlab 腐蚀 结构元素,图像的腐蚀
  6. js优化阿里云图片加载(二)
  7. Asp.net 中 Eval 调用后台函数的写法
  8. S3C2440系统中断
  9. python实现的简版iconv
  10. 搭建离线版keras中文文档
  11. 中文三元组联合标注工具LAnn介绍
  12. Linux系统管理命令之accton的使用
  13. InstallShield Slient Uninstall
  14. 《NVMe-over-Fabrics-1_0a-2018.07.23-Ratified》阅读笔记(3)-- 命令
  15. 《东周列国志》第六十一回 晋悼公驾楚会萧鱼 孙林父因歌逐献公
  16. 【思维导图】零基础如何把握Python学习方向
  17. c语言零序电压的计算算法,零序电流计算方法解析.pdf
  18. MFC动态改变图形控件picture control位置
  19. Filter过滤器及其作用介绍
  20. webpack中利用eslint对js进行代码格式检校

热门文章

  1. 荧光光谱入门:荧光光谱基础(一)
  2. win10 word无法创建工作文件,请检查临时环境变量怎么办
  3. 经营财务体系与财务数字化转型
  4. 如果你也处于生活焦虑中,那么这篇文章可能对你有点帮助!
  5. 怎么运用网络营销获得精准的客户?
  6. FFmpeg入门详解之105:m3u8文件格式详解
  7. CAT5E、CAT6和CAT6A在系统性能及网络应用上有什么区别
  8. 阿里系独立上市计划启动,盒马打头阵不惧“市场纷乱”?
  9. jstree的基本使用例子
  10. 快速提示:如何在JavaScript中创建和处理数组