【仔细理解】计算机视觉基础1——特征提取之Harris角点

news2024/9/27 9:26:40

Harris角点是图像特征提取中最基本的方法,本篇内容将详细分析Harris角点的定义、计算方法、特点。

一、Harris角点定义

在这里插入图片描述

在图像中,若以正方形的小像素窗口为基本单位,按照上图可以将它们划分三种类型如下:

  • 平坦区域:在任何方向上移动窗口,窗口内容变化都不大
  • 边缘:在某一方向上移动窗口,窗口内容变化较大(如图中上下移动基本不变,而左右移动时窗口内容变化较大)
  • 角点:在任何方向上移动窗口,窗口内容变化都很大

从人类角度直观理解,图像的关键特征点应该是那些与周围图像存在明显差异的点。
(以灰度图为例,其实就是该点的灰度值与周围点差别较大,那么就可以通过计算其与周围点的灰度差值,即导数来判断)。

以像素窗口为基本单位时,我们将这些与周围图像差异较大的小窗口称为角点,用它们就可以代表图像中具有辨别性的、关键特征区域。

二、Harris角点计算方法

1. 计算窗口内容差异情况

角点是指与周围存在较大内容差异的像素窗口,那么我们首先要给出小窗口与周围窗口的差异情况的计算方法,在方向(u,v)上移动称之为窗口响应值E(u,v)
在这里插入图片描述
E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u,v)=\sum_{x,y}w(x,y)[I(x+u,y+v)-I(x,y)]^2 E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2

  • 红色小窗口为原始窗口用I(x,y)表示,绿色为移动后的窗口I(x+u,y+v),其中(u,v)其实便代表了移动的方向。
  • w(x,y)代表了原始窗口中不同像素点的权重
  • 公式含义即为将移动前后每个像素的灰度值差求平方,并根据各像素点权重求和作为两个窗口的内容差异E(u,v)

2.窗口内容差异E =》由矩阵M决定

为了更方便的计算窗口在移动前后的响应值,我们将E(u,v)的公式进行一系列的数学变换,首先是做二元泰勒展开:
在这里插入图片描述
展开式前两项为0,最后一项可以通过矩阵的形式表示为:
E ( u , v ) ≈ [ u v ] M [ u v ] E(u,v) ≈ \begin{bmatrix} u&v\end{bmatrix} M \begin{bmatrix} u \\ v \end{bmatrix} E(u,v)[uv]M[uv]
M = ∑ x , y w ( x , y ) [ I x 2 I x I y I x I y I y 2 ] M=\sum_{x,y}w(x,y)\begin{bmatrix}I_{x}^2&I_xI_y\\ I_xI_y&I_{y}^2\end{bmatrix} M=x,yw(x,y)[Ix2IxIyIxIyIy2]

根据公式我们发现,E(u,v)的取值即窗口在不同方向(u,v)移动后的相对差异情况关键取决于矩阵M,即不用关心方向(u,v),而是通过矩阵M就可以判断是否为角点 I x I_x Ix代表在x方向上的梯度)

3.窗口内容差异E =》由矩阵M决定 =》由特征值λ决定

通过矩阵M判断角点可以进一步简化为通过矩阵M的特征值λ来判断。

当M可以变化为对角矩阵时(不能对角化的情况稍后说明),E(u,v)最终结果为 u 2 λ 1 + v 2 λ 2 u^{2}λ_{1}+v^{2}λ_{2} u2λ1+v2λ2,假设取值为常数c(取1),即有:
在这里插入图片描述

E ( u , v ) = [ u v ] [ λ 1 0 0 λ 2 ] [ u v ] = u 2 λ 1 + v 2 λ 2 E(u,v)=\begin{bmatrix} u&v\end{bmatrix} \begin{bmatrix}λ_{1}&0\\0&λ_{2}\end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix}=u^{2}λ_{1}+v^{2}λ_{2} E(u,v)=[uv][λ100λ2][uv]=u2λ1+v2λ2
u 2 λ 1 + v 2 λ 2 = 1 \frac{u^2}{λ_{1}}+\frac{v^2}{λ_{2}}=1 λ1u2+λ2v2=1
该方程的几何表示为椭圆如下:
在这里插入图片描述

  • 即当在以长短轴为方向的坐标系上,椭圆边界线上为移动后具有相同响应值E(u,v)的点
  • 即当要让窗口移动后具有相同响应值(内容差异),沿短轴方向移动最短距离,沿长轴移动需要的距离最长——代表短轴是梯度变化最快的方向,长轴是梯度变化最慢方向

若二阶矩矩阵M不能直接对角化时,我们可以将其转为以下形式:
M = R − 1 [ λ 1 0 0 λ 2 ] R M=R^{-1} \begin{bmatrix}λ_1&0\\0&λ_2 \end{bmatrix}R M=R1[λ100λ2]R
其中R为旋转矩阵,即此时几何表示为发生了旋转的椭圆,而长短轴依然代表梯度变化最慢和最快的方向:

在这里插入图片描述

因此,根据角点的定义可知——任何方向上都有较大梯度变化 =》椭圆的长短轴都要短 =》特征值 λ 1 λ_{1} λ1 λ 2 λ_{2} λ2都要大

在这里插入图片描述

  • λ 1 λ_{1} λ1 λ 2 λ_{2} λ2都大,在任何方向梯度都大、E增加的快,即为角点
  • λ 1 λ_{1} λ1 λ 2 λ_{2} λ2其中一个远比另一个大,则说明在最快方向变化特快、同时有一个方向几乎不变,这是边缘区域
  • λ 1 λ_{1} λ1 λ 2 λ_{2} λ2都很小,在任何方向梯度逗笑、E变化的慢,即为平坦区域

4.窗口内容差异E =》由矩阵M决定 =》由特征值λ决定 =》由计算R决定

R由特征值 λ 1 λ_{1} λ1 λ 2 λ_{2} λ2计算得到,公式为:
R = D e t ( M ) − α ∗ T r a c e ( M ) 2 = λ 1 λ 2 − α ( λ 1 + λ 2 ) 2 R=Det(M)-α*Trace(M)^2=λ_{1}λ_{2}-α(λ_{1}+λ_{2})^2 R=Det(M)αTrace(M)2=λ1λ2α(λ1+λ2)2
可知当 λ 1 λ_{1} λ1 λ 2 λ_{2} λ2分别处于3中所说的三种状态时,对应R有:
在这里插入图片描述

  • λ 1 λ_{1} λ1 λ 2 λ_{2} λ2都大,R>0,即为角点
  • λ 1 λ_{1} λ1 λ 2 λ_{2} λ2其中一个远比另一个大,R<0,这是边缘区域
  • λ 1 λ_{1} λ1 λ 2 λ_{2} λ2都很小,R接近0,即为平坦区域

三、Harris角点的特点

在这里插入图片描述
上图为使用Harris角点检测获取的关键点。

对于理想的图像特征点,应该可以抵抗光照、旋转、平移、尺度等变化,即具有不变性(Invariance)或协变性(Covariance)

  • 不变性(Invariance):变换后原特征点仍能被检测出来、且位置不变;
  • 协变性(Covariance):变换后原特征点仍能被检测出来,但位置可能发生变化

3.1 优点

针对Harris角点来说,能够抵抗光照、旋转、平移变换(该部分图片来自知乎@饭饭):
在这里插入图片描述

光照:光照变换会使得区域像素灰度值整体提高或降低

  • 当增量或这减量相同(灰度平移)时,对基于像素间灰度差值(梯度)的角点判断方法不影响,已经被检测出来的角点能够保持不变性
  • 当相比原来灰度成倍增加或减少(尺度平移),阈值不变时可能导致检测角点的数量增加或减少,但同时被检测出的相同角点位置不变

在这里插入图片描述

旋转:当发生旋转时,相当于二阶矩矩阵对应几何椭圆旋转(即梯度变化最快最慢的方向发生变化),但特征值不变角点本身只有位置可能发生了变化,即具有协变性
平移:与旋转类似,角点位置发生变化,具有协变性,但梯度变化最快最慢方向不变

3.2 缺点

在这里插入图片描述

Harris角点并不具有尺度不变性,当图像尺度缩小时,原来的角点区域可能被判断为边缘、甚至进一步平坦区域;反之尺度放大时也会导致原角点找不到对应角点的情况出现;为了在此基础上保持尺度不变性,可以使用后续的SIFT特征检测方法。

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

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

相关文章

【C++】Visual Studio C++使用配置Json库文件(老爷式教学)

在visual studio中使用C调用Json的三方库有很多种办法&#xff0c;这里简述一种比较方便的方法。绝对好用&#xff0c;不好用你砍我。 文章目录在visual studio中使用C调用Json的三方库有很多种办法&#xff0c;这里简述一种比较方便的方法。绝对好用&#xff0c;不好用你砍我。…

百度前端一面高频react面试题指南

React 高阶组件、Render props、hooks 有什么区别&#xff0c;为什么要不断迭代 这三者是目前react解决代码复用的主要方式&#xff1a; 高阶组件&#xff08;HOC&#xff09;是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分&#xff0c;它是一…

Python 零基础入门必看,这些知识点你都掌握了吗?

导读 Python 作为当今最受欢迎的编程语言之一&#xff0c;几乎各个领域都会涉及到&#xff0c;所以学习 Python 自然刻不容缓&#xff01;作为一个没有接触过 Python 的小白&#xff0c;一开始要想的不是如何使用以及各种高深莫测的玩法&#xff0c;从最基础的了解以及构建环境…

node笔记

一、FS模块 fs.readFile查询文件 fs.writeFile修改文件 __dirname表示当前文件所处的目录&#xff08;双下划线&#xff09; 二、path模块 什么是path 路径模块 path模块是Node.,js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户…

Spring 之bean的生命周期

文章目录IOCBean的生命周期运行结果实例演示实体类实例化前后置代码初始化的前后置代码application.xml总结今天我们来聊一下Spring Bean的生命周期&#xff0c;这是一个非常重要的问题&#xff0c;Spring Bean的生命周期也是比较复杂的。IOC IOC&#xff0c;控制反转概念需要…

华为OD机试题,用 Java 解【合规数组】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

JAVA基础常见面试题

1.Java接口和抽象类的区别&#xff1f; 接口 接口中不能定义构造器 方法全部都是抽象方法&#xff0c;JDK8提供方法默认实现 接口中的成员都是public的 接口中定义的成员变量实际上都是常量 一个类可以实现多个接口 抽象类 抽象类中可以定义构造器 可以有抽象方法和具体…

字节序

字节序 字节序&#xff1a;字节在内存中存储的顺序。 小端字节序&#xff1a;数据的高位字节存储在内存的高位地址&#xff0c;低位字节存储在内存的低位地址 大端字节序&#xff1a;数据的低位字节存储在内存的高位地址&#xff0c;高位字节存储在内存的低位地址 bit ( 比特…

设计模式第八讲:观察者模式和中介者模式详解

一. 观察者模式1. 背景在现实世界中&#xff0c;许多对象并不是独立存在的&#xff0c;其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如&#xff0c;某种商品的物价上涨时会导致部分商家高兴&#xff0c;而消费者伤心&#xff1b;还有&#x…

内网部署api接口文档服务器端口如何让外网访问?

计算机业内人士对于swagger并不陌生&#xff0c; 不少人选择用swagger做为API接口文档管理。Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法&#x…

Apache Hadoop生态部署-3台设置的免密登录,xsync分发脚本,jpsall脚本

目录 查看服务架构图-服务分布、版本信息 集群服务器间的免密登录 jpsall集群jps查看脚本 xsync集群分发脚本 查看服务架构图-服务分布、版本信息 系统环境&#xff1a;centos7 Java环境&#xff1a;Java8 集群服务器间的免密登录 作用&#xff1a;这里配置的是root用户…

联想昭阳E5-ITL电脑开机后绿屏怎么U盘重装系统?

联想昭阳E5-ITL电脑开机后绿屏怎么U盘重装系统&#xff1f;有用户电脑正常开机之后&#xff0c;出现了屏幕变成绿屏&#xff0c;无法进行操作的情况。这个问题是系统出现了问题&#xff0c;那么如何去进行问题的解决呢&#xff1f;接下来我们一起来分享看看如何使用U盘重装电脑…

数据库系统概论——绪论

1、绪论 1.1、数据库系统概述 数据库系统的构成示意图 1.1.1、数据库系统基本概念 基本概念&#xff1a;数据、数据库、数据库管理系统和数据库系统 1&#xff09;数据&#xff08;data&#xff09; 定义&#xff1a;描述事物的符号记录称为数据数据是数据库中存储的基本对象…

Latex三线表画法合集

Latex常用表格画法合集 前言 当我们使用Latex写论文的时候&#xff0c;三线表是展示实验结果的常用方法&#xff0c;但网上的方法杂七杂八&#xff0c;找到自己想要的表格需要花费一番功夫。本篇文章旨在记录论文常用表格的画法&#xff0c;方便论文的书写。 导入的包&#x…

11.7 指针和多维数组

C语言学习栏目目录 目录 1 指向多维数组的指针 2 指针的兼容性 3 函数和多维数组 指针和多维数组有什么关系&#xff1f;为什么要了解它们的关系&#xff1f;处理多维数组的函数要用到指针&#xff0c;所以在使用这种函数之前&#xff0c;先要更深入地学习指针。至于第 1 个…

工作实战之系统交互api调用认证设计

目录 前言 一、黄金段位接口交互 二、钻石段位接口交互设计 1.接口文档定义 2.工具类以及demo提供 a.调用方部分代码 b.被调用方 三.星耀段位接口访问设计 1.在钻石段位的基础上&#xff0c;进行sdk的封装 a.maven引入 b.sdk包含工具类 四.王者段位接口访问设计 1.开发详情 2.…

大数据技术为何诞生,它究竟解决了哪些问题?

大数据诞生背景与基本概念大数据为什么会诞生&#xff1f;以及它解决了哪些问题&#xff1f;1.大数据诞生之前的数据处理模式2.结构化数据在传统处理方式下的瓶颈3.非结构化与半结构化数据在传统处理方式下的瓶颈4.大数据诞生的初衷与定义大数据场景特征大数据为什么会诞生&…

day19_Set

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、Set 三、HashSet 四、LinkedHashSet 五、TreeSet 六、Collections 零、 复习昨日 提问过了… 一、作业 见代码… 二、Set Set集合是Collecti…

Mybatis源码笔记

String resource "mybatis-config.xml";Reader reader;try {//将XML配置文件构建为Configuration配置类reader Resources.getResourceAsReader(resource);// 通过加载配置文件流构建一个SqlSessionFactory DefaultSqlSessionFactorySqlSessionFactory sqlMapper …

多点电容触摸屏实验

目录 一、简介 二、硬件原理 ​编辑1、CT_INT 2、I2C2_SCL和I2C2_SDA 3、RESET复位引脚 三、FT54x6/FT52x6电容触摸芯片 四、代码编写 1、编写ft5426.h 2、编写ft5426.c 3、main函数 一、简介 电容屏只需要手指轻触即可&#xff0c;而电阻屏是需要手指给予一定的压力才…