深入解析 Harris 角点检测算法:从孔径问题到响应函数的完整推导

在图像处理中,角点是非常重要的特征。为了快速、准确地检测角点,Harris 提出了 Harris 角点检测算法,它基于局部窗口内图像梯度的变化来判断角点。本文将从最基础的孔径问题(Aperture Problem)入手,通过泰勒展开和向量乘法的形式逐步推导 Harris 角点检测的过程,并给出特征值分析和角响应函数的详细解释。

1. 孔径问题的引入

孔径问题常用“理发店门前转灯”进行类比说明。你可以想象一个横着旋转的灯,它看起来像是垂直方向移动,但实际上是水平方向转动。
请添加图片描述

  • 感觉上:垂直移动
  • 实际情况:水平旋转

在计算机视觉中,光流的计算就面临类似的问题:在仅有一个小窗口的情况下,无法确定物体的移动方向,尤其在物体具有某种平滑性时,感知的运动方向和实际运动方向可能不一致。这就是“孔径问题”。

2. 图像函数的平移与泰勒展开

在处理图像时,假设我们有一幅灰度图像,它的像素值可以用函数 I ( x , y ) I(x, y) I(x,y) 来表示。这里 x x x y y y 是图像的空间坐标, I ( x , y ) I(x, y) I(x,y) 是在这个点上的像素强度值。Harris 算子的基本思想是当图像发生微小平移时,通过分析像素强度的变化来判断该区域是角点、边缘还是平坦区域。

图像的平移

考虑图像的某个点发生了微小的平移,即从 ( x , y ) (x, y) (x,y) 平移到 ( x + u , y + v ) (x + u, y + v) (x+u,y+v)。那么,经过平移后的像素强度可以表示为 I ( x + u , y + v ) I(x+u, y+v) I(x+u,y+v),如图所示
在这里插入图片描述

在处理图像时,假设我们有一幅灰度图像,它的像素值可以用函数 I ( x , y ) I(x, y) I(x,y) 来表示。这里 x x x y y y 是图像的空间坐标, I ( x , y ) I(x, y) I(x,y) 是在这个点上的像素强度值。Harris 算子的基本思想是当图像发生微小平移时,通过分析像素强度的变化来判断该区域是角点、边缘还是平坦区域。

图像的平移

考虑图像的某个点发生了微小的平移,即从 ( x , y ) (x, y) (x,y) 平移到 ( x + u , y + v ) (x + u, y + v) (x+u,y+v)。那么,经过平移后的像素强度可以表示为 I ( x + u , y + v ) I(x+u, y+v) I(x+u,y+v)

为了简化问题,我们假设这个位移很小,因此可以使用 泰勒展开 I ( x + u , y + v ) I(x+u, y+v) I(x+u,y+v) 进行近似:

I ( x + u , y + v ) ≈ I ( x , y ) + u ∂ I ∂ x + v ∂ I ∂ y + 高阶项 I(x+u, y+v) \approx I(x, y) + u \frac{\partial I}{\partial x} + v \frac{\partial I}{\partial y} + \text{高阶项} I(x+u,y+v)I(x,y)+uxI+vyI+高阶项

其中:

  • ∂ I ∂ x \frac{\partial I}{\partial x} xI 表示图像在 x x x 方向的梯度,记为 I x I_x Ix
  • ∂ I ∂ y \frac{\partial I}{\partial y} yI 表示图像在 y y y 方向的梯度,记为 I y I_y Iy

因此,我们可以将上式简化为:

I ( x + u , y + v ) ≈ I ( x , y ) + I x u + I y v I(x+u, y+v) \approx I(x, y) + I_x u + I_y v I(x+u,y+v)I(x,y)+Ixu+Iyv

这个式子告诉我们,当图像发生微小的平移时,像素值的变化可以通过图像梯度来近似表示。

3. 构造能量函数

在 Harris 角点检测中,关键思想是比较位移前后的像素强度差异,构造一个 能量函数 来度量这种差异。能量函数 E ( u , v ) E(u, v) E(u,v) 描述了图像在窗口 W W W 内的像素强度变化,它定义为:

E ( u , v ) = ∑ ( x , y ) ∈ W ω ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u, v) = \sum_{(x, y) \in W} \omega(x, y) \left[ I(x+u, y+v) - I(x, y) \right]^2 E(u,v)=(x,y)Wω(x,y)[I(x+u,y+v)I(x,y)]2

其中:

  • ω ( x , y ) \omega(x, y) ω(x,y) 是一个权重函数,通常用于加权窗口内不同像素的影响。权重函数可以是均匀分布的矩形窗口,也可以是高斯加权窗口,如图片所示的两种形式。

    • 矩形窗口:窗口内像素权重为 1,外部为 0;
    • 高斯窗口:窗口内的像素权重按照高斯分布递减,使得靠近中心的像素有更大的影响。
      在这里插入图片描述

代入泰勒展开的结果 I ( x + u , y + v ) ≈ I ( x , y ) + I x u + I y v I(x+u, y+v) \approx I(x, y) + I_x u + I_y v I(x+u,y+v)I(x,y)+Ixu+Iyv,能量函数可以近似表示为:

E ( u , v ) ≈ ∑ ( x , y ) ∈ W ω ( x , y ) [ I x u + I y v ] 2 E(u, v) \approx \sum_{(x, y) \in W} \omega(x, y) \left[ I_x u + I_y v \right]^2 E(u,v)(x,y)Wω(x,y)[Ixu+Iyv]2

这一步已经将图像的位移引入到了能量函数中,它通过计算窗口内像素的变化来判断图像的局部特性。

4. 向量乘法形式的能量函数

为了便于计算和进一步分析,我们可以将上述能量函数写成矩阵形式。先将 I x u + I y v I_x u + I_y v Ixu+Iyv 写成向量形式:

I x u + I y v = [ I x I y ] [ u v ] I_x u + I_y v = \begin{bmatrix} I_x & I_y \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} Ixu+Iyv=[IxIy][uv]

因此,能量函数 E ( u , v ) E(u, v) E(u,v) 可以写成:

E ( u , v ) = ∑ ( x , y ) ∈ W ω ( x , y ) [ u v ] [ I x 2 I x I y I x I y I y 2 ] [ u v ] E(u, v) = \sum_{(x, y) \in W} \omega(x, y) \begin{bmatrix} u & v \end{bmatrix} \begin{bmatrix} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} E(u,v)=(x,y)Wω(x,y)[uv][Ix2IxIyIxIyIy2][uv]

进一步,我们定义一个称为 结构张量(M) 的矩阵:

M = ∑ ( x , y ) ∈ W ω ( x , y ) [ I x 2 I x I y I x I y I y 2 ] M = \sum_{(x, y) \in W} \omega(x, y) \begin{bmatrix} I_x^2 & I_x I_y \\ I_x I_y & I_y^2 \end{bmatrix} M=(x,y)Wω(x,y)[Ix2IxIyIxIyIy2]

于是,能量函数可以简化为:

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]

这就是 Harris 算子中能量函数的向量乘法形式,它为后续的特征值分析奠定了基础。

5. 特征值分析

我们通过特征值分解对结构张量 M M M 进行分析。这个张量 M M M 表示的是图像局部区域的梯度信息,它的特征值 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 反映了不同方向上的强度变化。

  • λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 M M M 的特征值,它们描述了图像在不同方向上的梯度变化程度。根据特征值的大小关系,我们可以判断局部区域的图像结构。

特征值分解可以写为:

M = R − 1 [ λ 1 0 0 λ 2 ] R M = R^{-1} \begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix} R M=R1[λ100λ2]R

其中, R R R 是旋转矩阵,用来将图像的局部梯度信息旋转到与特征值对应的方向上。

在这里插入图片描述

平坦区域

  • 如果 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 都很小,表示在该区域内无论在哪个方向上图像的强度变化都非常小。这意味着该区域是平坦的,图像强度几乎不变。这种区域通常位于图像的背景或均匀纹理处。
  • 如图中所示,梯度图的分布在平坦区域非常集中, λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 都接近零。

边缘区域

  • 如果 λ 1 \lambda_1 λ1 很大,而 λ 2 \lambda_2 λ2 很小,意味着该区域沿着一个方向(通常是边缘的方向)有较大的强度变化,而垂直于该方向的变化非常小。这种情况典型地表示 边缘区域
  • 从梯度图中可以看出,在边缘区域,数据点呈现拉长的形状,意味着图像沿某一个方向(边缘方向)变化明显,而另一方向上的变化不显著。

角点区域

  • 如果 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 都很大,表示图像在该区域内的各个方向都有较大的强度变化。这意味着无论图像在水平或垂直方向移动,都会导致显著的变化,因此可以认为该区域是角点。
  • 角点区域在梯度图中显示为近似圆形的分布,表示在多个方向上都有显著的梯度变化。

7. Harris 响应函数

为了快速判断角点,Harris 引入了一个角响应函数:

θ = det ⁡ ( M ) − α ⋅ trace ( M ) 2 \theta = \det(M) - \alpha \cdot \text{trace}(M)^2 θ=det(M)αtrace(M)2

其中:

  • det ⁡ ( M ) = λ 1 λ 2 \det(M) = \lambda_1 \lambda_2 det(M)=λ1λ2 是矩阵的行列式,表示局部窗口中图像的总变化。
  • trace ( M ) = λ 1 + λ 2 \text{trace}(M) = \lambda_1 + \lambda_2 trace(M)=λ1+λ2 是矩阵的迹,表示图像的总强度变化。
  • α \alpha α 是经验常数,通常取 0.04 到 0.06。

通过计算这个响应函数 θ \theta θ,我们可以判断局部区域是否是角点:

  1. 角点(Corner)
    λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 都较大时,说明图像的强度在 x x x y y y 方向上都有明显的变化,即梯度变化较大。这种情况通常发生在角点或交叉点处。
  2. 边缘(Edge)
    λ 1 \lambda_1 λ1 较大而 λ 2 \lambda_2 λ2 较小(或相反)时,说明图像在一个方向上有明显变化,而另一个方向上变化较小。此时,局部区域更可能是边缘。
  3. 平坦区域(Flat Region)
    λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 都较小时,说明图像在该区域内没有明显的强度变化(例如,在均匀的平坦区域)。此时,响应函数值 θ \theta θ 也会很小。

8. Harris 算子的优缺点

Harris 角点检测算法能够有效地检测出图像中的角点,并且对图像的 旋转具有较好的不变性 。然而,它也有一些局限性:

  • 对尺度不变性较差:Harris 算法对图像缩放不敏感,因此对于不同尺度的图像角点检测效果不佳。
  • 容易受到噪声影响:如果图像中存在较多噪声,梯度计算可能会受到干扰,导致角点检测结果不准确。

为了克服这些局限性,常常会将 Harris 角点检测与其他特征提取算法(例如 SIFT 或 SURF)结合使用,以提升检测的鲁棒性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MeterSphere接口自动化平台调试

1。后置脚本节目 //导入json包 import org.json.*; import com.decode.DecodeMain; String responseprev.getResponseDataAsString(); String result DecodeMain.DecodeUtil(response); log.info(“获取批次账单id result:”result); //转换为Object对象类型 JSONObject data_…

机器学习:知识蒸馏(Knowledge Distillation,KD)

知识蒸馏(Knowledge Distillation,KD)作为深度学习领域中的一种模型压缩技术,主要用于将大规模、复杂的神经网络模型(即教师模型)压缩为较小的、轻量化的模型(即学生模型)。在实际应…

UE5 C++: 插件编写06 | 移动文件时自动Fix up redirectors

目录 前言: 本文内容: WHY WHAT HOW 详细步骤 代码解析 1. Build.cs file中 2. QuickAssetAction.cpp中 IMPORTANT NOTES 中文解释: 使用 AssetToolsModule 来修复重定向器 使用 AssetRegistryModule 来过滤所有重定向器 使用 FMo…

利士策分享,美国“假旗”行动,是否成为了网络空间的阴霾?

利士策分享,美国“假旗”行动,是否成为了网络空间的阴霾? 在当今这个信息化时代,网络空间已经成为国家间竞争与合作的重要领域。然而,美国却频繁采取一种名为“假旗行动”的卑劣手段,污染全球网络空间,给世…

Java 二分查找算法详解及通用实现模板案例示范

1. 引言 二分查找(Binary Search)是一种常见的搜索算法,专门用于在有序数组或列表中查找元素的位置。它通过每次将搜索空间缩小一半,从而极大地提高了查找效率。相比于线性查找算法,二分查找的时间复杂度为 O(log n)&…

Arthas常用的命令(三)--monitor、jad 、stack

monitor:监控方法的执行情况 监控指定类中方法的执行情况 用来监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息 参数说明 方法拥有一个命名参数 [c:],意思是统计周期(cycle of ou…

linux线程 | 同步与互斥(上)

前言:本节内容主要是线程的同步与互斥。 本篇文章的主要内容都在讲解互斥的相关以及周边的知识。大体的讲解思路是通过数据不一致问题引出锁。 然后谈锁的使用以及申请锁释放锁的原子性问题。 那么, 废话不多说, 现在开始我们的学习吧&#x…

软件测试工程师面试整理 —— 操作系统与网络基础!

在软件测试中,了解操作系统和网络基础知识对于有效地进行测试工作至关重要。无论是在配置测试环境、调试网络问题,还是在进行性能测试和安全测试时,这些知识都是不可或缺的。 1. 操作系统基础 操作系统(Operating System, OS&am…

OgreNext高级材质中增加线宽,点大小,虚线模式绘制支持

修改Ogre高级材质系统,增加线宽,点大小,虚线模式,虚线参数的支持,效果如下: 需要修改的代码文件如下: 修改如下 代码文本: //范围[0.2 - 51] 0.2 * [0,255];Ogre::uint8 mLineWidth;//范围[…

【数据结构】:破译排序算法--数字世界的秩序密码(二)

文章目录 前言一.比较排序算法1.Bubble Sort冒泡排序1.1.冒泡排序原理1.2.冒泡排序过程1.3.代码实现1.4.复杂度和稳定性 2.Quick Sort快速排序2.1递归快速排序2.1.1.递归快速排序原理2.1.2.递归快速排序过程2.1.3.代码实现 2.2.非递归快速排序2.2.1.非递归快速排序原理2.2.2.非…

MATLAB智能优化算法-学习笔记(5)——蚁群算法求解容量受限的车辆路径问题

蚁群算法在求解容量受限的车辆路径问题(Capacitated Vehicle Routing Problem, CVRP)中具有广泛应用。这类问题属于组合优化问题,涉及将若干辆具有容量限制的车辆,从配送中心出发为多个客户点提供服务,要求每辆车满足各客户的需求且总运载量不超过车辆容量,最终需要找到一…

python深浅拷贝,可变变量与不可变变量

赋值 在 python 中,赋值是将一个值或对象分配给一个变量的过程。赋值操作符是 ,用于将右侧的值或对象赋给左侧的变量。 赋值:l2的值会随着原对象l1的值一同改变 l1 [1, 2, 3, 4] print(l1:, l1) l2 l1 print(l2:, l2) 给li列表新增元素 …

检测头篇 | 手把手教你如何去更换YOLOv8的检测头为ASFF_Detect

前言:Hello大家好,我是小哥谈。自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv8的检测头更换…

使用 Spring 框架构建 MVC 应用程序:初学者教程

Spring Framework 是一个功能强大、功能丰富且设计精良的 Java 平台框架。它提供了一系列编程和配置模型,旨在简化和精简 Java 中健壮且可测试的应用程序的开发过程。 人们常说 Java 太复杂了,构建简单的应用程序需要很长时间。尽管如此,Jav…

论文翻译 | OpenICL: An Open-Source Framework for In-context Learning

摘要 近年来,上下文学习(In-context Learning,ICL)越来越受到关注,并已成为大型语言模型(Large Language Model,LLM)评估的新范式。与传统微调方法不同,ICL无需更新任何参…

龙信科技:引领电子物证技术,助力司法公正

文章关键词:电子数据取证、电子物证、手机取证、计算机取证、云取证、介质取证 在信息技术飞速发展的今天,电子物证在司法领域扮演着越来越重要的角色。苏州龙信信息科技有限公司(以下简称“龙信科技”)作为电子数据取证领域的先…

bat(批处理脚本学习)

输出banner echo off echo () echo JL echo ^|^| echo LJ echo _,--"""""""---. echo , …

从零实现高并发内存池

目录 1. 项目介绍1.1 这个项目具体功能是什么?1.2 本项目的知识储备 2. 什么是内存池2.1 池化技术2.2 内存池主要解决的问题2.3 malloc 3. 定长内存池设计4. 高并发内存池整体框架设计4.1 Thread Cache的设计思路4.2 Central Cache的设计思路4.3 Page Cache的设计思…

【C语言】分支结构switch

switch分支语句 多适用于明确表达式结果的情况&#xff0c;多个分支&#xff0c;用if过于繁琐。 case后跟具体的表达式值&#xff0c;break&#xff1b;跳出分支语句。 #include <stdio.h> #include <math.h> /* 功能&#xff1a;选择结构&#xff08;switch&…

Qt初识_项目文件解析

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt初识_项目文件解析 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. pro文件解析 2.…