• Lesson4-2:OpenCV图像特征提取与描述---Harris和Shi-Tomas算法


    学习目标

    • 理解Harris和Shi-Tomasi算法的原理
    • 能够利用Harris和Shi-Tomasi进行角点检测

    1 Harris角点检测

    1.1 原理

    H a r r i s Harris Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示:
    在这里插入图片描述
    将上述思想转换为数学形式,即将局部窗口向各个方向移动 ( u , v ) (u,v) (u,v)并计算所有灰度差异的总和,表达式如下:
    E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u,v)=\sum_{x,y}w(x,y)[I(x+u,y+v)-I(x,y)]^{2} E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2

    其中 I ( x , y ) I(x,y) I(x,y)是局部窗口的图像灰度, I ( x + u , y + v ) I(x+u,y+v) I(x+u,y+v)是平移后的图像灰度, w ( x , y ) w(x,y) w(x,y)是窗口函数,该可以是矩形窗口,也可以是对每一个像素赋予不同权重的高斯窗口,如下所示:
    在这里插入图片描述
    角点检测中使 E ( u , v ) E(u,v) E(u,v)的值最大。利用一阶泰勒展开有:
    I ( x + u , y + v ) = I ( x , y ) + I x u + I u v I(x+u,y+v)=I(x,y)+I_{x}u+I_{u}v I(x+u,y+v)=I(x,y)+Ixu+Iuv

    其中 I x I_{x} Ix I y I_{y} Iy是沿x和y方向的导数,可用sobel算子计算。

    推导如下:
    在这里插入图片描述
    M M M矩阵决定了 E ( u , v ) E(u,v) E(u,v)的取值,下面我们利用 M M M来求角点, M M M I x I_{x} Ix I ​ y I​_{y} Iy​​ 的二次项函数,可以表示成椭圆的形状,椭圆的长短半轴由 M M M特征值 λ ​ 1 λ​_{1} λ1 λ ​ 2 λ​_{2} λ2决定,方向由特征矢量决定,如下图所示:
    在这里插入图片描述

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

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

    H a r r i s Harris Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值 R R R来判断角点。
    R R R的计算公式为:

    R = d e t M − α ( t r a c e M ) 2 R = detM-\alpha (traceM)^{2} R=detMα(traceM)2

    式中, d e t M detM detM为矩阵 M M M的行列式; t r a c e M traceM traceM为矩阵 M M M的迹; α α α为常数,取值范围为 0.04   0.06 0.04~0.06 0.04 0.06。事实上,特征是隐含在 d e t M detM detM t r a c e M traceM traceM中,因为:

    d e t M = λ 1 λ 2 detM=λ_{1}λ_{2} detM=λ1λ2
    t r a c e M = λ 1 + λ 2 traceM=λ_{1}+λ_{2} traceM=λ1+λ2

    那我们怎么判断角点呢?如下图所示:

    在这里插入图片描述

    • R R R为大数值的正数时是角点
    • R R R为大数值的负数时是边界
    • R R R为小数是认为是平坦区域
    1.2 实现

    OpenCV中实现Hariis检测使用的API是:

    dst=cv.cornerHarris(src, blockSize, ksize, k)
    
    • 1

    参数:

    • img数据类型为 float32 的输入图像。

    • blockSize:角点检测中要考虑的邻域大小。

    • ksize:sobel求导使用的核大小

    • k :角点检测方程中的自由参数,取值参数为 [0.04,0.06].

    示例:

    import cv2 as cv
    import numpy as np 
    import matplotlib.pyplot as plt
    # 1 读取图像,并转换成灰度图像
    img = cv.imread('./image/chessboard.jpg')
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 2 角点检测
    # 2.1 输入图像必须是 float32
    gray = np.float32(gray)
    
    # 2.2 最后一个参数在 0.04 到 0.05 之间
    dst = cv.cornerHarris(gray,2,3,0.04)
    # 3 设置阈值,将角点绘制出来,阈值根据图像进行选择
    img[dst>0.001*dst.max()] = [0,0,255]
    # 4 图像显示
    plt.figure(figsize=(10,8),dpi=100)
    plt.imshow(img[:,:,::-1]),plt.title('Harris角点检测')
    plt.xticks([]), plt.yticks([])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    结果如下:
    在这里插入图片描述
    Harris角点检测的优缺点:

    优点:

    • 旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)
    • 对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变

    缺点:

    • 对尺度很敏感,不具备几何尺度不变性。
    • 提取的角点是像素级的

    2 Shi-Tomasi角点检测

    2.1 原理

    S h i − T o m a s i Shi-Tomasi ShiTomasi算法是对 H a r r i s Harris Harris角点检测算法的改进,一般会比 H a r r i s Harris Harris算法得到更好的角点。 H a r r i s Harris Harris 算法的角点响应函数是将矩阵 M M M 的行列式值与 M M M 的迹相减,利用差值判断是否为角点。后来 S h i Shi Shi T o m a s i Tomasi Tomasi 提出改进的方法是,若矩阵 M M M的两个特征值中较小的一个大于阈值,则认为他是角点,即:

    R = m i n ( λ ​ 1 ​​ , λ 2 ) R=min(λ_{​1} ​​ ,λ_{2}) R=min(λ​1​​,λ2)

    如下图所示:
    在这里插入图片描述
    从这幅图中,可以看出来只有当 λ 1 λ_{1} λ1 λ 2 λ_{2} λ2 都大于最小值时,才被认为是角点。

    2.2 实现

    在OpenCV中实现Shi-Tomasi角点检测使用API:

    corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )
    
    • 1

    参数:

    • Image: 输入灰度图像
    • maxCorners : 获取角点数的数目。
    • qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间。
    • minDistance:角点之间最小的欧式距离,避免得到相邻特征点。

    返回:

    • Corners: 搜索到的角点,在这里所有低于质量水平的角点被排除掉,然后把合格的角点按质量排序,然后将质量较好的角点附近(小于最小欧式距离)的角点删掉,最后找到 m a x C o r n e r s maxCorners maxCorners个角点返回。
      示例:
    import numpy as np 
    import cv2 as cv
    import matplotlib.pyplot as plt
    # 1 读取图像
    img = cv.imread('./image/tv.jpg') 
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    # 2 角点检测
    corners = cv.goodFeaturesToTrack(gray,1000,0.01,10)  
    # 3 绘制角点
    for i in corners:
        x,y = i.ravel()
        cv.circle(img,(x,y),2,(0,0,255),-1)
    # 4 图像展示
    plt.figure(figsize=(10,8),dpi=100)
    plt.imshow(img[:,:,::-1]),plt.title('shi-tomasi角点检测')
    plt.xticks([]), plt.yticks([])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    结果如下:
    在这里插入图片描述


    总结

    1. Harris算法

      思想:通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化。

      API: cv.cornerHarris()

    2. Shi-Tomasi算法

      对Harris算法的改进,能够更好地检测角点

      API: cv2.goodFeatureToTrack()

  • 相关阅读:
    分类预测 | Matlab实现SSA-SVM多特征分类预测
    Intel System Flags and Fields in the EFLAGS Register
    商业化广告--体系学习-- 8 -- 业务实战篇 -- 计价与效果(下):如何制定合理的效果评估指标?
    一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
    【智能合约安全】智能合约安全审计之Code4rena(或C4) \如何成为智能合约审计员
    leetcode刷题:动态规划01(斐波那契数列)
    JAVA基于精细化考核的离散数学课程教学目标达成系统计算机毕业设计Mybatis+系统+数据库+调试部署
    Linux——zabbix
    cilantro 点云均值漂移算法(MeanShift)
    反编译过程中会面临哪些挑战和难题
  • 原文地址:https://blog.csdn.net/m0_51366201/article/details/132647185