Harris角点检测

思想

为什么要检测角点呢?因为角点的特征比较明显。进行角点检测的朴素思想是利用图像梯度,也就是根据图像强度的变化来寻找角点。如图所示

这里举了个例子,给定一个小的区域(Patch),当这个小区域在不同位置滑动的时候,所呈现出来的一些特性是不同的,根据图示,有三个方面。

  • Flat,平的地方,在任何方向,梯度都没什么变化。
  • Edge,边的地方,当沿着边方向的时候,梯度没什么变化。
  • Corner,角的地方,沿着任何方向,梯度都有变化。

Error Function

\[E(u,v)=\sum_{x,y}{w(x,y)[I(x+u,y+v)-I(x,y)]^2}
\]

  • \(x,y\)是相对于一个小patch来说的,例如一个5*5的区域
  • \((u,v)\)是一个很小的移动量
  • \(w(x,y)\)是windows function,也就是对于每个点的权重,例如想让中心的点权重高,可以用高斯核,一般就是全1或者高斯。
  • \(I(x,y)\)就代表图像在\((x,y)\)的强度值。
  • 后面做差其实就是类似求梯度一样

根据之前的讨论,在一个patch里,如果有角点的存在,各个方向的梯度值都很大,于是乎,我们的目标是让\(E(u,v)\)尽可能的大。

因为\((u,v)\)的值很小,所以我们可以利用二元函数的泰勒展开,来近似计算。

二元函数的泰勒展开,当然扔掉了一些项。

\[f(x+u,y+v) \approx f(x,y)+uf_x(x,y)+vf_y(x,y)
\]

那么我们对Error function中的关键部分进行展开

\[\begin{aligned}
[I(x+u,y+v)-I(x,y)]^2 &\approx [I(x,y)+uI_x+vI_y-I(x,y)]\\
&=(uI_x+vI_y)^2\\
&=[u,v]
\begin{bmatrix}
I_x^2 &I_xI_y\\
I_xI_y&I_y^2
\end{bmatrix}
\begin{bmatrix}
u\\v
\end{bmatrix}
\end{aligned}
\]

所以Error Function可以近似为

\[E(u,v)\approx [u,v]M\begin{bmatrix}
u\\v
\end{bmatrix}
\]

\[M=
\sum_{x,y}{w(x,y)
\begin{bmatrix}
I_x^2 &I_xI_y\\
I_xI_y&I_y^2
\end{bmatrix}
}
\]

这就涉及到线性代数里的二次型问题了。

简单的二次型

例如 \(f(x,y) = x^2+y^2\)的可以写作矩阵的形式

\[[x,y]\begin{bmatrix}
1 & 0\\
0 & 1
\end{bmatrix}
\begin{bmatrix}
x\\y
\end{bmatrix}
\]

由中间这个矩阵来决定这个二次型的形状,因为我们研究的二次型只有两个变量,所以可以可视化来理解如下图所示。对形状矩阵可以进行特征分解,分为中间的对角阵(对角线都是特征值)两边是特征向量。特征向量代表了椭圆切片的长短轴的方向,而特征值平方根的倒数代表了轴的长短。至于为什么分解完会和椭圆对应,线性代数书上会有。

这样就把Error Function给可视化了,有了几何含义,更加直观了。

  • Flat的时候,\((u,v)\)往哪个方向变化都不大,反应在几何上,应该是一个较为平坦的面
  • Edge的时候,\((u,v)\)往某个方向变化大,反应在几何上,应该是某个方向翘起。
  • Corner的时候,\((u,v)\)往大部分方向变化都大,反应在几何上,应该是大部分方向都翘起。

如图所示

我们可以通过两个特征值之间的大小关系,以及他们自身的关系来作为评估的依据。

当两个特征值都很大,且差不多时,意味着角点。

角点响应的度量

以上分析了,要两个特征值都很大,且同时大,那怎么来度量?于是乎在最原始的论文里,这样定义了响应函数,并且对不同的\(\lambda\)有以下的响应图

\[R = det(M)-k(trace(M))^2\\
det(M) = \lambda_1\lambda_2\\
trace(M) = \lambda_1+\lambda_2
\]

\(k\)一般在是0.04-0.06

如图所示,黄色的线是等值线,代表\(R\)的值都相同,左上角是\((0,0)\)点,往右下角去\(R\)的值越大,代表角点的响应越高,图中画了个绿线,右侧的R值基本可以判断为是角点了。另外还有一些别的响应函数,基本大同小异吧。

算法

所以现在经过以上的分析,总结一下角点检测的算法步骤。

  1. 计算整个图像的梯度值\(I_x,I_y\)
  2. 对于每个像素的\(I_{x^2}=I_xI_x,I_{y^2}=I_yI_y,I_{xy}=I_xI_y\)
  3. 计算每一个像素窗口的和,意思就是对于一个像素,定义一个领域例如5*5,就和之前提及的那样,然后计算这个邻域里面所有第二步计算出来的值的和。\(S_{x^2}=G_{\sigma}*I_{x^2},S_{y^2}=G_{\sigma}*I_{y^2},S_{xy}=G_{\sigma}*I_{xy}\)
  4. 对于每个点\((x,y)\),定义矩阵\(\begin{bmatrix}S_{x^2}&S_{xy}\\S_{xy}&S_{y^2}\end{bmatrix}\)
  5. 对于每个点,计算响应值\(R=Det(H)-k(Trace(H))^2\)
  6. 对\(R\)设定阈值,并且计算非极大值抑制(nonmax suppression, NMS),这个的意思应该就是比如5*5的邻域内有好几个点通过了阈值的筛选,那么选择最大的那个,抑制其他的点。

一些特性

  • Harris角点响应具有旋转不变性,因为旋转不会改变特征值的大小。
  • Harris角点响应对强度变化具有一定的不变性,缩放或者平移。因为经过缩放或者平移,最大值还是最大值,但是阈值可能要改改。
  • Harris角点响应不对尺度有不变性,改变尺度可能会改变检测的结果。可能在某一尺度下检测出为角点,而另一尺度检测出为边缘。

参考

[Computer Vision]Harris角点检测的详细推导的更多相关文章

  1. 【Computer Vision】角点检测和匹配——Harris算子

    一.基本概念 角点corner:可以将角点看做两个边缘的交叉处,在两个方向上都有较大的变化.具体可由下图中分辨出来: 兴趣点interest point:兴趣点是图像中能够较鲁棒的检测出来的点,它不仅 ...

  2. Opencv学习笔记------Harris角点检测

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  3. Harris 角点检测

    一 .Motivation 对于做图像处理的人来说,Harris角点检测肯定听过,1988年发表的文章"A combined corner and edge detector"描述 ...

  4. Harris角点检测算原理

    主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601  Harris角点检测算子 本文将该文拷贝了过来,并做了一些数学方面的 ...

  5. Harris角点检测原理分析

    看到一篇从数学意义上讲解Harris角点检测很透彻的文章,转载自:http://blog.csdn.net/newthinker_wei/article/details/45603583 主要参考了: ...

  6. harris角点检测的简要总结

    目录 1. 概述相关 2. 原理详解 1) 算法思想 2) 数学模型 3) 优化推导 3. 具体实现 1) 详细步骤 2) 最终实现 4. 参考文献 1. 概述相关 harris角点检测是一种特征提取 ...

  7. opencv-角点检测之Harris角点检测

    转自:https://blog.csdn.net/poem_qianmo/article/details/29356187 先看看程序运行截图:   一.引言:关于兴趣点(interest point ...

  8. Vulkan移植GpuImage(二)Harris角点检测与导向滤波

    Harris角点检测 UI还是用的上次扣像的,只有前后置可以用,别的没有效果,只看实现就好. 相应源码 在实现之前,我先重新整理编译glsl的生成工具,如Harris角点检测中间计算过程需要针对rgb ...

  9. Harris角点检测算法优化

    Harris角点检测算法优化 一.综述 用 Harris 算法进行检测,有三点不足:(1 )该算法不具有尺度不变性:(2 )该算法提取的角点是像素级的:(3 )该算法检测时间不是很令人满意. 基于以上 ...

随机推荐

  1. AJAX二

    二.简单的dom操作 2.使用js的dom获取页面数据 由于ajax不使用form 而form具有自动收集数据的功能. 不使用form,就需要使用dom手写代码收集数据 ①获得承载数据的元素对象 &l ...

  2. 破坏之王DDoS攻击与防范深度剖析【学习笔记】

    一.DDoS初步印象 1.什么是分布式拒绝服务攻击? 1)首先它是一种拒绝服务攻击 我们可以这么认为,凡是导致合法用户不能访问服务的行为,就是拒绝服务攻击. 注:早期的拒绝服务主要基于系统和应用程序的 ...

  3. MyCat垂直分库

    一.什么是垂直分库 将一类功能的表从一个实例切分到另一个实例,横向扩展实例,增加写负载 目标:将1个实例的4类表拆分多4个实例中 二.垂直切分步骤 2.1收集分析业务模块间的关系,能分几个库 2.2全 ...

  4. jsp获取当前日期

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>  <jsp: ...

  5. 依赖工程开发,编译报错Command Libtool failed with a nonzero exit code

    升级AFN之后,SDK工程始终编译不通过找不到SDK.a 原因在SDK Target ->Build phases ->Link Binary With Libraries 多添加了SDK ...

  6. block和delegate的选择

    block和delegate均为常用回调方式 (暂不讨论通知)   代理 优点: 设置某个对象的代理,代理对象可以与被代理对象不直接相关,即使两个对象距离较远,传值也比较方便. 代理方法内可以方便调用 ...

  7. 小BUG大原理:重写WebMvcConfigurationSupport后SpringBoot自动配置失效

    一.背景 公司的项目前段时间发版上线后,测试反馈用户的批量删除功能报错.正常情况下看起来应该是个小 BUG,可怪就怪在上个版本正常,且此次发版未涉及用户功能的改动.因为这个看似小 BUG 我了解到不少 ...

  8. 关于 Git 拉取GitLab工程报错:Repository not found的问题

    [root@localhost xscan]# git pull fatal: repository 'http://gitlab.***.com/***.git/' not found 原因1: 可 ...

  9. Mysql创建修改删除-表

    创建表之前要链接到库  例如  库名为 student use student; 连接结束可以查看此库中所有表 show tables; 创建表 create table student( id in ...

  10. linux:安装

    安装准备 1.虚拟机:VMware® Workstation 12 Pro 2.系统:CentOS-6.5-i386-bin-DVD1.iso 新建虚拟机 网络设置: NAT:配置好后Windows与 ...