论文转载请注明出处:http://blog.csdn.net/kezunhai

1977年,Moravec提出了兴趣点(Points of Interests)的概念,并应用于解决Stanford Cart的导航问题。1981年, Moravec在International Joint Conference on Artificial Intelligence发表了篇题为:Obstacle Avoidance and Navigation in the Real World by a Seeing Robot Rover的文章,并将其应用与立体匹配。本文将主要介绍Moravec算子的点特征提取的原理和过程。

Moravec的原理如果有一句话来说就是:通过滑动二值矩形窗口寻找灰度变化的局部最大值。具体来说主要包括四个过程:

1)滑动窗口计算灰度变化(Calculate intensity variantion from shifting windows)

滑动窗口在现有的技术中已经有了很多应用,如模板匹配、目标检测(hog特征的行人检测)等。在Moravec算子中,一般窗口的大小取3×3、5×5、7×7等等,但是随着窗口的增大,计算量也就越大。Moravec算子通过对窗口的水平、垂直和对角八个方向进行移动(Horizontally、Vertically and four diagonals),计算原窗口与滑动窗口差的平方和来得到灰度的变化。我们进一步通过下图一个3×3的滑窗来进行说明:

上图中,红色框表示的是原始框,而蓝色框表示向右上的滑动框,白色框表示前景255,黑色框表示背景0。那么原始框和滑动框的灰度变化通过对应位置差的平方和来表示,也即通过下式来计算:

同样,根据上式计算另外七个方向滑动框的灰度变化(水平向左、水平向右、垂直向上、垂直向下以及四个对角)。至此,我们就计算完成了8个方向的灰度变化,我们称此操作位Moravec operator(Moravec算子)。

2)构造角点性映射图(Construct the cornerness map)

在构造角点映射图之前,我们先来分析下,通过上式的我们可以得到角点吗?或者凭什么通过计算两个框对应位置的差的平方和就可以检测到角点?问题问得好,我们来看下面的图:

上面四张图上的四个红色的框表示我们正在处理的窗,第一幅图中的窗在表示在目标内部或者是背景上,该区域灰度分布均与,通过对其在8个方向上灰度,灰度变化很小;第二幅图中的窗跨在图像的边缘处,当垂直于边缘方向滑动窗口时将会导致灰度的很大变化,而沿着边缘滑动窗时,灰度变化较小;第三幅图中的窗在角点处,不管往哪个方向滑动窗口,都会导致灰度的很大变化;而第四幅图中的框内是一个离散点,滑动窗向任意方向滑动也会导致灰度的很大变化。

因此,通过上面的描述和分析,我们可以知道,Moravec算子可以作为一种角点性的度量,这种度量是通过求8个方向的滑窗来的最小值来表示。用公式表示如下:

我们通过下图来描述角点映射图的构造:

上图中的是通过Moravec算子计算得到的,其中1表示1*255^2,2表示2*255^2。通过上图可以知道:

(1)角点位于局部最大值处,我们可以应用非极大值抑制找到局部最大值(non-maximal suppression)。

(2)离散点(噪声点)与角点有相同的角点性(cornerness),因此Moravec算子对噪声敏感,但是通过增大滑窗的大小可以对噪声起到一定的抑制作用,可同时增加了计算量。另一方面,可以通过设定一个阈值T来对cornerness map进行二值化,小于阈值T的cornerness map设置为0,从而对离散点的局部最大值进行抑制。阈值的选择引用原文的话:Choosing this threshold is difficult as it must be set high enough to avoid these false corners(isolated pixel), but low enough to retain as many true corners as possible.

(3)Moravec算子不能应用与图像边界的一定区域(标记为X的区域),对于这部分区域,一般直接忽略,在cornerness map中这些区域对应的值置0。

下面对Moravec算子的基本步骤进行简单的总结,其主要包括包括:

我们再上两张效果图:

     

从上图也可以看到,Moravec算子对角点的检测效果还不错,但是对于对角线上的角点容易出现误检。

总结:Moravec算子作为第一个广泛应用的角点检测算法,开创了角点检测的新纪念,后续的很多角点检测算子都是在其基础上通过扩展得到的。但是Moravec算子也存在诸如方向各异性、噪声敏感、对旋转不具备不变形(角点不具备repeatability)、滑动窗内的各个像素权重同质性(中心像素权重大,离中心越远,权重越小)。在下一篇中,我将介绍一种对Moravec算子进行改进、在很多领域取得非常广泛应用的另一种算子-----Harris算子。

另外可以参考:

http://code.google.com/p/jfeaturelib/wiki/Moravec(可以现在Moravec算子的库和源代码)

http://kiwi.cs.dal.ca/~dparks/CornerDetection/moravec.htm (Moravec算子的更细节内容)

图像处理特征不变算子系列之Moravec算子(一)的更多相关文章

  1. Python 图像处理 OpenCV (12): Roberts 算子、 Prewitt 算子、 Sobel 算子和 Laplacian 算子边缘检测技术

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  2. Spark常用算子-KeyValue数据类型的算子

    package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import or ...

  3. Spark常用算子-value数据类型的算子

    package com.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; im ...

  4. 实现Sobel算子滤波、Robers算子滤波、Laplace算子滤波

    前几天,老师布置了这样一个任务,读取图片并显示,反色后进行显示:进行Sobel算子滤波,然后反色,进行显示:进行Robers算子滤波,然后反色,进行显示.我最后加上了Laplace算子滤波,进行了比较 ...

  5. matlab练习程序(Moravec算子)

    这个算子算是图像历史上第一个特征点提取算法了,1977年提出的,很简单,拿来练手很合适. 算法原理如下: 1.选取一个合理的邻域遍历图像,这里是5*5邻域的.在邻域中依次计算,垂直,水平,对角与反对角 ...

  6. Moravec算子

    Moravec在1981年提出了Moravec角点检測算子,并将它应用于立体匹配.它是一种基于灰度方差的角点检測方法.该算子计算图像中某个像素点沿着水平.垂直.对角线.反对角线四个方向的灰度方差,当中 ...

  7. (转)Spark 算子系列文章

    http://lxw1234.com/archives/2015/07/363.htm Spark算子:RDD基本转换操作(1)–map.flagMap.distinct Spark算子:RDD创建操 ...

  8. 图像处理-07-图像的轮廓提取-Robert算子

    图像的轮廓提取-Robert算子 图像的边缘:周围像素灰度有阶跃变化或“屋顶”变化的那些像素的集合,边缘广泛存在于物体与背景之间.物体与物体之间,基元与基元之间,是图像分割的重要依据. 物体的边缘是由 ...

  9. OpenCV图像处理篇之边缘检测算子

    OpenCV图像处理篇之边缘检测算子 转载: http://xiahouzuoxin.github.io/notes/ 3种边缘检测算子 一阶导数的梯度算子 高斯拉普拉斯算子 Canny算子 Open ...

随机推荐

  1. 稳定婚姻问题和Gale-Shapley算法(转)

    什么是算法?每当有人问作者这样的问题时,他总会引用这个例子:假如你是一个媒人,有若干个单身男子登门求助,还有同样多的单身女子也前来征婚.如果你已经知道这些女孩儿在每个男孩儿心目中的排名,以及男孩儿们在 ...

  2. premake Ubuntu下的安装

    premake是个跨平台的编译工具,先看看在Ubuntu下怎么安装. 首先下载,在/usr目录下: sudo wget -O premake-4.4-beta4-linux.tar.gz http:/ ...

  3. No enclosing instance of type Hello is accessible

    1.static 关键字 修饰的成员被所有对象共享(包括成员变量和方法). 修饰的成员优先于对象存在. 存储于方法区(共享数据区)的静态区中. 静态方法只能访问静态成员. 静态方法中不可以使用this ...

  4. Java多线程实现生产者消费者延伸问题

    在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存. 这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题. 题目 ...

  5. 关于Delphi中TRttiContext.FindType失效的问题

    自从Delphi2010后,Delphi中的Rtti功能得到了增强.我们终于可以不用先RegisterClass,再GetClass获取类的信息了.而只是简单的通过TRttiContext.GetTy ...

  6. Windows Azure入门教学系列 (三):创建第一个Worker Role程序

    在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的Windows Azure开发工具.本教学使用Visual Studio 2010作为开发工具. 步骤一:创建解决方案 ...

  7. cocos2d学习笔录1

    CCDirector的主要作用: 1.访问和改变场景: 2.访问cocos2d-x的配置细节 3.访问视图(OPENGL,UIVIEW,UIWINDOW): 4.暂停,恢复和结束游戏: 5.在UIKi ...

  8. 创建webservice 用service.xml配置(复杂点的方法)

    用Axis2实现Web Service,虽然可以将POJO类放在axis2/WEB-INF/pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中.这 ...

  9. Dropbox + Farbox高速创建免费博客小站

    创建自己的Dropbox账号(已有账号的略过) 注冊地址:Dropbox 点击链接注冊就好了,so easy: 账号注冊成功后,能够选择下载同步client(windows.Mac.ios.andro ...

  10. Servlet过滤器——日志记录过滤器

    1.概述 在实际的项目开发过程中,经常需要在项目运行时,记录并在控制台中输出运行时的日志信息,便于查看项目的运行状况.本实例将介绍如何应用过滤器实现日志记录.运行本实例,将在控制台中输出项目运行时的日 ...