作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
目录
什么是图像的特征:
可以表达图像中对象的主要信息,并且以此为依据可以从其他未知图像中检测出相似或者相同对象。
在图像中举例什么是特征:
- 边缘
- 角点
- 纹理
一些常见的特征:
- SIFT
- SURF
- HOG
- Haar
- LBP
- KAZE
- AKAZE
- BRISK
图像特征相关的三个任务:
- Detection特征检测
- Description 特征描述
- Matching 特征匹配
Harris哈里斯角检测:
角点的定义:
角点是图像中向任意方向发生改变时,都引起图像强烈变动的区域,说白了就是平直棱线的交汇点(颜色梯度方向改变的像素点的位置)。
角点的数学形式表示:
转换成数学的形式,基本上是去求出位移(u,v)在各个方向上的强度差,这表示如下:
窗口函数可以是一个矩形窗口,也可以是一个给与它覆盖像素权重的高斯窗口。
角点数学形式推导:
为了要做角点检测,我们需要令这个函数 E(u,v) 最大。也就是说二元函数求极限的时间到了。将泰勒展开应用于上述方程,一阶二维的泰勒展开式为:
那么看下展开推导过程:
所以E(u,v)表达式最终形式可以更新为:
其中:
在此,Ix 和 Iy 分别是x 和 y方向上图像的导数。(可以被简单用索贝尔函数算出来 cv.Sobel())(M其实就是梯度的协方差矩阵),最后是把实对称矩阵对角化处理后的结果,可以把R看成旋转因子,其不影响两个正交方向的变化分量。
经对角化处理后,将两个正交方向的变化分量提取出来,就是 λ1 和 λ2(特征值)。
灰度值变化的大小积分计算:
上边我们得到了E(u,v)的最终形式了,而灰度值变化的大小则取决于矩阵M,那么如何找到这些窗口,我们可以使用矩阵的特征值来实现。计算每个窗口对应的得分(角点响应函数R)。
其中det(M)=λ1λ2是矩阵的行列式,trace(M)=λ1 + λ2是矩阵的迹:
λ1 和 λ2 是矩阵M的特征值,k是一个经验常数在(0.04,0.06)范围之间 。
分析λ1、λ2特征值可得是不是角点的结果
这些特征值决定了一个区域是角、边还是平面:
a、当 |R| 较小时,是因为 λ1 和 λ2 都很小,说明这片区域是平面。
b、当 R<0时,是因为 λ1 >> λ2 或者反过来(其中一个远大于另外一个),此时区域是边。
c、当 R较大时,是因为 λ1 和 λ2 都较大,且 λ1∼λ2,此时这片区域应为角。
它可以用下图来表示:
所以哈里斯角点检测算法的结果,是一个带着这些得分的灰度图像,使用一个合适的阈值,就能给到我们图中的角点。
相关函数cornerHarris():
cv2.cornerHarris( ),通常结合cv.cornerSubPix() 亚像素精细化函数使用
Shi—tomasi拐角检测器
Harris和Shi-Tomasi区别:
Harris 角点检测中每个窗口的分数公式是将矩阵 M 的行列式与 M 的迹相减:
由于 Harris 角点检测算法的稳定性和 k 值有关,而 k 是个经验值,不好设定最佳值。
Shi-Tomasi 发现,角点的稳定性其实和矩阵 M 的较小特征值有关,于是直接用较小的那个特征值作为分数。这样就不用调整k值了。
所以 Shi-Tomasi 将分数公式改为如下形式:
如果大于阈值,则将其视为拐角。如果像在Harris Corner Detector中那样在
空间中绘制它,则会得到如下图像:
从图中可以看出,只有当两个值都大于最小值时,才将其视为拐角,也就是绿色区域。
Shi-Tomasi 的函数: cv2.goodFeaturesToTrack() ,用法可以参考我的另一篇文章:
opencv-python 实现角点检测和棋盘角点检测_RayChiu757374816的博客-CSDN博客
【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】