【OpenCV基础】第三十二课:Harris角点检测

图像特征,Harris角点检测,实对称矩阵的对角化,相似矩阵的几何意义,椭圆,cv::cornerHarris

249 Views | 5858 Words

Posted by x-jeff on May 30, 2022

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.图像特征

图像特征:可以表达图像中对象的主要信息,并且以此为依据可以从其他未知图像中检测出相似或者相同对象。

常见的图像特征:边缘、角点、纹理。

2.Harris角点检测

首先解释下角点的概念。如果我们在图像上滑动一个小窗口:

  • 如果在任何方向上滑动窗口,窗口内的灰度都没什么变化,则这是一个均匀区域。
  • 如果窗口内的灰度只在一个方向上滑动时才会有变化,则这可能是一个边缘。
  • 如果在任何方向上滑动窗口,窗口内的灰度都会发生变化,则这是一个角点。

角点检测的主要应用有:图像对齐、图像拼接、目标识别、3D重建、运动跟踪等。

检测角点的算法有很多,本文主要介绍最为基础的Harris角点检测。

首先我们来定义灰度的变化。假设滑动窗口的中心位于图像的(x,y)位置,该位置的灰度值为I(x,y)。将窗口向x方向和y方向分别位移u个单位和v个单位,此时窗口中心的坐标为(x+u,y+v),这个位置的灰度值为I(x+u,y+v)。则因窗口滑动而导致的窗口中心点的灰度变化为:

I(x+u,y+v)I(x,y)

假设我们考虑窗口内的所有点,给每个点赋予权值w,则窗口滑动得到的总的灰度变化为:

E(u,v)=(x,y)w(x,y)×[I(x+u,y+v)I(x,y)]2

权重矩阵通常我们可以采用二维高斯分布。我们使用二元函数的一阶泰勒展开进行如下近似化简:

I(x+u,y+v)I(x,y)+Ix(x,y)u+Iy(x,y)v

其中IxIyI的偏微分,在图像中就是在xy方向的梯度图(可以使用Sobel算子得到):

Ix=I(x,y)x,Iy=I(x,y)y

把式(3)代入式(2):

E(u,v)=(x,y)w(x,y)×[I(x+u,y+v)I(x,y)]2(x,y)w(x,y)×[I(x,y)+Ixu+IyvI(x,y)]2=(x,y)w(x,y)×(Ixu+Iyv)2=(x,y)w(x,y)×(u2I2x+v2I2y+2uvIxIy)

u,v提出来:

E(u,v)[uv]M[uv]

其中,

M=(x,y)w(x,y)[I2xIxIyIxIyI2y]=[(x,y)w(x,y)I2x(x,y)w(x,y)IxIy(x,y)w(x,y)IxIy(x,y)w(x,y)I2y]

对矩阵M进行实对称矩阵的正交相似对角化(见本文第2.1部分):

E(u,v)[uv]M[uv]=[uv]P[λ100λ2]PT[uv]=[uv][λ100λ2][uv]=λ1(u)2+λ2(v)2=(u)21λ1+(v)21λ2

其中,λ1,λ2为矩阵M特征值。根据【数学基础】第十五课:矩阵的相似变换和相合变换一文和本文第2.2部分,我们知道相似矩阵的几何意义就是同一个线性变换在不同的基下的表达形式。所以式(8)相当于是换了一组基,此时我们得到了一个标准的椭圆方程(椭圆相关内容见本文第2.3部分):

上图中,λmax=max(λ1,λ2),λmin=min(λ1,λ2)

如果λ1,λ2只有一个很大,则意味着(在新基下)只沿着一个方向,E(u,v)会发生较大变化,所以这很有可能是个边缘,而不是角点。只有λ1,λ2都很大,即无论沿着哪个方向,E(u,v)都会发生较大变化,这才非常有可能是一个角点:

而在实际计算时,我们并不真的计算矩阵M的特征值,而是构建一个响应函数R

R=det(M)k(trace(M))2

其中,det(M)=λ1λ2为矩阵M行列式trace(M)=λ1+λ2是矩阵M

特征值和矩阵行列式、迹之间的关系:【数学基础】第十五课:矩阵的相似变换和相合变换

k是一个经验常数,范围通常在(0.04,0.06)之间。Harris角点检测的结果是带有这些分数R的灰度图像,设定一个阈值,分数大于这个阈值的像素就对应角点。

⚠️Harris检测器具有旋转不变性,但不具有尺度不变性,也就是说尺度变化可能会导致角点变为边缘,例如:

尺度不变性可使用SIFT特征。

2.1.实对称矩阵的对角化

👉实对称矩阵:如果有n阶矩阵A,其矩阵的元素都为实数,且矩阵A的转置等于其本身,则称A为实对称矩阵。

实对称矩阵有以下主要性质:

  • 实对称矩阵A的不同特征值对应的特征向量是正交的。
  • 实对称矩阵A特征值都是实数。
  • n阶实对称矩阵A必可相似对角化,且相似对角阵上的元素即为矩阵本身特征值
  • A具有k特征值λ0,则必有k个线性无关的特征向量
  • 实对称矩阵A一定可以正交相似对角化。

如果某一矩阵有k个相同的特征值,则称该特征值k特征值

👉对角化,相似对角化,正交相似对角化(查阅了一些资料,对这三个概念的理解如下,如有误,欢迎大家指正):

查阅的资料中对于对角化的解释有两种。第一种:对角化指的就是相似对角化。第二种:矩阵A的对角化指的是存在可逆矩阵P,Q,使得PAQ为对角矩阵。

矩阵的相似对角化就是,对于方阵A,存在相似变换矩阵P,使得P1AP=ΛΛ对角矩阵

正交相似对角化:对于n阶实对称矩阵,一定会有正交矩阵Q,使得:

Q1AQ=QTAQ=Λ

Λ对角矩阵

2.2.相似矩阵的几何意义

本人之前写过的相关博客:【数学基础】第十五课:矩阵的相似变换和相合变换

A,B都是n阶方阵,若有可逆矩阵P,使得:

B=P1AP

则称P为相似变换矩阵,称BA的相似矩阵,记作:

AB

我们知道,线性映射是将一个向量映射到另一个向量,比如这里将x映射成y

x在自然基下的坐标向量用[x]ϵ表示,y在自然基下的坐标向量用[y]ϵ表示。矩阵A就是将坐标向量[x]ϵ映射到坐标向量[y]ϵ

这里坐标向量[x]ϵ=(02),坐标向量[y]ϵ=(31),矩阵A就是把(02)转换为(31)

还是将x映射成y,现在将这个映射表示在非自然基下:

x在非自然基下的坐标向量用[x]P表示,y在非自然基下的坐标向量用[y]P表示。矩阵B就是将坐标向量[x]P映射到坐标向量[y]P

这里坐标向量[x]P=(12),[y]P=(21)。矩阵B就是把(12)转换为(21)

也就是说矩阵A,矩阵B,都是将x映射到向量y,而它们只是不同基下的不同代数表达。

假如我们可以通过某矩阵P,将坐标向量[x]P变换为坐标向量[x]ϵ;矩阵P1,将坐标向量[y]ϵ变换为坐标向量[y]P

这个时候BP1AP都是将[x]P映射为[y]P,因此它们是相等的,即:

B=P1AP

2.3.椭圆

椭圆的第一定义:平面内与两定点F1,F2的距离的和等于常数2a2a>|F1F2|)的动点P的轨迹叫做椭圆。即:

|PF1|+|PF2|=2a

其中两定点F1,F2叫做椭圆的焦点,两焦点的距离|F1F2|=2c<2a叫做椭圆的焦距P为椭圆的动点

椭圆截与两焦点连线重合的直线所得的弦为长轴,长度为2a 。椭圆截垂直平分两焦点连线的直线所得弦为短轴,长度为2b

椭圆的标准方程(这里的“标准”指的是中心在原点,对称轴为坐标轴)有两种:

  • 焦点在X轴时,标准方程为:x2a2+y2b2=1(a>b>0)
  • 焦点在Y轴时,标准方程为:y2a2+x2b2=1(a>b>0)

3.cv::cornerHarris

1
2
3
4
5
6
7
8
void cornerHarris( 
	InputArray src, 
	OutputArray dst, 
	int blockSize,
	int ksize, 
	double k,
	int borderType = BORDER_DEFAULT 
);

参数详解:

  1. InputArray src:输入图像,为单通道8-bit或floating-point图像。
  2. OutputArray dst:输出图像,和输入图像大小一样,类型为CV_32FC1。图像存储的是响应值R
  3. int blockSize:滑动窗口的大小。
  4. int ksize:用于计算梯度的sobel算子的尺寸。
  5. double k:响应函数R中的k值。
  6. int borderType:边界填充方式,详见:【OpenCV基础】第十五课:边缘处理

4.代码地址

  1. Harris角点检测

5.参考资料

  1. 图像特征之Harris角点检测
  2. 角点检测:Harris 与 Shi-Tomasi
  3. 对角化和相似对角化有什么区别?
  4. 矩阵的相似对角化
  5. 矩阵相似的几何意义是什么?(知乎用户“马同学”的回答)
  6. 椭圆(百度百科)

0 comments
Anonymous
Markdown is supported

Be the first person to leave a comment!