多尺度Harris角点的学习

来源:互联网 发布:变电站仿真源码 编辑:程序博客网 时间:2024/05/16 17:42

主要转载下面两篇博文,因为讲的比较好,放到一起便于理解

1. Harris角点点我进入原文

2.  

Harris角点检测原理分析 点我进入原文


============================【Harris角点】=======================

1. 不同类型的角点

在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来定义角点可以有以下两种定义:

  1. 角点可以是两个边缘的角点;
  2. 角点是邻域内具有两个主方向的特征点;

前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败。早期主要有Rosenfeld和Freeman等人的方法,后期有CSS等方法。

基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺陷,此类方法主要有Moravec算子、Forstner算子、Harris算子、SUSAN算子等。

image

这篇文章主要介绍的Harris角点检测的算法原理,比较著名的角点检测方法还有jianbo Shi和Carlo Tomasi提出的Shi-Tomasi算法,这个算法开始主要是为了解决跟踪问题,用来衡量两幅图像的相似度,我们也可以把它看为Harris算法的改进。OpenCV中已经对它进行了实现,接口函数名为GoodFeaturesToTrack()。另外还有一个著名的角点检测算子即SUSAN算子,SUSAN是Smallest Univalue Segment Assimilating Nucleus(最小核值相似区)的缩写。SUSAN使用一个圆形模板和一个圆的中心点,通过圆中心点像素与模板圆内其他像素值的比较,统计出与圆中心像素近似的像元数量,当这样的像元数量小于某一个阈值时,就被认为是要检测的角点。我觉得可以把SUSAN算子看为Harris算法的一个简化。这个算法原理非常简单,算法效率也高,所以在OpenCV中,它的接口函数名称为:FAST() 。

2. Harris角点

2.1 基本原理

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。

image

对于图像I(x,y)I(x,y),当在点(x,y)(x,y)处平移(Δx,Δy)(Δx,Δy)后的自相似性,可以通过自相关函数给出:

c(x,y;Δx,Δy)=(u,v)W(x,y)w(u,v)(I(u,v)I(u+Δx,v+Δy))2c(x,y;Δx,Δy)=∑(u,v)∈W(x,y)w(u,v)(I(u,v)–I(u+Δx,v+Δy))2

其中,W(x,y)W(x,y)是以点(x,y)(x,y)为中心的窗口,w(u,v)w(u,v)为加权函数,它既可是常数,也可以是高斯加权函数。

image

根据泰勒展开,对图像I(x,y)I(x,y)在平移(Δx,Δy)(Δx,Δy)后进行一阶近似:

I(u+Δx,v+Δy)=I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)I(u,v)+Ix(u,v)Δx+Iy(u,v)ΔyI(u+Δx,v+Δy)=I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)≈I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy

其中,Ix,IyIx,Iy是图像I(x,y)I(x,y)的偏导数,这样的话,自相关函数则可以简化为:

c(x,y;Δx,Δy)w(Ix(u,v)Δx+Iy(u,v)Δy)2=[Δx,Δy]M(x,y)[ΔxΔy]c(x,y;Δx,Δy)≈∑w(Ix(u,v)Δx+Iy(u,v)Δy)2=[Δx,Δy]M(x,y)[ΔxΔy]

其中

M(x,y)=w[Ix(x,y)2Ix(x,y)Iy(x,y)Ix(x,y)Iy(x,y)Iy(x,y)2]=[wIx(x,y)2wIx(x,y)Iy(x,y)wIx(x,y)Iy(x,y)wIy(x,y)2]=[ACCB]M(x,y)=∑w[Ix(x,y)2Ix(x,y)Iy(x,y)Ix(x,y)Iy(x,y)Iy(x,y)2]=[∑wIx(x,y)2∑wIx(x,y)Iy(x,y)∑wIx(x,y)Iy(x,y)∑wIy(x,y)2]=[ACCB]

也就是说图像I(x,y)I(x,y)在点(x,y)(x,y)处平移(Δx,Δy)(Δx,Δy)后的自相关函数可以近似为二项函数:

c(x,y;Δx,Δy)AΔx2+2CΔxΔy+BΔy2c(x,y;Δx,Δy)≈AΔx2+2CΔxΔy+BΔy2

其中

A=wI2x,B=wI2y,C=wIxIyA=∑wIx2,B=∑wIy2,C=∑wIxIy

二次项函数本质上就是一个椭圆函数。椭圆的扁率和尺寸是由M(x,y)M(x,y)的特征值λ1λ2λ1、λ2决定的,椭贺的方向是由M(x,y)M(x,y)的特征矢量决定的,如下图所示,椭圆方程为:

[Δx,Δy]M(x,y)[ΔxΔy]=1[Δx,Δy]M(x,y)[ΔxΔy]=1

image

椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。共可分为三种情况:

  • 图像中的直线。一个特征值大,另一个特征值小,λ1λ2λ1≫λ2λ2λ1λ2≫λ1。自相关函数值在某一方向上大,在其他方向上小。
  • 图像中的平面。两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。
  • 图像中的角点。两个特征值都大,且近似相等,自相关函数在所有方向都增大。

    image

根据二次项函数特征值的计算公式,我们可以求M(x,y)M(x,y)矩阵的特征值。但是Harris给出的角点差别方法并不需要计算具体的特征值,而是计算一个角点响应值RR来判断角点。RR的计算公式为:

R=detMα(traceM)2R=detM−α(traceM)2

式中,detMdetM为矩阵M=[ABBC]M=[ABBC]的行列式;traceMtraceM为矩阵MM的直迹;αα为经常常数,取值范围为0.04~0.06。事实上,特征是隐含在detMdetMtraceMtraceM中,因为,

detM=λ1λ2=ACB2detM=λ1λ2=AC−B2

traceM=λ2+λ2=A+CtraceM=λ2+λ2=A+C

2.2 Harris角点算法实现

根据上述讨论,可以将Harris图像角点检测算法归纳如下,共分以下五步:

1. 计算图像I(x,y)I(x,y)XXYY两个方向的梯度IxIyIx、Iy

Ix=Ix=I(1 0 1)Iy=Ix=I(1 0 1)TIx=∂I∂x=I⊗(−1 0 1),Iy=∂I∂x=I⊗(−1 0 1)T

2. 计算图像两个方向梯度的乘积。

I2x=IxIyI2y=IyIyIxy=IxIyIx2=Ix⋅Iy,Iy2=Iy⋅Iy,Ixy=Ix⋅Iy

3. 使用高斯函数对I2xI2yIxyIx2、Iy2和Ixy进行高斯加权(取σ=1σ=1),生成矩阵MM的元素ABA、BCC

A=g(I2x)=I2xwC=g(I2y)=I2ywB=g(Ix,y)=IxywA=g(Ix2)=Ix2⊗w,C=g(Iy2)=Iy2⊗w,B=g(Ix,y)=Ixy⊗w

4. 计算每个像素的Harris响应值RR,并对小于某一阈值ttRR置为零。

R={R:detMα(traceM)2<t}R={R:detM−α(traceM)2<t}

5. 在3×33×35×55×5的邻域内进行非最大值抑制,局部最大值点即为图像中的角点。

Harris角点检测的C++实现代码:https://github.com/RonnyYoung/ImageFeatures/blob/master/source/harris.cpp

2.3 Harris角点的性质

1. 参数αα对角点检测的影响

假设已经得到了矩阵MM的特征值λ1λ20λ1≥λ2≥0,令λ2=kλ1,0k1λ2=kλ1,0≤k≤1。由特征值与矩阵MM的直迹和行列式的关系可得:

detM=iλi      traceM=iλidetM=∏iλi      traceM=∑iλi

从而可以得到角点的响应

R=λ2λ2=α(λ2+λ2)2=λ2(kα(1+k)2)R=λ2λ2=α(λ2+λ2)2=λ2(k−α(1+k)2)

假设R0R≥0,则有:

0αk(1+k)20.250≤α≤k(1+k)2≤0.25

对于较小的kk值,Rλ2(kα),α<kR≈λ2(k−α),α<k

由此,可以得出这样的结论:增大αα的值,将减小角点响应值RR,降低角点检测的灵性,减少被检测角点的数量;减小αα值,将增大角点响应值RR,增加角点检测的灵敏性,增加被检测角点的数量。

2. Harris角点检测算子对亮度和对比度的变化不敏感

这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。

image image

3. Harris角点检测算子具有旋转不变性

Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值RR也不发生变化,由此说明Harris角点检测算子具有旋转不变性。

4. Harris角点检测算子不具有尺度不变性

如下图所示,当右图被缩小时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的。左侧的图像可能被检测为边缘或曲线,而右侧的图像则可能被检测为一个角点。

image

2.4 Harris的OpenCV接口

OpenCV的Hairrs角点检测的函数为cornerHairrs(),但是它的输出是一幅浮点值图像,浮点值越高,表明越可能是特征角点,我们需要对图像进行阈值化。

C++: void cornerHarris(InputArray src, OutputArray dst, int blockSize, int apertureSize, double k, int borderType = BORDER_DEFAULT);
  • src – 输入的单通道8-bit或浮点图像。
  • dst – 存储着Harris角点响应的图像矩阵,大小与输入图像大小相同,是一个浮点型矩阵。
  • blockSize – 邻域大小。
  • apertureSize – 扩展的微分算子大。
  • k – 响应公式中的,参数αα
  • boderType – 边界处理的类型。
int main(){    Mat image = imread("../buliding.png");    Mat gray;    cvtColor(image, gray, CV_BGR2GRAY);    Mat cornerStrength;    cornerHarris(gray, cornerStrength, 3, 3, 0.01);    threshold(cornerStrength, cornerStrength, 0.001, 255, THRESH_BINARY);    return 0;}

 

  image     image   image

从上面上间一幅图像我们可以看到,有很多角点都是粘连在一起的,我们下面通过加入非极大值抑制来进一步去除一些粘在一起的角点。

非极大值抑制原理是,在一个窗口内,如果有多个角点则用值最大的那个角点,其他的角点都删除,窗口大小这里我们用3*3,程序中通过图像的膨胀运算来达到检测极大值的目的,因为默认参数的膨胀运算就是用窗口内的最大值替代当前的灰度值。

int main(){    Mat image = imread("buliding.png");    Mat gray;    cvtColor(image, gray, CV_BGR2GRAY);    Mat cornerStrength;    cornerHarris(gray, cornerStrength, 3, 3, 0.01);    double maxStrength;    double minStrength;    // 找到图像中的最大、最小值    minMaxLoc(cornerStrength, &minStrength, &maxStrength);    Mat dilated;    Mat locaMax;    // 膨胀图像,最找出图像中全部的局部最大值点    dilate(cornerStrength, dilated, Mat());    // compare是一个逻辑比较函数,返回两幅图像中对应点相同的二值图像    compare(cornerStrength, dilated, locaMax, CMP_EQ);    Mat cornerMap;    double qualityLevel = 0.01;    double th = qualityLevel*maxStrength; // 阈值计算    threshold(cornerStrength, cornerMap, th, 255, THRESH_BINARY);    cornerMap.convertTo(cornerMap, CV_8U);    // 逐点的位运算    bitwise_and(cornerMap, locaMax, cornerMap);    drawCornerOnImage(image, cornerMap);    namedWindow("result");    imshow("result", image);    waitKey();    return 0;}void drawCornerOnImage(Mat& image, const Mat&binary){    Mat_<uchar>::const_iterator it = binary.begin<uchar>();    Mat_<uchar>::const_iterator itd = binary.end<uchar>();    for (int i = 0; it != itd; it++, i++)    {        if (*it)            circle(image, Point(i%image.cols, i / image.cols), 3, Scalar(0, 255, 0), 1);    }}

现在我们得到的效果就比默认的函数得到的结果有相当的改善,如上面最右边效果图。

3. 多尺度Harris角点

3.1 多尺度Harris角点的原理

虽然Harris角点检测算子具有部分图像灰度变化的不变性和旋转不变性,但它不具有尺度不变性。但是尺度不变性对图像特征来说至关重要。人们在使用肉眼识别物体时,不管物体远近,尺寸的变化都能认识物体,这是因为人的眼睛在辨识物体时具有较强的尺度不变性。在图像特征提取:尺度空间理论这篇文章里就已经讲到了高斯尺度空间的概念。下面将Harris角点检测算子与高斯尺度空间表示相结合,使用Harris角点检测算子具有尺度的不变性。

仿照Harris角点检测中二阶矩的表示方法,使用M=μ(x,σI,σD)M=μ(x,σI,σD)为尺度自适应的二阶矩:

M=μ(x,σI,σD)=σ2Dg(σI)[L2x(x,σD)LxLy(x,σD)LxLy(x,σD)L2y(x,σD)]M=μ(x,σI,σD)=σD2g(σI)⊗[Lx2(x,σD)LxLy(x,σD)LxLy(x,σD)Ly2(x,σD)]

其中,g(σI)g(σI)表示尺度为sigmaIsigmaI的高斯卷积核,xx表示图像的位置。与高斯测度空间类似,使用L(x)L(x)表示经过高斯平滑后的图像,符号表示卷积,Lx(x,σD)Lx(x,σD)Ly(x,σD)Ly(x,σD)表示对图像使用高斯g(σD)g(σD)函数进行平滑后,在xxyy方向取其微分的结果,即Lx=xLLx=∂xLLy=yLLy=∂yL。通常将σIσI称为积分尺度,它是决定Harris角点当前尺度的变量,σDσD为微分尺度或局部尺度,它是决定角点附近微分值变化的变量。显然,积分尺度σIσI应该大于微分尺度σDσD

3.2 多尺度Harris角点实现

首先,检测算法从预先定义的一组尺度中进行积分尺度搜索,这一组尺度定义为

σ1σn=σ0knσ0σ1…σn=σ0…knσ0

一般情况下使用k=1.4。为了减少搜索的复杂性,对于微分尺度σDσD的选择,我们采用在积分尺度的基础上,乘以一个比例常数,即σD=sσIσD=sσI,一般取s=0.7。这样,通常使用积分和微分的尺度,便可以生成μ(x,σI,σD)μ(x,σI,σD),再利用Harris角点判断准则,对角点进行搜索,具体可以分两步进行。

1. 与Harris角点搜索类似,对于给定的尺度空间值σDσD,进行如下角点响应值计算和判断:

cornerness=det(μ(x,σn)αtrace2(μ(x,σn)))>thresholdHcornerness=det(μ(x,σn)−αtrace2(μ(x,σn)))>thresholdH

2. 对于满足1中条件的点,在点的8邻域内进行角点响应最大值搜索(即非最大值抑制)出在8邻域内角点响应最大值的点。对于每个尺度σn(1,2,,n)σn(1,2,…,n)都进行如上搜索。

由于位置空间的候选点并不一定在尺度空间上也能成为候选点,所以,我们还要在尺度空间上进行搜索,找到该点的所谓特征尺度值。搜索特征尺度值也分两步。

1. 对于位置空间搜索到的每个候选点,进行拉普拉斯响应计算,并满足其绝对值大于给定的阈值条件:

F(x,σn)=σ2n|Lxx(x,σn)+Lyy(x,σn)|thresholdLF(x,σn)=σn2|Lxx(x,σn)+Lyy(x,σn)|≥thresholdL

2. 与邻近的两个尺度空间的拉普拉斯响应值进行比较,使其满足:

F(x,σn)>F(x,σl),   l{n1.n+1}F(x,σn)>F(x,σl),   l∈{n−1.n+1}

满足上述条件的尺度值就是该点的特征尺度值。这样,我们就找到了在位置空间和尺度空间都满足条件的Harris角点。

多尺度Harris角点检测C++实现:https://github.com/RonnyYoung/ImageFeatures/blob/master/source/harrisLaplace.cpp

4. 更多的讨论

在上面描述的Harris角点具有光照不变性、旋转不变性、尺度不变性,但是严格意义上来说并不具备仿射不变性。Harris-Affine是一种新颖的检测仿射不变特征点的方法,可以处理明显的仿射变换,包括大尺度变化和明显的视角变化。Harris-Affine主要是依据了以下三个思路:

  1. 特征点周围的二阶矩的计算对区域进行的归一化,具有仿射不变性;
  2. 通过在尺度空间上归一化微分的局部极大值求解来精化对应尺度;
  3. 自适应仿射Harris检测器能够精确定位牲点;

这篇文章不对Harris-Affine作进一步的描述,有时间会对这一算法做专门的分析,有兴趣的可以参考原论文:Scale & Affine Invariant Interest Point Detectors.

5. 参考资料

[1] 《图像局部不变特征与描述》王永明,王贵锦。

[2] Harris角点及Shi-Tomasi角点检测

[3] 图像特征提取PPT

[4] Harris角点检测算法 1

[5] OpenCV Harris角点检测

[6] Opencv学习笔记(五)Harris角点检测

分类: 图像特征提取

=================================【Harris角点检测原理分析】=======================================


 点我进入原文


主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601  Harris角点检测算子

本文将该文拷贝了过来,并做了一些数学方面的补充,以方便对数学已经生疏的小伙伴们参考理解。由于补充的内容还挺多,所以还是将本文标注为了原创。

我增加的部分在文中用 {{  }} 圈了起来并用红色字体标注。

正文开始。


Harris角点检测算子是于1988年由CHris Harris & Mike Stephens提出来的。在具体展开之前,不得不提一下Moravec早在1981就提出来的Moravec角点检测算子。

1.Moravec角点检测算子

        Moravec角点检测算子的思想其实特别简单,在图像上取一个W*W的“滑动窗口”,不断的移动这个窗口并检测窗口中的像素变化情况E。像素变化情况E可简单分为以下三种:A  如果在窗口中的图像是什么平坦的,那么E的变化不大。B  如果在窗口中的图像是一条边,那么在沿这条边滑动时E变化不大,而在沿垂直于这条边的方向滑动窗口时,E的变化会很大。 C  如果在窗口中的图像是一个角点时,窗口沿任何方向移动E的值都会发生很大变化。

上图就是对Moravec算子的形象描述。用数学语言来表示的话就是:

其中(x,y)就表示四个移动方向(1,0)(1,1)(0,1)(-1,1),E就是像素的变化值。Moravec算子对四个方向进行加权求和来确定变化的大小,然和设定阈值,来确定到底是边还是角点。

 

2.Harris角点检测算子

        Harris角点检测算子实质上就是对Moravec算子的改良和优化。在原文中,作者提出了三点Moravec算子的缺陷并且给出了改良方法:

1.  Moravec算子对方向的依赖性太强,在上文中我们可以看到,Moravec算子实际上只是移动了四个45度角的离散方向,真正优秀的检测算子应该能考虑到各个现象的移动变化情况。为此,作者采用微分的思想(这里不清楚的话可以复习下高数中的全微分):

其中:

 

 

所以E就可以表示为:

2.由于Moravec算子采用的是方形的windows,因此的E的响应比较容易受到干扰,Harris采用了一个较为平滑的窗口——高斯函数:

3.Moravec算子对边缘响应过于灵敏。为此,Harris提出了对E进行变形:

对,没错,变成了二次型,果然是大牛,更牛的还在后面!其中,

用α,β表示矩阵M的特征值,这样会产生三种情况:A  如果α,β都很小,说明高斯windows中的图像接近平坦。 B  如果一个大一个小,则表示检测到边。 C  如果α,β都很大,那么表示检测到了角点。

α,β是什么?α,β就是椭圆的长短轴的度量,什么?椭圆哪里来?椭圆就是那个二次型函数来的!下图的意思我就不详细讲解了,相信大家能懂。

{{

转载注:NewThinker_wei:

关于矩阵知识的一点补充:好长时间没看过线性代数的话,这一段比较难理解。可以看到M是实对称矩阵,这里简单温习一下实对称矩阵和二次型的一些知识点吧。

1. 关于特征值和特征向量:

特征值的特征向量的概念忘了就自己查吧,这里只说关键的。对于实对称矩阵M(设阶数为n),则一定有n个实特征值,每个特征值对应一组特征向量(这组向量中所有向量共线),不同特征值对应的特征向量间相互正交;(注意这里说的是实对称矩阵,不是所有的矩阵都满足这些条件)

2. 关于对角化:

对角化是指存在一个正交矩阵Q,使得  Q’MQ 能成为一个对角阵(只有对角元素非0),其中Q’是Q的转置(同时也是Q的逆,因为正交矩阵的转置就是其逆)。一个矩阵对角化后得到新矩阵的行列式和矩阵的迹(对角元素之和)均与原矩阵相同。如果M是n阶实对称矩阵,则Q中的第 j 列就是第 j 个特征值对应的一个特征向量(不同列的特征向量两两正交)。

3. 关于二次型:

对于一个n元二次多项式,f(x1,x2....xn) = ∑ ( aij*xi*xj ) ,其中 i 和 j 的求和区间均为 [1,n] ,

可将其各次的系数 aij 写成一个n*n矩阵M,由于 aij 和 aji 的对称等价关系,一般将 aij 和 aji 设为一样的值,均为 xi*xj 的系数的二分之一。这样,矩阵M就是实对称矩阵了。即二次型的矩阵默认都是实对称矩阵

4. 关于二次型的标准化(正交变换法):

二次型的标准化是指通过构造一个n阶可逆矩阵 C,使得向量 ( x1,x2...xn ) = C * (y1,y2...yn),把n维向量 x 变换成n维向量 y ,并代入f(x1,x2....xn) 后得到 g(y1,y2...yn),而后者的表达式中的二次项中不包含任何交叉二次项 yi*yj(全部都是平方项 yi^2),也即表达式g的二次型矩阵N是对角阵。用公式表示一下 f 和 g ,(下面的表达式中 x 和 y都代表向量,x' 和 y' 代表转置)

f = x' * M * x ;

g = f = x' * M * x = (Cy)' * M * (Cy) = y' * (C'MC) * y = y' * N * y  ;

因此 C‘MC = N。正交变换法,就是直接将M对角化得到N,而N中对角线的元素就是M的特征值。正交变换法中得到的 C 正好是一个正交矩阵,其每一列都是两两正交的单位向量,因此 C 的作用仅仅是将坐标轴旋转(不会有放缩)。 


OK,基础知识补充完了,再来说说Harris角点检测中的特征值是怎么回事。这里的 M 是


将M对角化后得到矩阵N,他们都是2阶矩阵,且N的对角线元素就是本文中提到的 α 和 β。

本来 E(x,y) = A*x^2 + 2*C*x*y + B*y^2 ,而将其标准后得到新的坐标 xp和yp,这时表达式中就不再含有交叉二次项,新表达式如下:

 E(x,y) = Ep (xp,yp) = α*xp^2 + β*yp^2,

我们不妨画出 Ep (xp,yp) = 1 的等高线L ,即

 α*xp^2 + β*yp^2 = 1 ,

可见这正好是(xp,yp)空间的一个椭圆,而α 和 β则分别是该椭圆长、短轴平方的倒数(或者反过来),且长短轴的方向也正好是α 和 β对应的特征向量的方向。由于(x,y)空间只是 (xp,yp)空间的旋转,没有放缩,因此等高线L在(x,y)空间也是一个全等的椭圆,只不过可能是倾斜的。

现在就能理解下面的图片中出现的几个椭圆是怎么回事了,图(a)中画的正是高度为 1 的等高线,(其他”高度“处的等高线也是椭圆,只不过长短轴的长度还要乘以一个系数)。其他的几幅图片中可以看到,“平坦”区域由于(高度)变化很慢,等高线(椭圆)就比较大;而”边缘“区域则是在一个轴向上高度变化很快,另一个与之垂直的轴向上高度变化很慢,因此一个轴很长一个轴很短;“角点”区域各个方向高度都变化剧烈,因此椭圆很小。我们人眼可以直观地看到椭圆的大小胖瘦,但如何让计算机识别这三种不同的几何特征呢?为了能区分出角点、边缘和平坦区域我们现在需要用α 和 β构造一个特征表达式,使得这个特征式在三种不同的区域有明显不同的值。一个表现还不错的特征表达式就是:

(αβ) - k(α+β)^2

表达式中的 k 的值怎么选取呢?它一般是一个远小于 1 的系数,OpenCV的默认推荐值是 0.04(=0.2的平方),它近似地表达了一个阈值:当椭圆短、长轴的平方之比(亦即α 和 β两个特征值之比)小于这个阈值时,认为该椭圆属于“一个轴很长一个轴很短”,即对应的点会被认为是边缘区域。

对于边缘部分,(假设较大的特征值为β)由于 β>>α且α<kβ,因此特征式 :

(αβ) - k(α+β)^2 ≈ αβ - kβ^2  <  (kβ)β - kβ^2 = 0

即边缘部分的特征值小于0 ;

对于非边缘部分,α 和 β相差不大,可认为 (α+β)^2 ≈ 4αβ,因此特征式:

(αβ) - k(α+β)^2 ≈ αβ - 4kαβ =  ( 1 - 4k ) * αβ

由于 k 远小于1,因此 1 - 4k ≈ 1,这样特征式进一步近似为:

(αβ) - k(α+β)^2 ≈  αβ

在角点区域,由于α 和 β都较大,对应的特征式的值也就很大;而在平坦区域,特征式的值则很小。


因此,三种不同区域的判别依据就是: 如果特征表达式的值为负,则属于边缘区域;如果特征表达式的值较大,则属于角点区域;如果特征表达式的值很小,则是平坦区域。

最后,由于αβ和(α+β)正好是M对角化后行列式和迹,再结合上面补充的基础知识第2条中提到的行列式和迹在对角化前后不变,就可以得到 (αβ) - k(α+β)^2 = det(M) - k*Tr(M)^2,这就是Harris检测的表达式。


转载注解完毕,下面接原文。

}}

有人又要问了,你怎么知道我检测到α,β算大还是算小?对此天才哈里斯定义了一个角点响应函数:

其中(这些都是线性代数里的知识):

我们惊喜的发现,R为正值是,检测到的是角点,R为负时检测到的是边,R很小时检测到的是平坦区域。至于他怎么想出来的,我就不得而知了......

 Harris角点检测算法有诸多优点:A  旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)

B  对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变

当然Harris也有许多不完善的地方:A  它对尺度很敏感,不具备几何尺度不变性。

 

B  提取的角点是像素级的。以至于后来又有许多牛人提出了更多更完善的检测算子,且听下回分解!

0 0