Harris和Shi-tomasi角点检测笔记(详细推导)

news2025/6/15 6:18:21

角点

        一般来说,角点就是极值点,在某些属性上强度最大或者最小的孤立点、线段的终点或拐点等。其实理解角点可以按照我们的直觉来理解,以下图为例,图中用颜色标注的地方都是角点:

        原图地址:理解经典角点检测算法–Harris角点 | 码农家园 

         对于人类来说,判断角点是很容易的,对于计算机来说又是如何检测到角点的呢?

角点的特征

         这幅图应该是所有讲角点特征的时候必用的图了。对于平坦区域,当我们对某个子窗口超各个方向进行移动统计区域内梯度变化的时候,基本不会有明显的梯度变化;对于边来说,在某个方向上梯度有明显变化;对于角来说,移动时各个方向的梯度变化都很明显。

        上图的意思,就是说我们设定一块小区域或小窗口,然后朝着各个方向进行移动,计算出各个方向移动的时候对应的梯度变化,然后进行对所有方向的变化进行加和。用数学公式表达如下:

        其中:

        (x,y)表示窗口w对应的像素坐标位置,有多少个像素点位置取决于窗口的大小

        I(x,y)是像素坐标为(x,y)的像素点的灰度值

        I(x + u, y + v)是像素坐标为(x + u,y + v)的像素点的灰度值

        w(x,y)是一个窗口函数,实际理解为一个权重值就可以了,窗口函数一般有两种思路:

         一种是用边界判断的方法,窗口内的像素权重都取1,窗口外的像素权重都取0.实际上这种方式就相当于没有窗口函数了(Moravec)。

        另一种思路是用高斯函数做加权,如果窗口W中心点是角点时,移动前与移动后, 该点在灰度变化贡献最大;而离窗口w中心(角点)较远的点对灰度变化贡献较小,因此使用二维高斯函数来表示窗口函数是自然而然的事情。

        实际上,上面的式子就是Moravec角点检测算法的核心,这种角点检测方法的(u,v)考虑了0°,45°,90°,135°方向的像素点坐标,实际可以理解为(u,v)取值有四种 (1, 0) , (1,1), (0,1)以及(-1,1)。当然,实际应用中,我们也可以让(u,v)取8个方向的值。

        从Moravec角点检测算法看,它主要有几个缺点:

        1.  不具有旋转不变性和尺度不变性

        2. 算法使用方形窗口,因此的E的响应比较容易受到干扰

        3. 对边缘响应过于灵敏

二元函数泰勒展开

        要理解Harris角点检测,我们需要知道二元函数泰勒展开式。

        这个公式看起来很复杂,实际上对于理解Harris角点检测来说,我们不用关注二阶导以上的部分。关注一下一阶导部分即可,我们将h和k换成前一小节的u和v,则有如下近似:

          其中,f_x(x,y)f_x(x,y)分别表示x的一阶偏导和y的一阶偏导。

Harris角点检测

        Harris角点检测的w窗口函数一般情况选取的是二维高斯函数,当然也可以用其他窗口函数。

        我们先切回到求E的这个等式:

        我们对中括号里的I(x+u,y+v)这一项,进行二元函数泰勒的一阶展开,可得:

        I(x+u,y+v) \approx I(x,y) + uI_x(x,y) + vI_y(x,y)

        将这个式子带回到原始,可得(这里忽略掉窗口函数):

         然后,将这个完全平方展开的式子改写成矩阵形式:

        这个矩阵形式,可以用矩阵乘法计算一下,和之前的式子是相等的。对于求和符号来说,由于u,v和x,y是无关的,我们可以将包含u和v的向量提取出来,得到:

        我们将窗口函数放回来,用一个矩阵M来表示,可以得到:

         最后,我们可以得到E(u,v)和M的相关函数:

        得到这个式子后,我们可以看到,E的值和M是相关的。

        我们再来看M矩阵:

         这是一个实对称矩阵(2阶方阵,元素都是实数,并且转置矩阵和M本身相等),这里不管每一个Ix和Iy取值如何,相加后矩阵仍然是对称的。

        实对称矩阵一定可以做相似对角化,即存在正交矩阵P,使得

P^{-1}MP = \begin{bmatrix} \lambda _1 & 0& \\ 0 & \lambda_2 \end{bmatrix}

        \lambda_1\lambda_2是M的特征值,由上面的式子可以得:

M = P\begin{bmatrix} \lambda _1 & 0& \\ 0 & \lambda_2 \end{bmatrix}P^{-1}

        由于P是正交矩阵,P的转置P^T = P^{-1}  ,因此,有:

        M = P\begin{bmatrix} \lambda _1 & 0& \\ 0 & \lambda_2 \end{bmatrix}P^T

         将M代回到E(u,v),可以得到:

        E(u,v) \approx [u,v]P\begin{bmatrix} \lambda _1 & 0& \\ 0 & \lambda_2 \end{bmatrix}P^T\begin{bmatrix} u\\ v \end{bmatrix} = [u,v]P\begin{bmatrix} \lambda _1 & 0& \\ 0 & \lambda_2 \end{bmatrix}P^T[u,v]^T

        根据矩阵的转置运算规则:(AB)^T = B^TA^T,可以知道:

        P^T[u,v]^T = ([u,v]P)^T

        假设[u,v]P的结果是[u',v'],则有:

        E(u,v) \approx [u',v']\begin{bmatrix} \lambda _1 & 0& \\ 0 & \lambda_2 \end{bmatrix}\begin{bmatrix} u'\\ v' \end{bmatrix}

         将这个式子展开,有:

        E(u,v) \approx (u')^2\lambda_1 + (v')^2\lambda_2 = \frac{u'^2}{\frac{1}{\lambda_1}} + \frac{v'^2}{\frac{1}{\lambda_2}} = \frac{u'^2}{\lambda_1^{-1}} + \frac{v'^2}{\lambda_2^{-1}}

        可以看到,最终得到的式子其实表示的是椭圆的方程。标准椭圆方程为:

        \frac{x^2}{a^2} +\frac{y^2}{b^2} = 1

        可以将前面式子的\lambda_1^{-1}\lambda_2^{-1}对应于a^2b^2,因此这个椭圆的两个轴的长度分别对应于\lambda_1^{-\frac{1}{2}}\lambda_2^{-\frac{1}{2}}。这两个数就是harris角点检测的文章中常常会看到的椭圆的两个轴的参数:

        结合角点检测原理和推导出椭圆方程来看,如果是角点,则E(u,v)的值要大,对应\lambda_1\lambda_2也必须同时都大才能满足。因此我们就知道了下面这幅图的含义:

         对于平坦区域:E(u,v)值非常小,对应\lambda_1\lambda_2也会很小。

        对于边缘:E(u,v)值比平坦区域大,但没有角点的E(u,v)值大,此时要么\lambda_1\lambda_2大很多,要么反过来。

        对于角点:E(u,v)值很大,\lambda_1\lambda_2都比较大,并且两者接近。 

响应函数R

        前面我们基本知道了Harris角点检测的基本原理和推导过程,如果直接使用前面的结论来做检测,理论上是可以的。但是会有一件麻烦事,就是求M矩阵的特征值\lambda_1\lambda_2。有没有比较好的办法不用求它们的值,通过矩阵的一些性质就能估算出\lambda_1\lambda_2的关系呢?答案是有,发明算法的两位大神想到了对称矩阵的行列式detM以及矩阵的迹和\lambda_1\lambda_2之间的关系:

        对矩阵M求行列式值和矩阵的迹的运算显然比计算出特征值要来得简单高效。 那么最终每个像素的像素点响应R被定义为:

        当k取的数值比较合适的时候,这个R响应函数就能较好的反映出\lambda_1\lambda_2之间的关系。

        k是一个经验值,取值一般在(0.04-0.06)。k值越大,会降低角点检测的灵敏度,减少检测角点的数量;减少k值,会增加角点检测的灵敏度,增加检测角点的数量。

        对于是否是焦点的判断,最终就是判断R的值:

  • 角点——R为大数值正数
  • 边缘——为大数值负数
  • 平坦区——为小数值

        Harris角点检测具有旋转不变性,但不具有尺度不变性。

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

Shi-Tomasi 角点检测

        Shi-Tomasi 角点检测改进了Harris角点检测算法的R响应函数,R响应函数更加简单高效。

        Shi-Tomasi 发现角点的稳定性其实和矩阵 M 的较小特征值有关,于是直接用较小的那个特征值作为分数。这样就不用调整k值了。如果矩阵M的两个特征值中较小的那一个大于设定的阈值,那么这个点是角点;如果两个特征值都小于阈值,那较小的特征值也必定小于阈值,那这个点就是平坦区域的点;如果其中一个特征值大于阈值而另外一个特征值小于阈值,那么这个点就是边缘点。所以我们只需要判断矩阵M的两个特征值中较小的那一个特征值是否是大于阈值,如果大于阈值这个点就是强角点。

关于相关线性代数知识比如实对称矩阵的正交对角化和矩阵的行列式、特征值和迹相关内容,可以参考这里:

线性代数学习笔记——第七十四讲——实对称矩阵的相似对角化_实对称矩阵相似对角化_预见未来to50的博客-CSDN博客1. 对任一实对称矩阵,存在正交矩阵,满足矩阵的连乘等于对角矩阵2. 求正交矩阵与对角矩阵的计算步骤3. 实对称矩阵的正交矩阵与对角矩阵的求解示例4. 两个实对称矩阵相似的充要条件是它们有相同的特征值..._实对称矩阵相似对角化https://blog.csdn.net/hpdlzu80100/article/details/100715880

31.《线性代数 》实对称矩阵的正交对角化_哔哩哔哩_bilibili-, 视频播放量 7820、弹幕量 31、点赞数 207、投硬币枚数 112、收藏人数 114、转发人数 35, 视频作者 mathfish2020, 作者简介 厦门大学 余铌娜,相关视频:26.《线性代数》正交矩阵,《线性代数》-厦门大学-余铌娜,8.《线性代数》分块矩阵的行列式,25.《线性代数》规范正交基——施密特(Schmidt)正交化方法,13.《线性代数》用初等变换求逆矩阵及例子,19.《线性代数》向量组的最大无关组与秩-1,36.《线性代数》正定二次型与正定矩阵-1,12.《线性代数》矩阵的初等变换及初等矩阵,38.《线性代数》习题课:二次型、正定矩阵,大学生期末仅剩1小时考线性代数怎么搞https://www.bilibili.com/video/BV1G54y1R76C/?spm_id_from=333.337.search-card.all.click&vd_source=474bff49614e62744eb84e9f8340d91a线性代数——韦达定理、矩阵行列式、矩阵的迹、矩阵特征值及关系_矩阵的迹和特征值关系_xia ge tou lia的博客-CSDN博客一、韦达定理回顾对于一元二次方程(且),设两个根为,。则:且易得到:,以上定理交代了两根之和(积)与方程系数的关系。依次类推:对于一元三次方程,设三个根为,,。易得到:,故对于一元次的方程,我们可以表示为,其中代表第次项的系数,代表常数项。则,二、矩阵的特征值及特征向量回顾以下知识点来自吴传生主编的《线性代数》【知识点1】:设是阶方阵,如果标量和..._矩阵的迹和特征值关系https://blog.csdn.net/huangguohui_123/article/details/105940318       在实对称相似对角化中,如何快速反求矩阵A ?_哔哩哔哩_bilibili不求特征向量,不求逆,减少计算量!, 视频播放量 7367、弹幕量 19、点赞数 142、投硬币枚数 81、收藏人数 149、转发人数 37, 视频作者 KireiIU, 作者简介 Папа агрессивен, а сын ускоряется,相关视频:【俗说矩阵】实对称矩阵和相似对角化究竟有什么关系呢?看了就知道!,对称矩阵相似对角化,怎样将矩阵对角化?,矩阵【相似对角化】的本质+条件,5.1实对称矩阵,反求矩阵的两种方法,实对称矩阵为什么一定可以相似对角化|【线代基础】,已知基础解系反求矩阵A,小可爱们都要会哦。,实对称矩阵的相似对角化及独特性质,正交矩阵及其5条重要性质汇总,以及斯密特正交化,矩阵可对角化条件及实对称矩阵对角化的方法https://www.bilibili.com/video/av718563485/?vd_source=474bff49614e62744eb84e9f8340d91a参考资料:

角点检测harris corner公式推导详解_harris角点推导_WorstCoder的博客-CSDN博客
 Harris角点检测原理推导过程_ha_lee的博客-CSDN博客

计算机视觉——harris角点检测之harris角点响应函数R_-wshuhu-的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#编写dll, VB6.0调用

本周有个任务,实现一个数据上传接口,要求是VB6.0实现。 麻烦的是数据需要DES加密,网上没找到现成的DES VB6实现,于是加密的部分用C#实现,VB6代码调用,折腾一番,参考网上的教程,记录…

基于matlab训练分类网络以对3D点云中的对象进行分类(附源码)

一、前言 示例介绍了中概述的方法,其中点云数据被预处理为体素化编码,然后直接与简单的 3-D 卷积神经网络架构一起使用以执行对象分类。在最近的方法中,点云数据的编码可能更加复杂,并且可以与执行分类/对象检测/分割任务的网络一…

07-图5 Saving James Bond - Hard Version

题目: This time let us consider the situation in the movie “Live and Let Die” in which James Bond, the world’s most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake filled with…

golang cannot find package xxx in any of

目录结构如下 报错 cannot find package xxx in any of 1是路径没配对,把src去掉,因为GOPATH的规则好像是自动识别目录下的src路径,所以改成下面即可 2是别勾这个 否则会如下报错 含义参考 Enable Go modules integration在做什么 - 知乎 gol…

video-08-videojs黑屏问题(详解总结)

博主在开发的时候遇到这种情况,video黑屏问题,问题有两种情况,一种是视频黑屏且不可以播放,另一种是视频黑屏且自己播放,事件可以监听到 目录 一、问题类型1 视频黑屏且不可以播放 1.1 原因 1.2 解决方案思路 1.3 代…

fast admin报错:Unexpected token ‘<‘, “ (已解决)

报错信息: 在新加视图的时候的,点击编辑/添加忽然报这个错误,网上找了半天,js、视图、修修改改最后竟是一个小问题; 解决方法: 改为: 简单的说就是:btn-ajax ->btn-dialog

C# 二叉树的后序遍历

145 二叉树的后序遍历 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[3,2,1] 示例 2: 输入:root [] 输出:[] 示例 3: 输入…

php未定义索引数组怎么解决

在PHP中,如果使用一个未定义的数组索引,就会出现未定义索引错误。在这种情况下,需要采取措施解决这个问题。本文将为您介绍几种解决php未定义索引数组的方法。 1.使用isset()函数检查数组索引是否存在 使用函数isset()可以检查一个变量是否…

A股股民调查:58%股民表示“亏惨了”

A股上半年赚钱效应究竟如何? 东方财富网的一份调查显示,有58%的股民表示今年上半年亏惨了,另有9%的股民略有浮亏。 成交“先冷后热”、基金发行遇冷 A股的上半年已正式收官!A股三大指数上半年涨跌不一,其中沪指累涨…

希尔排序(C语言)

希尔排序 一、希尔排序的原理二、动图演示三、代码实现四、实现从小到大排序五、希尔排序的优缺点 一、希尔排序的原理 希尔排序是插入排序的一种更高效的改进版本。 1.将原始待排数据按照设定的增量gap分成多组,每组有n / gap个元素。 2.对这些分组进行插入排序&a…

Linux 学习记录43(C++篇)

Linux 学习记录43(C篇) 本文目录 Linux 学习记录43(C篇)一、友元1. 友元函数(1. 全局函数作为友元函数(2. 类中的成员函数作为友元 2. 友元类3. 友元的注意事项 二、常成员函数和常对象(const)1.常成员函数2. 常对象3. mutable 关键字 三、运算符重载1. 常见的运算符2. 运算符重…

【海思SS528 | MPP】音频例程 sample_audio.c 源码阅读笔记

目录 一、概述二、main 函数解析三、main_inner 函数解析四、sample_audio_ai_ao 函数解析4.1 Audio Codec相关配置 五 一、概述 上篇文章 【海思SS528】MPP媒体处理软件V5.0 | 音频模块 - 学习笔记 学习了海思MPP媒体处理平台的一小部分音频知识,这篇文章继续学习与…

(5)深度学习学习笔记-多层感知机

文章目录 多层感知机和激活函数代码来源 多层感知机和激活函数 通过在网络中加入一个或多个隐藏层来克服线性模型的限制,使其能处理更普遍的函数关系类型。最简单的方法是将多个全连接层堆叠在一起。每一层都输出到上面的层,直到生成最后的输出&#xf…

Android12之ServiceManager::addService添加服务的本质(一百五十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Python-创建虚拟环境并指定环境目录

1.简介 程序运行依赖于环境,不同程序依赖的环境不尽相同。如果一个项目依赖于一个第三方库的1.0版本,另一个项目依赖于这个第三方库的2.0版本,在一个python环境中一个库只能同时存在一个版本,所以就产生了版本冲突。虚拟环境就是为…

git 显示不出图标

今天写完代码准备上传 gitee 的时候发现,自己的本地文件夹没有小绿勾了,整的我一时分不清到底哪些文件已经上传过。 研究了半天终于搞定了,现在把方法记录下来,防止以后继续出现这种问题还要找半天。 1. 打开注册表 win R 打开运…

【Python 随练】按键变色

题目: Press any key to change color, do you want to try it. Please hurry up! 简介: 在本篇博客中,我们将解决一个编程问题:按下任意键改变颜色。我们将提供一个完整的代码示例来实现这个功能,并鼓励读者尝试。…

亚马逊云科技自研芯片,为企业云服务提高性价比

6月27日至28日,2023亚马逊云科技中国峰会于上海顺利召开。在本次峰会上,似乎找寻到了云计算领域竞争对手均日渐成熟,而亚马逊云科技却能一直保持领先地位的原因——过去的十几年里,亚马逊云科技“基于客户需求,快速进行…

gnutls_handshake() failed: The TLS connection was non-properly terminated.

从远程仓库获取所有更新,并保存在本地时,使用git fetch 命令时出现如下错误: 解决办法: 问题解决: 参考资料 拉取github报错 gnutls_handshake() failed: The TLS connection was non-properly terminated. git获取…

proteus三级管(NPN)仿真LED灯串的开关

实验里设置LED灯的导通电压为1.2V 打开仿真开关后可以看到,此时三极管不导通,LED灯亮了,并且电压表和电流探针有数值显示 按下按键,三级管导通,LED灯灭