目录

1、角点概述

2、数学知识

3、Harris角点检测基本原理

4、优化改进


1、角点概述

如果一个点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点,也就是一阶导数(即灰度图的梯度)中的局部最大所对应的像素点就是角点。在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。基于图像灰度的方法通过计算点的曲率及梯度来检测角点。

2、数学知识

1)泰勒展开

泰勒展开公式是一种统一的形式,非常完美。

一维泰勒展开公式:

二维泰勒展开公式:

2)矩阵的特征值和特征向量

harris边角(兴趣点)检测算法 - 知乎

3、Harris角点检测基本原理

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

Harris 检测器具有旋转不变性,但不具有尺度不变性,也就是说尺度变化可能会导致角点变为边缘,如下图所示:

想要尺度不变特性的话,可以关注SIFT特征。

Harris 角点检测算法分为以下三步:

1、当窗口同时向 x 和 y 两个方向移动时,计算窗口内部的像素值变化量E(u,v);

2、对于每个窗口,都计算其对应的一个角点响应函数R;

3、然后对该函数进行阈值处理,如果R > threshold,表示该窗口对应一个角点特征。

E(u,v)推导过程:

首先,将图像窗口平移[u,v]产生灰度变化的自相关函数如下:

其中窗口函数(权重矩阵)可以是平坦的,也可以是高斯的,是一个二维的滤波器。对于一个角点来说, E(u,v)会非常大。因此,我们可以最大化上面这个函数来得到图像中的角点。用上面的函数计算会非常慢。因此,我们使用泰勒展开式(只有一阶)来得到这个公式的近似形式。

将平移后的式子进行泰勒展开如下:

其中Ix和Iy是I的偏微分,在图像中就是在x和y方向的梯度图(可以通过cv2.Sobel()来得到):

接下来继续推导:

把u和v拿出来,得到最终的形式:

其中矩阵M为:

最后是把实对称矩阵对角化处理后的结果,可以把R看成旋转因子,其不影响两个正交方向的变化分量。经对角化处理后,将两个正交方向的变化分量提取出来,就是 λ1 和 λ2(特征值)。

对于图像的每一个像素点(x,y),对应一个以该像素为中心的窗口w(x,y),然后该像素平移(u,v)得到新的像素点(x+u,y+v),而E(u,v)就是窗口中所有像素的加权和乘以不同位置像素的灰度差值。

矩阵M又称为Harris矩阵。w(x,y)的宽度决定了在像素x 周围的感兴趣区域。

计算响应函数R:

得到E(u,v)的最终形式,我们的目的是要找到会引起较大的灰度值变化的那些窗口。灰度值变化的大小则取决于矩阵M,那么如何找到这些窗口,我们可以使用矩阵的特征值来实现。

忽略余项之后的表达式为一个二项式函数,然而二项式函数的本质上就是一个椭圆函数,椭圆的扁率和尺寸是由M(x,y)的特征值λ1、λ2决定的,椭圆的方向是由M(x,y)的特征矢量决定的,如下图所示,椭圆方程为:

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

a)图像中的直线。一个特征值大,另一个特征值小,λ1>λ2或λ2>λ1。自相关函数值在某一方向上大,在其他方向上小。

b)图像中的平面。两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。

c)图像中的角点。两个特征值都大,且近似相等,自相关函数在所有方向都增大。

通过M的两个特征值λ1和λ2的大小对图像点进行分类:

如果λ1和λ2都很小,图像窗口在所有方向上移动都无明显灰度变化。由于我们是通过M的两个特征值的大小对图像进行分类,所以,定义角点相应函数R:

其中k为经验常数,一般取k=0.04~0.06。为了去除加权常数κ,我们通常使用商数detM/(traceM)2作为指示器。所以,上图可以转化为:

因为特征值λ1和λ2决定了R的值,R 只与M的特征值有关,所以我们可以用特征值来决定一个窗口是平面、边缘还是角点。

平面:该窗口在平坦区域上滑动,窗口内的灰度值基本不会发生变化,所以|R|值非常小,在水平和竖直方向的变化量均较小,即Ix和Iy都较小,那么λ1和λ2都较小;

边缘:R值为负数,仅在水平或竖直方向有较大的变化量,即Ix和Iy只有一个较大,也就是λ1>>λ2或λ2>>λ1;

角点:R值很大,在水平、竖直两个方向上变化均较大的点,即Ix和Iy都较大,也就是λ1和λ2都很大。

最优角点判别:

根据R的值,将这个窗口所在的区域划分为平面、边缘或角点。为了得到最优的角点,我们还可以使用非极大值抑制。

Harris角点检测的结果是带有这些分数R的灰度图像,设定一个阈值,R > threshold,分数大于这个阈值的像素就对应角点。

4、优化改进

1)由于Harris角点检测算法的稳定性和k值有关,而k是个经验值,不好设定最佳值。

Shi-Tomasi发现,角点的稳定性其实和矩阵M的较小特征值有关,于是直接用较小的那个特征值作为分数。这样就不用调整k值了。

所以Shi-Tomasi将分数公式改为如下形式:

和Harris一样,如果该分数大于设定的阈值,我们就认为它是一个角点。

2)Harris和Shi-Tomasi都是基于梯度计算的角点检测方法,Shi-Tomasi的效果要好一些。基于梯度的检测方法有一些缺点: 计算复杂度高,图像中的噪声可以阻碍梯度计算。

想要提高检测速度的话,可以考虑基于模板的方法:FAST角点检测算法。该算法原理比较简单,但实时性很强。

3)Harris 检测器具有旋转不变性,但不具有尺度不变性,也就是说尺度变化可能会导致角点变为边缘,如下图所示:

想要尺度不变特性的话,可以关注SIFT特征。

相关链接:

1、harris角点检测算法实现

2、SHI-TOMASI角点检测

harris角点检测原理相关推荐

  1. Harris角点检测原理详解(转载)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lwzkiller/article/details/54633670 关于角点的应用在图像处理上比较广 ...

  2. Harris角点检测原理详解

    Harris角点特征提取算法流程: Harris角点检测的缺点:不能应对尺度变换 关于角点的应用在图像处理上比较广泛,如图像匹配(FPM特征点匹配).相机标定等.网上也有很多博客对Harris角点检测 ...

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

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

  4. Harris 角点检测原理及实现

    1. 图像中角点定义 沿各个方向,图像灰度均发生变化: 2.Harris原理 Harris中也是根据角点定义经角点定义,Harris中使用该像素点周围像素块和其周围的其它像素块的相关性刻画角点,相关性 ...

  5. Harris 角点检测原理详解

    var html = document.getElementById("artContent").innerHTML; document.getElementById(" ...

  6. Harris角点检测原理-

    本文是本人看bilibili教学结合官方文档的观后笔记,链接在下: (全)基于python的Opencv项目实战_哔哩哔哩_bilibili 如果有什么理解不到位的地方,欢迎指正. 理论: 先放角点定 ...

  7. 特征提取与检测(一)---Harris与Shi-Tomasi角点检测原理

    一.Harris角点检测原理 1. 何为角点? 下面有两幅不同视角的图像,通过找出对应的角点进行匹配. 我们可以直观的概括下角点所具有的特征: >轮廓之间的交点: >对于同一场景,即使视角 ...

  8. 基于Python手动实现Harris角点检测

    最近在上数字图像处理课程,需要使用Python手动编写Harris角点检测算法,但是网上几乎没有找到手动编写的,只能手敲. 同时作为自己的第一篇博客,在这里记录一下. 一.Harris角点检测 原理( ...

  9. Harris角点检测python实现及基于opencv实现

    写在前面: 黄宁然, 七月,骄阳似火. 参考文献镇楼: [1]袁志聪,基于harris特征的点云配准方法研究 [2]高亭,基于改进Harris角点检测的印刷体文档图像检索技术 [3]景庆阳,基于har ...

最新文章

  1. Windows Server 2016第三个技术预览版新技术
  2. 寄存器(内存访问)---汇编学习笔记
  3. jdk1.8新特性(四)——Optional
  4. 【springboot】之 解析@EnableWebMvc 、WebMvcConfigurationSupport和WebMvcConfigurationAdapter
  5. SQL查询中having和where的异同点
  6. Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
  7. [线性代数] 对网络上一篇讲解特征值分解的物理意义的文章的批注
  8. 学习Web前端技术,掌握JavaScript这门语言是必须的
  9. Nginx 下部署 HTTPS 与安全调优
  10. python基于经纬度距离汇聚点_python实现两个经纬度点之间的距离和方位角
  11. 关于Mysql8.0.26版本与IDEA连接的配置
  12. 手机扫码枪app,二维码识别,二维码信息自动推送至电脑的(Excel,软件,记事本)等位置。
  13. 数据库中的日期相减_sql日期相减得到天数【sql日期时间相减语句】
  14. webrtc中的码率控制
  15. bitcode 是什么_secured是什么意思 Secured borrowings是什么意思
  16. c#文件名去掉后缀_C# 怎么去掉文件名后缀
  17. 《MLB美职棒大联盟》:世界大赛最有价值球员奖
  18. 如何从无到有设计一款字体
  19. Kafka-我发的消息都发到哪儿去了?
  20. 《Internet 路由结构(第2版•修订版)》一7.6 参考资料

热门文章

  1. Centos7 编译安装Nginx
  2. 个人网站价值表现的几个方向(做一个有价值的个人网站)
  3. ROG 幻 16 2022 款怎么样
  4. dcl并列控件 lisp_CAD autolisp jjj-dcl-make函数
  5. Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
  6. PHP 中实现 RC4加密解密
  7. 微应用如何实现自动更新提示
  8. GSM模块信号强度CSQ与RSSI的对应关系,新增android的ASU
  9. MacOS Brew搭建PHP开发环境
  10. rust的矿坑_转: Rust中的Pin详解 【Rust语言中文社区】