Harris⾓点检测
⽬录
OpenCV可以检测图像的主要特征,然后提取这些特征、使其成为图像描述符,这类似于⼈的眼睛和⼤脑。这些图像特征可作为图像搜索的数据库。此外,⼈
们可以利⽤这些关键点将图像拼接起来,组成⼀个更⼤的图像,⽐如将许多图像放在⼀块,然后形成⼀个360度全景图像。
这⾥我们将学习使⽤OpenCV来检测图像特征,并利⽤这些特征进⾏图像匹配和搜索。我们会选取⼀些图像,并通过单应性,检测这些图像是否在另⼀张图像
中。
⼀特征检测算法
有许多⽤于特征检测和提取的算法,我们将会对其中⼤部分进⾏介绍。OpenCV最常使⽤的特征检测和提取算法有:
Harris:该算法⽤于检测⾓点;
SIFT:该算法⽤于检测斑点;
SURF:该算法⽤于检测⾓点;
FAST:该算法⽤于检测⾓点;
BRIEF:该算法⽤于检测斑点;
ORB:该算法代表带⽅向的FAST算法与具有旋转不变性的BRIEF算法;
通过以下⽅法进⾏特征匹配:
暴⼒(Brute-Force)匹配法;
基于FLANN匹配法;
可以采⽤单应性进⾏空间验证。
⼆特征定义
那么,究竟什么是特征呢?为什么⼀副图像的某个特定区域可以作为⼀个特征,⽽其他区域不能呢?粗略的讲,特征就是有意义的图像区域,该区域具有独
特特征和易于识别性。因此⾓点及⾼密度区域都是很好的特征,⽽⼤量重复的模式或低密度区域(例如图像中的蓝⾊天空)则不是很好的特征。边缘可以将图像
分为两个区域,因此也可以看做好的特征。斑点是与周围有很⼤差别的像素区域,也是有意义的特征。
⼤多数特征检测算法都会涉及图像的⾓点、边和斑点的识别,也有⼀些涉及脊向的概念,可以认为脊向是细长物体的对称轴,例如识别图像中的⼀条路。⾓
点和边都好理解,那什么是斑点呢?斑点通常是指与周围有着颜⾊和灰度差别的区域。在实际地图中,往往存在着⼤量这样的斑点,如⼀颗树是⼀个斑点,
⼀块草地是⼀个斑点,⼀栋房⼦也可以是⼀个斑点。由于斑点代表的是⼀个区域,相⽐单纯的⾓点,它的稳定性要好,抗噪声能⼒要强,所以它在图像配准
上扮演了很重要的⾓⾊。
由于某些算法在识别和提取某类型特征的时候有较好的效果,所以知道输⼊图像是什么很重要,这样做有利于选择最合适的OpenCV⼯具包。
三Harris检测⾓点特征
在这之前其实我们已经接触过⾓点检测了,在相机标定的时候,我们就利⽤到了⾓点检测。不过那时候没有深⼊的去研究。在这⾥,我们将会深⼊原理去学
习⾓点检测。
下⾯我们从使⽤cornerHarris()函数讲起。
cornerHarris(src,blockSize,ksize,k[,dst[,borderType]]);
参数详解:
image:输⼊的单通道8位或者浮点图像;
blockSize:就是扫描时候窗⼝的⼤⼩。
ksize:cornerHarris函数会使⽤Sobel算⼦,该参数定义了Sobel算⼦的中孔。简单来说,该函数定义了⾓点检测的敏感度,其值必须介于3~31之间的奇
数。
k:harris计算响应公式中的kk值,⼀般取0.04~0.06;
borderType:像素插值⽅法;
函数cornerHarris对输⼊图像进⾏Harris边界检测。输出是⼀幅浮点值图像,⼤⼩与输⼊图像⼤⼩相同,浮点值越⾼,表明越可能是特征⾓点(我们可以对图
像进⾏阈值化)。
#-*-coding:utf-8-*-
"""
CreatedonMonAug2020:17:342018
@author:lenovo
"""
'''
Harris⾓点检测
'''
importcv2
importnumpyasnp
img=('./image/')
img=(img,dsize=(600,400))
gray=or(img,_BGR2GRAY)
gray=32(gray)
#⾓点检测第三个参数为⾓点检测的敏感度,其值必须介于3~31之间的奇数
dst=Harris(gray,3,23,0.04)
print()#(400,600)
img[dst>0.01*()]=[0,0,255]
('',img)
y(0)
yAllWindows()
运⾏结果如下:
如果我们把第三个参数改为3:,可以看到:
四Harris检测原理
上⾯我们已经通过实例演⽰了Harris检测的效果,相信你对Harris⾓点检测已经有了初步的认识。这⾥我将带你深⼊了解Harris⾓点检测的原理。
我们先来看⼀幅图⽚,了解⼀下什么是⾓点?
上图中E,F中的⾓我们通常称作⾓点(cornerpoints),他们具有以下特征:
轮廓之间的交点;
对于同⼀场景,即使视⾓发⽣变化,通常具备稳定性质的特征;
该点附近区域的像素点⽆论在梯度⽅向上还是其梯度幅值上有着较⼤变化;
harris特征⾓最早在paperACombinedCornerandEdgeDetector中被ChrisHarris&MikeStephens提出。
Harris⾓点检测的基本思想:算法基本思想是使⽤⼀个固定窗⼝在图像上进⾏任意⽅向上的滑动,⽐较滑动前与滑动后两种情况,窗⼝中的像素灰度变化程
度,如果存在任意⽅向上的滑动,都有着较⼤灰度变化,那么我们可以认为该窗⼝中存在⾓点。
1、灰度变化描述
当窗⼝发⽣[u,v][u,v]移动时,那么滑动前与滑动后对应的窗⼝中的像素点灰度变化描述如下:
E(u,v)=∑(x,y)€Ww(x,y)[I(x+u,y+v)−I(x,y)]2E(u,v)=∑(x,y)€Ww(x,y)[I(x+u,y+v)−I(x,y)]2
参数解释:
[u,v][u,v]是窗⼝WW的偏移量;
(x,y)(x,y)是窗⼝WW所对应的像素坐标位置,窗⼝有多⼤,就有多少个位置;
I(x,y)I(x,y)是像素坐标位置(x,y)(x,y)的图像灰度值;
I(x+u,y+v)I(x+u,y+v)是像素坐标位置(x+u,y+v)(x+u,y+v)的图像灰度值;
w(x,y)w(x,y)是窗⼝函数,最简单情形就是窗⼝WW内的所有像素所对应的ww权重系数均为1.但有时候,我们会将w(x,y)w(x,y)函数设置为以窗⼝WW中
⼼为原点的⼆元正太分布。如果窗⼝WW中⼼点是⾓点时,移动前与移动后,该点在灰度变化贡献最⼤;⽽离窗⼝WW中⼼(⾓点)较远的点,这些点的灰
度变化⼏近平缓,这些点的权重系数,可以设定⼩值,以⽰该点对灰度变化贡献较⼩,那么我们⾃然⽽然想到使⽤⼆元⾼斯函数来表⽰窗⼝函数;
我们的窗⼝函数通常有如下两种形式:
根据上述表达式,当窗⼝在平潭区域上移动,可以想象得到,灰度不会发⽣什么变换。E(u,v)=0E(u,v)=0;如果窗⼝处在纹理⽐较丰富的区域上滑动,那么灰
度变化会很⼤。算法最终思想就是计算灰度发⽣较⼤变化时所对应的位置,当然这个较⼤是指任意⽅向上的滑动,并⾮单指某个⽅向。
2、E(u,v)E(u,v)化简
⾸先需要了解泰勒公式,任何⼀个函数表达式,均可有泰勒公式进⾏展开,以逼近原函数,我们可以对下⾯函数进⾏⼀阶展开(如果对泰勒公式忘记了,可以
翻翻本科所学的⾼等数学)。
f(x+u,y+v)≈f(x,y)+ufx(x,y)+vfy(x,y)f(x+u,y+v)≈f(x,y)+ufx(x,y)+vfy(x,y)
那么
∑(x,y)€Ww(x,y)[I(x+u,y+v)−I(x,y)]2∑(x,y)€Ww(x,y)[I(x+u,y+v)−I(x,y)]2
≈∑(x,y)€Ww(x,y)[I(x,y)+uIx+vIy−I(x,y)]2≈∑(x,y)€Ww(x,y)[I(x,y)+uIx+vIy−I(x,y)]2
=∑(x,y)€Ww(x,y)[u2I2x+2uvIxIy+v2I2y]=∑(x,y)€Ww(x,y)[u2Ix2+2uvIxIy+v2Iy2]
=∑(x,y)€Ww(x,y)[uv][I2xIxIyIxIyI2y][uv]=∑(x,y)€Ww(x,y)[uv][Ix2IxIyIxIyIy2][uv]
=[uv](∑(x,y)€Ww(x,y)[I2xIxIyIxIyI2y])[uv]=[uv](∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2])[uv]
所以E(u,v)E(u,v)表达式可以更新为:
E(u,v)=[uv]M[uv]E(u,v)=[uv]M[uv]
其中:M=∑(x,y)€Ww(x,y)[I2xIxIyIxIyI2y]M=∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2],IxIx,IyIy分别为窗⼝内像素点(x,y)(x,y)在xx⽅向上和yy⽅向上的梯度值。
3、矩阵MM的关键性
难道我们是直接求上述的E(u,v)E(u,v)值来判断⾓点吗?Harris⾓点检测并没有这样做,⽽是通过对窗⼝内的每个像素的xx⽅向上的梯度与yy⽅向上的梯度进⾏
统计分析。这⾥以IxIx和IyIy为坐标轴,因此每个像素的梯度坐标可以表⽰成(Ix,Iy)(Ix,Iy)。针对平坦区域,边缘区域以及⾓点区域三种情形进⾏分析:
下图是对这三种情况窗⼝中的对应像素的梯度分布进⾏绘制:
不知道⼤家有没有注意到这三种区域的特点:
平坦区域上的每个像素点所对应的(Ix,Iy)(Ix,Iy)坐标分布在原点附近,其实也很好理解,针对平坦区域的像素点,他们的梯度⽅向虽然各异,但是其幅值
都不是很⼤,所以均聚集在原点附近;
边缘区域有⼀坐标轴分布较散,⾄于是哪⼀个坐标上的数据分布较散不能⼀概⽽论,这要视边缘在图像上的具体位置⽽定,如果边缘是⽔平或者垂直⽅
向,那么IyIy轴⽅向或者IxIx⽅向上的数据分布就⽐较散;
⾓点区域的xx、yy⽅向上的梯度分布都⽐较散。
我们是不是可以根据这些特征来判断哪些区域存在⾓点呢?
上⾯我们已经计算出了MM矩阵:
M=∑(x,y)€Ww(x,y)[I2xIxIyIxIyI2y]=[ACCB]M=∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2]=[ACCB]
我们可以将E(u,v)E(u,v)近似为⼆项函数:
E(u,v)=Au2+2Cuv+Bv2E(u,v)=Au2+2Cuv+Bv2
其中
A=∑(x,y)€Ww(x,y)∗I2xA=∑(x,y)€Ww(x,y)∗Ix2
B=∑(x,y)€Ww(x,y)∗I2yB=∑(x,y)€Ww(x,y)∗Iy2
C=∑(x,y)€Ww(x,y)∗IxIyC=∑(x,y)€Ww(x,y)∗IxIy
⼆次项函数本质上就是⼀个椭圆函数。椭圆的长和宽是由MM的特征值λ1,λ2λ1,λ2决定的(椭圆的长短轴正是矩阵MM特征值平⽅根的倒数),椭圆的⽅向是
由MM的特征向量决定的,椭圆⽅程为:
[uv]M[uv]=1[uv]M[uv]=1
如果使⽤椭圆进⾏数据集表⽰,则绘制图⽰如下:
虽然我们利⽤E(u,v)E(u,v)来描述⾓点的基本思想,然⽽最终我们仅仅使⽤的是矩阵MM。让我们看看矩阵MM形式,是不是跟协⽅差矩阵形式很像,像归像,
但是还是有些不同,哪⼉不同?⼀般协⽅差矩阵对应维的随机变量需要减去该维随机变量的均值:
把IxIx,IyIy看成两个字段,假设窗⼝内有m个像素点,也就是等价于有m个样本,我们先计算每个字段的均值:
Ix¯=∑i=1mIxiIx¯=∑i=1mIxi
Iy¯=∑i=1mIyiIy¯=∑i=1mIyi
我们仍然使⽤(Ixi,Iyi)(Ixi,Iyi)表⽰样本(Ixi,Iyi)(Ixi,Iyi)去均值后的值,则由这m个样本组成的矩阵:
X=[Ix1Iy1Ix2Iy2......IxmIym]X=[Ix1Ix2...IxmIy1Iy2...Iym]
则对应协⽅差矩阵可以写成:
C=1mXXT=1m∑i=1m[I2xIxIyIxIyI2y]C=1mXXT=1m∑i=1m[Ix2IxIyIxIyIy2]
但矩阵MM中并没有这样做,所以在矩阵MM⾥,我们先进⾏各维的均值化处理,那么各维所对应的随机变量的均值为0,协⽅差矩阵就⼤⼤简化了,简化的最
终结果就是矩阵MM,是否明⽩了(注意为了简化运算,我们先假设MM矩阵中的权重系数w(x,y)=1w(x,y)=1,并且省略掉了求均值)我们的⽬的是分析数据的主
要成分,相信了解PCA原理的,应该都了解均值化的作⽤。
M=∑(x,y)€W[I2xIxIyIxIyI2y]M=∑(x,y)€W[Ix2IxIyIxIyIy2]
如果我们对协⽅差矩阵MM进⾏对⾓化,很明显,其对⾓线就是各个字段的⽅差,这点⼤家应该明⽩吧?不明⽩的话可以复习下PCA原理。
如果两个字段(Ix,Iy)(Ix,Iy)所对应的特征值都⽐较⼤,说明什么?像素点的梯度分布⽐较散,梯度变化程度⽐较⼤,符合⾓点在窗⼝区域的特点;
如果是平坦区域,那么像素点的梯度所构成的点集⽐较集中在原点附近,因为窗⼝区域内的像素点的梯度幅值⾮常⼩,此时矩阵MM的对⾓化的两个特
征值⽐较⼩;
如果是边缘区域,在计算像素点的xx、yy⽅向上的梯度时,边缘上的像素点的某个⽅向的梯度幅值变化⽐较明显,另⼀个⽅向上的梯度幅值变化较弱,
其余部分的点都还是集中原点附近,这样MM对⾓化后的两个特征值理论应该是⼀个⽐较⼤,⼀个⽐较⼩,当然对于边缘这种情况,可能是呈45°的边
缘,致使计算出的特征值并不是都特别的⼤,总之跟含有⾓点的窗⼝的分布情况还是不同的。
注:MM为协⽅差矩阵,需要⼤家⾃⼰去理解下,窗⼝中的像素集构成⼀个矩阵(X€R2×mX€R2×m,假设这⾥有m个像素点),使⽤该矩阵乘以该矩阵的转
置,即是协⽅差矩阵。
因此可以得出下列结论:
特征值都⽐较⼤时,即窗⼝中含有⾓点;
特征值⼀个较⼤,⼀个较⼩,窗⼝中含有边缘;
特征值都⽐较⼩,窗⼝处在平坦区域;
4、如何度量⾓点响应
通常⽤下⾯表达式进⾏度量,对每⼀个窗⼝计算得到⼀个分数RR,根据RR的⼤⼩来判定窗⼝内是否存在harris特征⾓。分数RR根据下⾯公式计算得到:
R=det(M)−k(trace(M))2R=det(M)−k(trace(M))2
det(M)=λ1λ2det(M)=λ1λ2
trace(M)=λ1+λ2trace(M)=λ1+λ2
这⾥λ1,λ2λ1,λ2是矩阵MM的2个特征值,kk是⼀个指定值,这是⼀个经验参数,需要实验确定它的合适⼤⼩,通常它的值在0.04和0.06之间,它的存在只是调
节函数的形状⽽已。
RR取决于MM的特征值,对于⾓点|R||R|很⼤,平坦的区域|R||R|很⼩,边缘的RR为负值;
但是为什么会使⽤这样的表达式呢?⼀下⼦是不是感觉很难理解?其实也不难理解,函数表达式⼀旦出来,我们就可以绘制它的图像,⽽这个函数图形正好
满⾜上⾯⼏个区域的特征。通过绘制函数图像,直观上更能理解。绘制的RR函数图像如下:
所以说难点不在于理解这个函数表达式,⽽在于如何创造出这个函数表达式。Harris也许对很多函数模型⾮常了解,对于创造出这样的⼀个函数表达式,易如
反掌,当然在我们看来感觉是很了不起的,那是因为我们见过的函数模型太少。
最后设定R的阈值,进⾏⾓点判断。当然其中还有些后处理步骤就不再说了,⽐如说⾓点的极⼤值抑制等。
⾮极⼤值抑制的原理,在⼀个窗⼝内,如果有很多⾓点则⽤值最⼤的那个⾓点,其他的⾓点都删除。
注意:有些朋友在问是如何通过矩阵判断⾓点的?其实上⾯,我们已经推导出E(u,v)E(u,v)的表达式,⼤家看看这个表达式有什么特征,其中矩阵M是实对称
矩阵,那么E表达式其实就是⼆次型,对于⼆次型想必⼤家会有印象,uu,vv代表窗⼝滑动⽅向以及滑动量,EE代表灰度变化,通过矩阵M进⾏特征值求解,
⽽特征值所对应的特征向量即为灰度变化⽅向。如果两个特征值较⼤,则表⽰有两个⽅向灰度变化较快。所以可以直接通过求解MM的特征值进⾏⾓点判断.
五⾃⼰实现Harris⾓点检测
Harris⾓点检测可以分为5个步骤:
1、计算图像I(x,y)I(x,y)在xx和yy两个⽅向的梯度IxIx,IyIy;
Ix=∂I∂x=I×[−101]Ix=∂I∂x=I×[−101]
Iy=∂I∂y=I×[−101]TIy=∂I∂y=I×[−101]T
2、计算图像两个⽅向梯度的乘积;
I2x=Ix∗IxIx2=Ix∗Ix
I2y=Iy∗IyIy2=Iy∗Iy
IxIy=Ix∗IyIxIy=Ix∗Iy
3、使⽤⾼斯函数对I2xIx2、I2yIy2、IxIyIxIy进⾏⾼斯加权(取σ=2,ksize=3),计算中⼼点为(x,y)(x,y)的窗⼝WW对应的矩阵MM;
A=∑(x,y)€Wg(I2x)=∑(x,y)€WI2x∗w(x,y)A=∑(x,y)€Wg(Ix2)=∑(x,y)€WIx2∗w(x,y)
B=∑(x,y)€Wg(I2y)=∑(x,y)€WI2y∗w(x,y)B=∑(x,y)€Wg(Iy2)=∑(x,y)€WIy2∗w(x,y)
C=∑(x,y)€Wg(IxIy)=∑(x,y)€WIxIy∗w(x,y)C=∑(x,y)€Wg(IxIy)=∑(x,y)€WIxIy∗w(x,y)
其中M=[ACCB]=∑(x,y)€Ww(x,y)[I2xIxIyIxIyI2y]M=[ACCB]=∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2].
4、计算每个像素点(x,y)处的(x,y)处的Harris响应值RR;
R=det(M)−k(trace(M))2R=det(M)−k(trace(M))2
5、过滤⼤于某⼀阈值tt的RR值;
R={R:det(M)−k(trace(M))2>t}R={R:det(M)−k(trace(M))2>t}
如果需要在3×3或者5×5的邻域进⾏⾮最⼤值抑制,则局部最⼤值点即为图像中的⾓点。
以上所有公式*表⽰逐像素点乘。
#-*-coding:utf-8-*-
"""
CreatedonMonAug2020:17:342018
@author:lenovo
"""
'''
Harris⾓点检测
'''
importcv2
importnumpyasnp
deftest():
'''
调⽤系统库函数进⾏测试
'''
img=('./image/')
img=(img,dsize=(600,400))
gray=or(img,_BGR2GRAY)
gray=32(gray)
#⾓点检测第三个参数为⾓点检测的敏感度,其值必须介于3~31之间的奇数
dst=Harris(gray,3,3,0.04)
print()#(400,600)
img[dst>0.01*()]=[0,0,255]
('',img)
y(0)
yAllWindows()
defharris_detect(img,ksize=3):
'''
⾃⼰实现⾓点检测
params:
img:灰度图⽚
ksize:Sobel算⼦窗⼝⼤⼩
return:
corner:与源图像⼀样⼤⼩,⾓点处像素值设置为255
'''
k=0.04#响应函数k
threshold=0.01#设定阈值
WITH_NMS=Fal#是否⾮极⼤值抑制
#1、使⽤Sobel计算像素点x,y⽅向的梯度
h,w=[:2]
#Sobel函数求完导数后会有负值,还有会⼤于255的值。⽽原图像是uint8,即8位⽆符号数,所以Sobel建⽴的图像位数不够,会有截断。因此要使⽤16位有符号的数据类型,即_16S。
grad=((h,w,2),dtype=32)
grad[:,:,0]=(img,_16S,1,0,ksize=3)
grad[:,:,1]=(img,_16S,0,1,ksize=3)
#2、计算Ix^2,Iy^2,Ix*Iy
m=((h,w,3),dtype=32)
m[:,:,0]=grad[:,:,0]**2
m[:,:,1]=grad[:,:,1]**2
m[:,:,2]=grad[:,:,0]*grad[:,:,1]
#3、利⽤⾼斯函数对Ix^2,Iy^2,Ix*Iy进⾏滤波
m[:,:,0]=anBlur(m[:,:,0],ksize=(ksize,ksize),sigmaX=2)
m[:,:,1]=anBlur(m[:,:,1],ksize=(ksize,ksize),sigmaX=2)
m[:,:,2]=anBlur(m[:,:,2],ksize=(ksize,ksize),sigmaX=2)
m=[([[m[i,j,0],m[i,j,2]],[m[i,j,2],m[i,j,1]]])foriinrange(h)forjinrange(w)]
#4、计算局部特征结果矩阵M的特征值和响应函数R(i,j)=det(M)-k(trace(M))^20.04<=k<=0.06
D,T=list(map(,m)),list(map(,m))
R=([d-k*t**2ford,tinzip(D,T)])
#5、将计算出响应函数的值R进⾏⾮极⼤值抑制,滤除⼀些不是⾓点的点,同时要满⾜⼤于设定的阈值
#获取最⼤的R值
R_max=(R)
#print(R_max)
#print((R))
R=e(h,w)
corner=_like(R,dtype=8)
foriinrange(h):
forjinrange(w):
ifWITH_NMS:
#除了进⾏进⾏阈值检测还对3x3邻域内⾮极⼤值进⾏抑制(导致⾓点很⼩,会看不清)
ifR[i,j]>R_max*thresholdandR[i,j]==(R[max(0,i-1):min(i+2,h-1),max(0,j-1):min(j+2,w-1)]):
corner[i,j]=255
el:
#只进⾏阈值检测
ifR[i,j]>R_max*threshold:
corner[i,j]=255
returncorner
if__name__=='__main__':
img=('./image/')
img=(img,dsize=(600,400))
#转换为灰度图像
gray=or(img,_BGR2GRAY)
dst=harris_detect(gray)
print()#(400,600)
img[dst>0.01*()]=[0,0,255]
('',img)
y(0)
yAllWindows()
运⾏效果如下:
六Harries⾓点的性质
1、参数kk对⾓点检测的影响
假设已经得到了矩阵MM的特征值λ1≥λ2≥0λ1≥λ2≥0,令λ2=αλ1λ2=αλ1,0≤α≤10≤α≤1。由特征值与矩阵MM的直迹和⾏列式的关系可得:
detM=∏iλidetM=∏iλi
trace(M)=∑iλitrace(M)=∑iλi
从⽽可以得到⾓点的响应:
R=λ1λ2−k(λ1+λ2)2=λ21(α−k(1+α)2)R=λ1λ2−k(λ1+λ2)2=λ12(α−k(1+α)2)
假设R≥0R≥0,则有:
0≤k≤α(1+α)2≤0.250≤k≤α(1+α)2≤0.25
对于较⼩的αα值,R≈λ21(α−k),α
由此,可以得出这样的结论,增⼤kk的值,降低⾓点检测的灵敏度,减少被检测⾓点的数量;减少kk值,增加⾓点检测的灵敏度,增加被检测⾓点的数量。
2、Harris⾓点检测算⼦对亮度和对⽐度的变化不灵敏
这是因为在进⾏Harris⾓点检测时,使⽤了微分算⼦对图像进⾏微分运算,⽽微分运算对图像密度的拉升或收缩和对亮度的抬⾼或下降不敏感。换⾔之,对亮
度和对⽐度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响⾓点检测的数量。
左图表⽰亮度变化,右图表⽰对⽐度变化。
3、Harris⾓点检测算⼦具有旋转不变性
Harris⾓点检测算⼦使⽤的是⾓点附近的区域灰度⼆阶矩矩阵。⽽⼆阶矩矩阵可以表⽰成⼀个椭圆,椭圆的长短轴正是⼆阶矩矩阵特征值平⽅根的倒数。当特
征椭圆转动时,特征值并不发⽣变化,所以判断⾓点响应值RR也不发⽣变化,由此说明Harris⾓点检测算⼦具有旋转不变性。
4.、Harris⾓点检测算⼦不具有尺度不变性
如下图所⽰,当图像被缩⼩时,在检测窗⼝尺⼨不变的前提下,在窗⼝内所包含图像的内容是完全不同的。左侧的图像可能被检测为边缘或曲线,⽽右侧的
图像则可能被检测为⼀个⾓点。
参考⽂献:
本文发布于:2022-12-11 20:26:03,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/87797.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |