角点检测(Harris,Fast,surf)

前面分析了Sift算法的具体原理,就顺便想看看其他的角点检测算法,和对比。这些看完之后,相比sift的原理比较简单,自己没有总结,只是整合了别人的文章

Harris:

这个算法通过两张图就看得很清楚了。将被检测点上的window移动一下,然后计算原来的window和移动之后的window对应位置像素差的平方和,如果变化不大说明这个点在物体内部,如果一个方向上变化大,另外一个方向上变化不大说明在边界上。如果任何方向上变化都很大说明这个点就是corner point。

但是这个方法效果不是很好,主要存在两方面的问题:
  1. .0-1window对噪声比较敏感
  2. window移动的方向太少,导致该算法对边缘敏感(准确的说是和window移动方向不一致的边缘)

harris(1988)harris(1988)年提出了改进方案。

  1. 将01window改成了Gaussian window,中心权重比较高,离中心越远权重越低。
  2. 使用泰勒展开考虑所有方向
通过泰勒展开可以将原window和shift之后的window对应位置像素差的平方和表示为移动方向*该点Hessian矩阵*移动方向。Hessian矩阵的较大特征值和对应特征向量分别表示变化最大方向和对应变化幅度。第二特征值和对应特征向量,表示和变化最大方向相垂直的方向以及该方向变化的幅度。如果最大特征值很小那么说明该点在物体内部;如果第一特征值很大,另外一个特征值接近零说明该点是一个edge point;如果两个特征值都远大于零说明该点是一个corner point。
Harris 为了简化计算提出了一个cornerness的量,越大越说明这个点越corner,详细计算参见本文最初给的链接。给一个特征值和cornerness之间关系的图。

学原理:

基本数学公式如下:


其中W(x, y)表示移动窗口,I(x, y)表示像素灰度值强度,范围为0~255。根据泰勒级数,计算一阶到N阶的偏导数,最终得到一个Harris矩阵公式:

角点检测(Harris,Fast,surf)_第1张图片

根据Harris的矩阵计算矩阵特征值,然后计算Harris角度响应值:

角点检测(Harris,Fast,surf)_第2张图片

其中K为系数值,通常取值范围为0.04 ~ 0.06之间。

算法详细步骤

  1. 计算图像X方向与Y方向的一阶高斯偏导数Ix与Iy
  2. 根据第一步结果得到Ix^2 , Iy^2与Ix*Iy值
  3. 高斯模糊第二步三个值得到Sxx, Syy, Sxy
  4. 定义每个像素的Harris矩阵,计算出矩阵的两个特质值
  5. 计算出每个像素的R值
  6. 使用3X3或者5X5的窗口,实现非最大值压制
  7. 根据角度检测结果计算,最提取到的关键点以绿色标记,显示在原图上。

Fast焦点检测:

Edward Rosten and TomDrummond 在2006年提出了一种简单快速的角点探测算法,该算法检测的角点定义为在像素点的周围邻域内有足够多的像素点与该点处于不同的区域。应用到灰度图像中,即有足够多的像素点的灰度值大于该点的灰度值或者小于该点的灰度值。

考虑下图中p点附近半径为3的圆环上的16个点,一个思路是若其中有连续的12个点的灰度值与p点的灰度值差别超过某一阈值,则可以认为p点为角点。

角点检测(Harris,Fast,surf)_第3张图片

这一思路可以使用机器学习的方法进行加速。对同一类图像,例如同一场景的图像,可以在16个方向上进行训练,得到一棵决策树,从而在判定某一像素点是否为角点时,不再需要对所有方向进行检测,而只需要按照决策树指定的方向进行2-3次判定即可确定该点是否为角点。

常见的角点检测算法比较:

角点检测(Harris,Fast,surf)_第4张图片

  最近这些日子,我在中科院实习了一段时间,收获了很多宝贵的知识和经验,也认识了一些朋友,在这里感谢老师们对我的指导和建议。作为一名图像处理专业的数学Geek,我很喜欢做关于图像方面的算法研究,在这里把近几年的角点特征匹配方法做个总结,和大家分享一下。

  图像匹配能够应用的场合非常多,如目标跟踪,检测,识别,图像拼接等,而图像匹配最核心的技术就要属角点匹配了,所谓角点匹配是指寻找两幅图像之间的特征像素点的对应关系,从而确定两幅图像的位置关系。

  角点匹配可以分为以下四个步骤:

  1. 提取检测子:在两张待匹配的图像中寻找那些最容易识别的像素点(角点),比如纹理丰富的物体边缘点等。 
  2. 提取描述子:对于检测出的角点,用一些数学上的特征对其进行描述,如梯度直方图,局部随机二值特征等。
  3. 检测子和描述子的常用提取方法有:sift, harris, surf, fast, agast, brisk, freak, brisk,orb等。 
  4. .匹配:通过各个角点的描述子来判断它们在两张图像中的对应关系。常用方法如 flann  
  5. 去外点:去除错误匹配的外点,保留正确的内点。常用方法有Ransac, GTM。

  我对上述这些常用的检测子和描述子的性能和速度做了一个测试,以找出其中性价比最好的组合(不考虑后两步)

角点检测(Harris,Fast,surf)_第5张图片

                        图一

 

角点检测(Harris,Fast,surf)_第6张图片

                      图二

  上面两幅图是对上述部分检测子与描述子进行测试的结果。

  其中图一和图二的x坐标表示不同的检测子与描述子的组合,从1到30分别对应

(surf、agast、brisk、fast、sift、orb)检测子与 (brisk、agast、surf、sift、orb)描述子的线性组合,如第四组表示surf检测子+sift描述子的组合。

  图一和图二的y坐标表示一系列测试图片组,每组由两张图组成,这些图片都是质量较低的卫星地图,约2000*2000像素,每组的两张图片是由不同卫星对地面上同一地区进行拍摄的。它们之间的关系可能包含旋转,缩放,仿射变换,亮度变化,模糊,噪音等。从1到11的测试图片组大概对应着以下变换关系:

  1. 强烈亮度变化
  2. 旋转
  3. 仿射变换+尺度变化+旋转
  4. 仿射变换+亮度变化+旋转
  5. 仿射变换+噪音
  6. 模糊+亮度变化
  7. 旋转+噪音
  8. 旋转+尺度变化
  9. 亮度变化+旋转+模糊+噪音
  10.  亮度变化+旋转+尺度变化
  11.  亮度变化+旋转+尺度变化+强烈噪音。

  图一的z坐标表示成功匹配的像素对的个数。图二的z坐标表示所需计算时间。

  从测试结果来看,orb检测子与surf描述子配合的效果是最好的,不过速度也是最慢的。古老的sift和surf依然好用,速度也还是那么不给力。在不考虑旋转和仿射变换的情况下,fast是很不错的选择,在小幅旋转(20度内)的情况下,fast也还是有一定的容错能力的。在旋转变化和尺度变化方面,各家武功相差不多,虽然在理论上sift支持旋转变化,不过测试中它并没有表现出明显的优势。在噪音方面,sift和orb明显强于其它算法;在亮度变化和仿射变换上,orb的鲁棒性是最好的;综合比较,orb的性价比在此次华山论剑中略胜一筹。

  下面两张图是上面11组图片的均值,从平均值来看,orb也是最好的

  角点检测(Harris,Fast,surf)_第7张图片

 

  角点检测(Harris,Fast,surf)_第8张图片




你可能感兴趣的:(数字图像处理)