Harris角点检测数学计算过程与CornerHarris方法参数的一点说明【DataWhale学习记录】

1 基础知识

1.1 图像梯度的解释

  1. 图像的梯度与数学中的梯度在形式上是由差异的,原因在于图像的特点,图像是一个离散的二维函数,接下来会尝试说明这一点,但从意义上来说是相同的,是为了表现图像灰度的变化率
  2. 在数学微积分中,一维函数的一阶微分的基本定义是:
    一维函数的一阶微分的基本定义
    二维函数的一阶微分的基本定义是:
    二维函数的一阶微分的基本定义
    对于灰度图这样二维数组的图像,它其实就是一个离散的二位函数,说它离散,是因为每个灰度值取值为整数而不是小数,因此ϵ不能无限小,而ϵ的最小单位即是1像素。因此当ϵ取最小值1时,灰度图(离散的二维函数)的一阶微分基本定义是:
    灰度图(离散的二维函数)的一阶微分基本定义
    我们可以观察到,图像在(x, y)点处x方向和y方向上的梯度相当于2个相邻像素之间的差值。而且一般地,我们会使用两个方向上梯度的绝对值,因为我们只关心图像的灰度值变化大小,而梯度方向只需要知道是水平还是垂直即可,无须知晓到底是具体是向左还是向右,向下还是向上。
  3. 计算图像某点的梯度。
    上面,我们介绍了图像某个点的水平梯度gx和垂直梯度gy的计算方式,而将两者结合起来即可得到图像中该点的梯度的大小与方向。
    a. 计算梯度的大小,在数学上,这种结合的公式是:
    M ( x , y ) = ( g x ) 2 + ( g y ) 2 M(x,y) = \sqrt{(gx) ^2+ (gy)^2}
    但是图像处理中经常使用以下方式(用绝对值加和来近似平方和平方根)来减小计算开支。
    M ( x , y ) = g x + g y M(x,y) = |gx| + |gy|
    b. 计算梯度的方向
    a r c t a n [ f y f x ] arctan[\dfrac {\frac {\partial f} {\partial y}} {\frac {\partial f} {\partial x}}]
    再进一步扩展,图像的梯度也常用来判断某个窗口区域是平坦、边缘还是角点。而在边缘检测中,图像某一点的梯度方向是与边缘方向相垂直的,所以知道了梯度的方向,就晓得了边缘的方向,在以后的边缘检测、轮廓检测等知识中会用到。
    最后,希望大家记住梯度的计算是以每一个像素点为中心,而非一个区域(比如 3×3)。

参考文章:
图像梯度的基本原理.
canny算法(2)——图像梯度的计算(sobel算子)

1.2 Sobel算子简介

  1. sobel算子用来检测主体与主体之间的边缘特征,其效果有点类似高斯滤波,能够使得离中心点越近的像素权重越大,越重要
  2. 需要解释的是,我们刚才介绍了,图像在某一点A的梯度,只需要计算其相邻两个像素点的差值即可得到X方向Y方向上的梯度;
    但为了更加合理的判断某一点的梯度大小,需要借助算子为这个以点A为中心的ksize×ksize区域(一般是ksize取3或5或者其他奇数)添加权重,来扩大差异,增强边缘检测效果
    而且在运用中,因为计算一点的梯度需要借助周边区域的多个点的灰度值,因而对图像中的噪点比较敏感,因此时常在调用sobel方法进行计算之前,需要先借助高斯滤波器或者其他滤波器对原图像进行平滑\模糊处理以降噪
    所以完整的Sobel梯度计算过程是:1.高斯滤波器对原图像平滑降噪GaussianBlur 2.转灰度图cvtColor3.求X和Y方向的梯度Sobel
  3. sobel算子的形式
    s x = [ 1 0 1 2 0 2 1 0 1 ] s_x = \left[ \begin{matrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{matrix} \right]
    s y = [ 1 2 1 0 0 0 1 2 1 ] s_y = \left[ \begin{matrix} -1 & 2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{matrix} \right]
  4. 在OpenCV - Python 中,调用cv2.Sobel方法,一般的sobel算子是,右减左,下减上,进而得到图像中某一点的x方向上的梯度或者y方向上的梯度。另外,因为进行减法操作后不一定得到的是正值,也可能是负值,但是uint8不允许负值的存在,因此要指定ddepth = cv2.CV_64F 以包容负值的存在(eg:cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)),此时进行图像的展示,会先将数组中的负值视为0。但是随后会调用其他方法(cv2.convertScaleAbs)以进行绝对值化的操作,此时进行展示时,会使得负值转化为正值,得到我们完整的特征图。
  5. sobel算子的计算梯度的数学计算类似于卷积神经网络的卷积计算,而具体的计算过程参考sobel算子原理与实现.在此需要注意,sobel算子是算梯度的,虽然计算涉及很多的像素点,但是它计算的结果是一个值,是计算区域中心坐标的梯度值!
  6. sobel算子的计算梯度时,对于边缘点的梯度,一般会做填充处理,即如果算子核大小为3的话,会在图像四边界填充一层像素值为0的点。
  7. 不明之处:我们这篇文章其实是打算讲CornerHarris的参数的。而sobel算子是Harris角点检测过程中使用的算子,但是CornerHarris的参数中似乎只能指定sobel算子的大小即ksize,而不能指定具体使用的核是啥,而这一点有待深挖,因为我也看到过自定义算子,比如,高斯滤波器曾作为图像降噪的方式,也可用来计算梯度并赋予到某些方法(eg.erode)中的情况。

参考文献:
OpenCV-Python教程
Sobel边缘检测
canny算法(2)——图像梯度的计算

1.3 滤波器

  1. 主要想推荐一篇文章图像平滑去噪之高斯滤波器。具体的滤波器内容内容比较广泛,读者自行学习。
  2. 高斯滤波器的形式。由于高斯滤波实质是一种加权平均滤波,为了实现平均,核还带有一个系数,例如上图中的十六分之一、八十四分之一。这些系数等于矩阵中所有数值之和的倒数。相比之下,sobel算子的核在计算时,只是简单的加权求和。
    高斯滤波器
  3. 高斯滤波的特点。因为高斯滤波是以空间距离来确定权重大小的,但并没有考虑用颜色距离来确定权重,这样就导致了高斯滤波在去除噪声的同时,也一定程度上模糊了边界。
    高斯滤波器的特点,模糊

2 Harris角点检测过程与非严谨性数学推导

2.1 角点以及角点检测过程

  1. 之前讲过图像梯度,而通过梯度可以进行边缘检测,除此之外,还可以检测角点。系统地来说,一个图像根据图像灰度值变化大小地不同可以分为三个级别:平坦区域、边缘位置和角点三类。当然,分类也是根据具体的值,这个可以根据之后出现的参数进行人为的调整。
    而三种类型的特点是:
    • 角点(特征点)是当窗口向各方向移动,都会引起像素值发生很大变化的一个位置点;
    • 边缘特征是仅当窗口单方向上来回移动,才会引起像素值发生较大变化的一个位置区域;
    • 平坦区域是无论窗口移动方向如何,都不会引起像素值发生很大的变化的区域
      参考图像:
      角点
      这个地方不多介绍,角点不懂的可以自行学习。以下内容多少有点跳跃,建议多看几篇详细介绍角点检测的文章,再阅读下文。
  2. 角点检测过程

2.2 角点检测过程概述

  1. 需要注意的是,本文的角点检测过程,会穿插OpenCV中Cornerharris方法的参数的介绍与思考。因此对于不晓得该方法的读者,遇到相关文字时,先掠过。
  2. 先介绍以下CornerHarris方法的API
    cv2.cornerHarris(img,blocksize,ksize,k)
    a. img 一般时二维的灰度图,float32的输入图像。
    b. blocksize 角点检测中的窗口大小
    c. ksize sobel算子的大小
    d. 取值一般在[0.04,0.06]之间,而其时响应函数R中的一个参数。
  3. 角点检测过程与数学推导
  • 计算每个blocksize大小的窗口的灰度值变化大小(但实际上最后间接的去求了自相似函数的特征值)。
  • 计算响应函数R
  • R值与阈值比较,判断每个窗口下是否包含角点。

2.2.1 计算每个blocksize大小的窗口的灰度值变化大小

2.2.1.1

计算每个blocksize大小的窗口的灰度值变化(也可以称为“自相似性”)。而变化值可以由自相似函数给出。
自相似函数
其中, W ( u , v ) W(u,v) 是以点 ( u , v ) (u,v) 为中心的窗口,既可以是常数,又可以是高斯加权函数。
在这里插入图片描述

w ( u , v ) w(u,v) 是一个权重矩阵,shape大小为blocksize,注意它并不是sobel算子,确切地说,他们都是权重矩阵,但是目的并不同,用处不同,sobel算子用于计算每一个点的梯度, w w 则用于反映窗口灰度值总体变化大小中各带位置的像素点的权重、贡献度如何。所以ksize和blocksize并不是一回事,且没有关系
w ( u , v ) w(u,v) 由常数或者高斯加权构成时,常常分别为以下两种:
[ 1 1 1 1 1 1 1 1 1 ] \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right]
1 16 [ 1 2 1 2 4 2 1 2 1 ] \frac 1 {16} \left[ \begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{matrix} \right]
但是似乎在cornerHarris中无法人为指定具体权重,只能指定blocksize。
( u , v ) (u,v) 是窗口区域中点的坐标,如果blocksize=3,则 ( u , v ) (u,v) 一共有9个。

Δ x Δ y \Delta x \Delta y 表示每个 ( u , v ) (u,v) 向右向下的移动单位,而其基本单位是1像素。

I ( u , v ) I(u,v) 表示图像中在 ( u , v ) (u,v) 点的灰度值。

至此,对于自相似函数的计算,在指定blocksize,给定img后,仅 I ( u + Δ x , v + Δ y ) I(u+\Delta x,v+\Delta y) 不知如何求解。

2.2.1.2

》》而这个项式的计算,需要借助泰勒公式的一阶展开式近似计算。
I ( u + Δ x , v + Δ y ) = I ( u , v ) + I x ( u , v ) Δ x + I y ( u , v ) Δ y + o ( Δ x 2 , Δ y 2 ) I(u+\Delta x,v+\Delta y) =I(u,v) + I_x(u,v) \Delta x+I_y(u,v) \Delta y+o({\Delta x}^2,{\Delta y}^2)

此时, I ( u + Δ x , v + Δ y ) I ( u , v ) I x ( u , v ) Δ x + I y ( u , v ) Δ y I(u+\Delta x,v+\Delta y) - I(u,v) \approx I_x(u,v) \Delta x+I_y(u,v) \Delta y ,可以看出 I ( u , v ) I(u,v) 被抵消,而 o ( Δ x 2 , Δ y 2 ) o({\Delta x}^2,{\Delta y}^2) 佩亚诺余项作为高阶无穷小,可以被忽略掉,因此上式为近似求解。

同时,注意此时的 I x ( u , v ) I y ( u , v ) I_x(u,v) I_y(u,v) 即是我们之前讲的每一个点的水平梯度值和纵向梯度值
但是即使如此,我们还是不能很好的处理 Δ x Δ y \Delta x \Delta y 的取值。

由此需要借助线性代数中的二次型来间接解决这么个问题,而之所以说是间接解决自相似函数的计算问题,是因为利用二次型是用来计算特征值,再通过响应函数R可计算得到score分数,以用来跟系统设定的阈值比较判断是否该窗口中包含角点。而在这个过程中,包括特征值的求解过程, Δ x Δ y \Delta x \Delta y 一直都没有参与计算。

在具体解释特征值计算过程之前,需要解释一个问题,为什么泰勒展开式要展开到一阶而不是二阶,原因很简单,我们想通过泰勒展开式引入导数以实现近似的计算(因为准确计算不可能),而一阶二阶等更高阶都可以做到,只是计算二阶导数会引起计算量的大大增加,且一阶导数的近似效果已经足够了。因此就没有考虑二阶展开式。

2.2.1.3

》》》接下来,进一步推算,开始前,先告诉大家,这一步是为了求出自相似函数的特征值,避免因为其他内容的介绍而糊涂。
先展示一下泰勒展开式之后的自相似函数的近似结果:

c ( s , y ; Δ x , Δ y ) w ( I x ( u , v ) Δ x + I y ( u , v ) Δ y ) 2 c(s,y;\Delta x,\Delta y) \approx \displaystyle \sum_{w}{(I_x(u,v) \Delta x+I_y(u,v) \Delta y)^2}

为了简洁,讲 w ( x , y ) w(x,y) 先不具体展示出来了。被收纳到了求和运算符下面。

然后,二次型的结果就是如此:
c ( s , y ; Δ x , Δ y ) [ Δ x , Δ y ] M ( x , y ) [ Δ x Δ y ] c(s,y;\Delta x,\Delta y) \approx [\Delta x ,\Delta y]M(x,y)\left[ \begin{matrix} \Delta x \\ \Delta y \end{matrix}\right]

其中

2.2.1.4

接下来的一小段内容是说:该自相似函数可以视为一个椭圆,而椭圆的形状与特征值的大小相关
而对于
c ( s , y ; Δ x , Δ y ) A Δ x 2 + 2 C Δ x Δ y + B Δ y 2 c(s,y;\Delta x,\Delta y) \approx A{\Delta x}^2 + 2C{\Delta x}{\Delta y} + B{\Delta y}^2 ,如果把c视为一个常数,那么这就是一个二次型方程,而二次型方程在二维图像中就是一个椭圆。而常数的具体取值并不影响椭圆的形状。而椭圆的形状又恰好是我们要重点研究的,**准确的说是它的长短轴与我们想要求得特征值密切相关。**因此在此我们姑且将该二次型方程视为:
A Δ x 2 + 2 C Δ x Δ y + B Δ y 2 = 1 A{\Delta x}^2 + 2C{\Delta x}{\Delta y} + B{\Delta y}^2 = 1

其中,椭圆图像因为有 2 C Δ x Δ y 2C{\Delta x}{\Delta y} 的存在,而具有一定的倾斜程度。
参考图像

图来自二次型的意义是什么?有什么应用? - 马同学的回答 - 知乎 非常赞的回答!推荐阅读。

2.2.1.5

接下里这段是说,求特征值为什么借助矩阵,且特征值的意义是什么
首先,求特征值为什么借助矩阵,这个问题我不该问的,因为求特征值本身就需要借助矩阵运算。
其次,特征值或者确切说特征矩阵意味这什么?首先,矩阵代表着运动,且当矩阵维度没有发生改变时,一个矩阵就包含了两个运动:旋转和拉伸。而如果想把这两个运动分解,可以对矩阵进行正交化操作和特征值分解,由此得到两个矩阵正交矩阵和对角矩阵
在这里插入图片描述
正交矩阵就单纯的意味着旋转运动,而对角矩阵就单纯地意味着左右上下拉伸运动。
在这里插入图片描述
而对于一个二次方程的二次型矩阵即M(x,y)更换成它对应的对角矩阵,则一个倾斜的椭圆就扶正了。
结合下图进行理解上一段话,如果没能理解,那一定不是你的原因,一定是我没说清楚,具体可以参考文章:二次型的意义是什么?有什么应用? - 马同学的回答 - 知乎
在这里插入图片描述

2.2.1.6

有了前面的基础知识,我们不难理解,其实我上面的那么多文字,有点啰嗦了。因为只要我们知道了二次型矩阵,经过“特征值分解”就可以得到对角矩阵,得到特征值。
在这里插入图片描述
因为是二维的矩阵,所以最后的特征值只有两个,而这两个特征值又对应了椭圆的长短轴关系
在这里插入图片描述
还记得之前提起过,一张图像是由三类区域构成:

三种类型的特点是:
- 角点(特征点)是当窗口向各方向移动,都会引起像素值发生很大变化的一个位置点;
- 边缘特征是仅当窗口单方向(要么水平,要么垂直方向)上来回移动,才会引起像素值发生较大变化的一个位置区域;
- 平坦区域是无论窗口移动方向如何,都不会引起像素值发生很大的变化的区域

对应的,参考下面一张图片内容:
在这里插入图片描述
也就是说,这两个特征值分别对应水平和垂直两个方向。

如果某个窗口下在向水平方向移动时,水平特征值很大,而在垂直方向上移动时,垂直特征值较小,那么表示,该窗口下存在一片区域是边界特征。

而如果某个窗口在水平和垂直方向上的特征值都非常大,那么就表示,该窗口下的一片区域存在角点

2.2.2 计算响应函数R

那么最后的问题是,怎么根据特征值来衡量该窗口下存在的是角点还是其他其他。
注意,因为我们这里使用的是Harris角点检测,所以从衡量方法上来看,我们只关注其是否是角点,而关注如果该窗口下不包含角点,那么窗口下的区域到底是平坦还是边界!
衡量方法即是:响应函数R。
R = d e t M ( x , y ) k ( t r M ( x , y ) ) 2 R = \mathrm{det} M^{(x,y)} - k \cdot \left ( \mathrm{tr} M^{(x,y)} \right )^2
我们看到了cornerHarris方法的第四个参数k,是由用户自行指定的。

2.2.3 R值与阈值相比较,判断该窗口下是否包含角点

注意这个阈值应该时内置的,但是为了实现对角点检测数量的控制,因此给R中添加了k参数,通过调整参数k,可以判断窗口下识别的点是否可以称得上是满足自己要求的角点。

参考内容:
Opencv计算机视觉实战(Python版)
Markdown / KaTex数学公式汇总
Harris特征点检测器-兴趣点检测|Task01
cornerHarris函数
还有一些文章在文中已经提及,再次就不再赘述。

至此,全部内容结束。第一次写这么多的博文,文章的布局,我也尽力了。我也是看了很多的文章才得到这样的一个总结,我不是数学专业的学生,只是Opencv方向的小白,如果有错误,或者编辑上的不便,烦请赐教,哪怕只是提出问题!感谢!

猜你喜欢

转载自blog.csdn.net/m0_38052500/article/details/106936075