1. 不同类型的角点

在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来定义角点可以有以下两种定义:

  1. 角点可以是两个边缘的角点;
  2. 角点是邻域内具有两个主方向的特征点;

前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败。早期主要有Rosenfeld和Freeman等人的方法,后期有CSS等方法。

基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺陷,此类方法主要有Moravec算子、Forstner算子、Harris算子、SUSAN算子等。

这篇文章主要介绍的Harris角点检测的算法原理,比较著名的角点检测方法还有jianbo Shi和Carlo Tomasi提出的Shi-Tomasi算法,这个算法开始主要是为了解决跟踪问题,用来衡量两幅图像的相似度,我们也可以把它看为Harris算法的改进。OpenCV中已经对它进行了实现,接口函数名为GoodFeaturesToTrack()。另外还有一个著名的角点检测算子即SUSAN算子,SUSAN是Smallest Univalue Segment Assimilating Nucleus(最小核值相似区)的缩写。SUSAN使用一个圆形模板和一个圆的中心点,通过圆中心点像素与模板圆内其他像素值的比较,统计出与圆中心像素近似的像元数量,当这样的像元数量小于某一个阈值时,就被认为是要检测的角点。我觉得可以把SUSAN算子看为Harris算法的一个简化。这个算法原理非常简单,算法效率也高,所以在OpenCV中,它的接口函数名称为:FAST() 。

2. Harris角点

2.1 基本原理

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。

对于图像I(x,y)I(x,y),当在点(x,y)(x,y)处平移(Δx,Δy)(Δx,Δy)后的自相似性,可以通过自相关函数给出:

c(x,y;Δx,Δy)=∑(u,v)∈W(x,y)w(u,v)(I(u,v)–I(u+Δx,v+Δy))2c(x,y;Δx,Δy)=∑(u,v)∈W(x,y)w(u,v)(I(u,v)–I(u+Δx,v+Δy))2

其中,W(x,y)W(x,y)是以点(x,y)(x,y)为中心的窗口,w(u,v)w(u,v)为加权函数,它既可是常数,也可以是高斯加权函数。

椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。共可分为三种情况:

  • 图像中的直线。一个特征值大,另一个特征值小,λ1≫λ2λ1≫λ2或λ2≫λ1λ2≫λ1。自相关函数值在某一方向上大,在其他方向上小。
  • 图像中的平面。两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。
  • 图像中的角点。两个特征值都大,且近似相等,自相关函数在所有方向都增大。

2.2 Harris角点算法实现

5. 在3×33×3或5×55×5的邻域内进行非最大值抑制,局部最大值点即为图像中的角点。

Harris角点检测的C++实现代码:https://github.com/RonnyYoung/ImageFeatures/blob/master/source/harris.cpp

2.3 Harris角点的性质

由此,可以得出这样的结论:增大αα的值,将减小角点响应值RR,降低角点检测的灵性,减少被检测角点的数量;减小αα值,将增大角点响应值RR,增加角点检测的灵敏性,增加被检测角点的数量。

2. Harris角点检测算子对亮度和对比度的变化不敏感

这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。

 

3. Harris角点检测算子具有旋转不变性

Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值RR也不发生变化,由此说明Harris角点检测算子具有旋转不变性。

4. Harris角点检测算子不具有尺度不变性

如下图所示,当右图被缩小时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的。左侧的图像可能被检测为边缘或曲线,而右侧的图像则可能被检测为一个角点。

2.4 Harris的OpenCV接口

OpenCV的Hairrs角点检测的函数为cornerHairrs(),但是它的输出是一幅浮点值图像,浮点值越高,表明越可能是特征角点,我们需要对图像进行阈值化。

C++: void cornerHarris(InputArray src, OutputArray dst, int blockSize, int apertureSize, double k, int borderType = BORDER_DEFAULT);
  • src – 输入的单通道8-bit或浮点图像。
  • dst – 存储着Harris角点响应的图像矩阵,大小与输入图像大小相同,是一个浮点型矩阵。
  • blockSize – 邻域大小。
  • apertureSize – 扩展的微分算子大。
  • k – 响应公式中的,参数αα。
  • boderType – 边界处理的类型。
int main()
{Mat image = imread("../buliding.png");Mat gray;cvtColor(image, gray, CV_BGR2GRAY);Mat cornerStrength;cornerHarris(gray, cornerStrength, 3, 3, 0.01);threshold(cornerStrength, cornerStrength, 0.001, 255, THRESH_BINARY);return 0;
}

        

从上面上间一幅图像我们可以看到,有很多角点都是粘连在一起的,我们下面通过加入非极大值抑制来进一步去除一些粘在一起的角点。

非极大值抑制原理是,在一个窗口内,如果有多个角点则用值最大的那个角点,其他的角点都删除,窗口大小这里我们用3*3,程序中通过图像的膨胀运算来达到检测极大值的目的,因为默认参数的膨胀运算就是用窗口内的最大值替代当前的灰度值。

int main()
{Mat image = imread("buliding.png");Mat gray;cvtColor(image, gray, CV_BGR2GRAY);Mat cornerStrength;cornerHarris(gray, cornerStrength, 3, 3, 0.01);double maxStrength;double minStrength;// 找到图像中的最大、最小值minMaxLoc(cornerStrength, &minStrength, &maxStrength);Mat dilated;Mat locaMax;// 膨胀图像,最找出图像中全部的局部最大值点dilate(cornerStrength, dilated, Mat());// compare是一个逻辑比较函数,返回两幅图像中对应点相同的二值图像compare(cornerStrength, dilated, locaMax, CMP_EQ);Mat cornerMap;double qualityLevel = 0.01;double th = qualityLevel*maxStrength; // 阈值计算threshold(cornerStrength, cornerMap, th, 255, THRESH_BINARY);cornerMap.convertTo(cornerMap, CV_8U);// 逐点的位运算bitwise_and(cornerMap, locaMax, cornerMap);drawCornerOnImage(image, cornerMap);namedWindow("result");imshow("result", image);waitKey();return 0;
}
void drawCornerOnImage(Mat& image, const Mat&binary)
{Mat_<uchar>::const_iterator it = binary.begin<uchar>();Mat_<uchar>::const_iterator itd = binary.end<uchar>();for (int i = 0; it != itd; it++, i++){if (*it)circle(image, Point(i%image.cols, i / image.cols), 3, Scalar(0, 255, 0), 1);}
}

现在我们得到的效果就比默认的函数得到的结果有相当的改善,如上面最右边效果图。

3. 多尺度Harris角点

3.1 多尺度Harris角点的原理

虽然Harris角点检测算子具有部分图像灰度变化的不变性和旋转不变性,但它不具有尺度不变性。但是尺度不变性对图像特征来说至关重要。人们在使用肉眼识别物体时,不管物体远近,尺寸的变化都能认识物体,这是因为人的眼睛在辨识物体时具有较强的尺度不变性。在图像特征提取:尺度空间理论这篇文章里就已经讲到了高斯尺度空间的概念。下面将Harris角点检测算子与高斯尺度空间表示相结合,使用Harris角点检测算子具有尺度的不变性。

3.2 多尺度Harris角点实现

多尺度Harris角点检测C++实现:https://github.com/RonnyYoung/ImageFeatures/blob/master/source/harrisLaplace.cpp

4. 更多的讨论

在上面描述的Harris角点具有光照不变性、旋转不变性、尺度不变性,但是严格意义上来说并不具备仿射不变性。Harris-Affine是一种新颖的检测仿射不变特征点的方法,可以处理明显的仿射变换,包括大尺度变化和明显的视角变化。Harris-Affine主要是依据了以下三个思路:

  1. 特征点周围的二阶矩的计算对区域进行的归一化,具有仿射不变性;
  2. 通过在尺度空间上归一化微分的局部极大值求解来精化对应尺度;
  3. 自适应仿射Harris检测器能够精确定位牲点;

这篇文章不对Harris-Affine作进一步的描述,有时间会对这一算法做专门的分析,有兴趣的可以参考原论文:Scale & Affine Invariant Interest Point Detectors.

5. 参考资料

[1] 《图像局部不变特征与描述》王永明,王贵锦。

[2] Harris角点及Shi-Tomasi角点检测

[3] 图像特征提取PPT

[4] Harris角点检测算法 1

[5] OpenCV Harris角点检测

[6] Opencv学习笔记(五)Harris角点检测

Harris角点详细解释相关推荐

  1. 【理解】经典角点检测算法--Harris角点

    目录 什么是角点 角点检测算法的原始思想: Harris角点检测原理 Harris角点算法的基本步骤 实践: Harris角点检测可能会用到的OpenCV API: 手写API: 1.展示图片: 2. ...

  2. fast角点检测 java,[Computer Vision]Harris角点检测的详细推导

    Harris角点检测 思想 为什么要检测角点呢?因为角点的特征比较明显.进行角点检测的朴素思想是利用图像梯度,也就是根据图像强度的变化来寻找角点.如图所示 这里举了个例子,给定一个小的区域(Patch ...

  3. OpenCV角点检测之Harris角点检测

    本篇文章中,我们一起探讨了OpenCV中Harris角点检测相关的知识点,学习了OpenCV中实现Harris角点检测的cornerHarris函数的使用方法.此博文一共有两个配套的麻雀虽小但五脏俱全 ...

  4. android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio

    实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...

  5. Harris Corner(Harris角检测)

    一.引言:关于兴趣点(interest points) 在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points ...

  6. harris角点检测c语言,Harris角点检测原理及实现

    为便于理解,先简要介绍角点的概念和角点检测背景 一.角点及角点检测背景: 角点概念: 角点,通常可理解为两条边的角点,也可理解为像素值在多个方向有显著变化的点或局部区域内某个属性明显的点.如多个轮廓的 ...

  7. Harris 角点检测

    角点的一个特性:向任何方向移动变化都很大. Chris_Harris 和 Mike_Stephens 早在 1988 年的文章<A CombinedCorner and Edge Detecto ...

  8. 【OpenCV十六新手教程】OpenCV角检测Harris角点检测

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

  9. OpenCV之feature2d 模块. 2D特征框架(1)Harris 角点检测子 Shi-Tomasi角点检测子 定制化创建角点检测子 亚像素级的角点检测 特征点检测

    Harris 角点检测子 目标 本教程中我们将涉及: 有哪些特征?它们有什么用? 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点. 理论 有哪些特征? 在计算机视 ...

最新文章

  1. Android studio 开发工具,试图预览工具不见了找会设置
  2. 强强联合!智源x清华AIR,共启 AI 健康研究新篇章
  3. 最小外接矩形思路以及实现
  4. TCP源端口选择算法与列维模型
  5. oopc——4.继承
  6. 如何在Linux下用C/C++语言操作数据库sqlite3(很不错!设计编译链接等很多问题!)...
  7. 凯尔卡C68全球版汽车电脑诊断仪
  8. linux三种连接方式
  9. [电影]十七岁的单车
  10. axios.js post 后台木有数据
  11. OpenWrt加入iptables 支持过滤字符串
  12. 编译OpenJDK8:CoreLibraries.gmk:37/e_acos.obj/BuildJdk.gmk:70/Main.gmk:116/错误
  13. 小菜编程成长记(十一 无熟人难办事?——聊设计模式迪米特法则)
  14. 详解嵌入式系统知识和接口技术总结
  15. 注册控件失败之一:提示0x80040200错误的处理办法
  16. Maven传递依赖无法引入问题(The POM for xxx is invalid)
  17. 什么是AOP(面向切片编程)
  18. C语言练习-[1005]温度转换
  19. python中复数的实部和虚部都是浮点数_Python学习笔记:从入门到放弃(2)基本语法...
  20. 7.面向对象进阶(1)

热门文章

  1. 关于入门C语言编写简易程序的一些思路
  2. keyshot渲染教程 之厨房场景玻璃静物渲染以及跑车渲染
  3. 人生总要有所珍视和眷恋
  4. mysql主从搭建详细步骤
  5. PHP与JAVA循环性能比较
  6. 操作国外lead网赚项目,所需要的软件和工具介绍!
  7. 《卡尔曼滤波原理及应用-MATLAB仿真》程序-5.3UKF
  8. Vue的新型前端构建工具Vite怎么用
  9. 『NLP学习笔记』BERT文本分类实战
  10. PostgreSQL 慢查询获取