CV算法:Harris角点(Harris Corner Detector)

  • 参考资料

Harris Corner Detector
斯坦福CS131-1718作业3
cornell-CS4670-5670-2016spring lec10_features2_web-Harris(这个比较详细)

  • Motivation

需要找出一些显著特征点进行匹配


CV算法:Harris角点(Harris Corner Detector)_第1张图片

从图中扣出一块,然后要进行匹配,有些任意有些不容易,因此我们要找出一些特征的特征,也就是我们这节要说的“角”(Corner)


CV算法:Harris角点(Harris Corner Detector)_第2张图片
  • 角(Corner)

视角变化也仍然可以很好的辨识+跟周围点在任何方向变化都很大——好的特征


CV算法:Harris角点(Harris Corner Detector)_第3张图片
  • Harris Corner Detector

加窗,窗在任何方向上随意移动变化都很大的就是角。


CV算法:Harris角点(Harris Corner Detector)_第4张图片
  • 数学表示
    注意做差的是移动前的点跟移动后的点


    CV算法:Harris角点(Harris Corner Detector)_第5张图片

    一路演算推导最后发现
    主要因素还是梯度乘积或平方的和,现在就可以忘记前面的公式了,主要是梯度的问题。


    CV算法:Harris角点(Harris Corner Detector)_第6张图片

    差别E是u和v的函数,呈现一个凸形状
    CV算法:Harris角点(Harris Corner Detector)_第7张图片

    水平边缘情况,只有在竖直移动的时候才有变化
    CV算法:Harris角点(Harris Corner Detector)_第8张图片

    竖直边缘情况


    CV算法:Harris角点(Harris Corner Detector)_第9张图片

    水平截面
    CV算法:Harris角点(Harris Corner Detector)_第10张图片

    利用特征值后将M对角化,特征值决定了轴的长度(注意是反比),特征向量决定了方向。下面的图无论截取的是哪一层,结果都是一样的,椭圆虽然有大有小,但方向不变。
    CV算法:Harris角点(Harris Corner Detector)_第11张图片

    CV算法:Harris角点(Harris Corner Detector)_第12张图片

    下图可以看出,大的特征值如果也很大是在边缘(因此对大的特征值施用阈值可以检测出边缘),小的特征值也很大是在角(对小的特征值施加阈值可以检测出角点)。
    CV算法:Harris角点(Harris Corner Detector)_第13张图片

    朴素计算法方法,记住最后一部选取局部区域内的最大值,可能是减少角点那里的重复点
    CV算法:Harris角点(Harris Corner Detector)_第14张图片

    对的小的特征值施加阈值计算起来比较复杂(要计算开方),所以下面用另外一种近似的方法
    CV算法:Harris角点(Harris Corner Detector)_第15张图片

    下面方法计算不用开方


    CV算法:Harris角点(Harris Corner Detector)_第16张图片

    具体计算
    CV算法:Harris角点(Harris Corner Detector)_第17张图片

    上面第三个步骤
    CV算法:Harris角点(Harris Corner Detector)_第18张图片

    结果
  • 实际例子


    CV算法:Harris角点(Harris Corner Detector)_第19张图片

    CV算法:Harris角点(Harris Corner Detector)_第20张图片

    CV算法:Harris角点(Harris Corner Detector)_第21张图片
  • 最后算法计算过程


    CV算法:Harris角点(Harris Corner Detector)_第22张图片
  • 最重要的疑问
    为什么不直接计算x和y方向的梯度之和,然后阈值化?我们之前的计算是至少在两个主要的方向上变化都很大,直接计算梯度和对斜边没有抵抗力。


    CV算法:Harris角点(Harris Corner Detector)_第23张图片
  • 算法实现

def harris_corners(img, window_size=3, k=0.04):
    """
    Compute Harris corner response map. Follow the math equation
    R=Det(M)-k(Trace(M)^2).

    Hint:
        You may use the function scipy.ndimage.filters.convolve, 
        which is already imported above
        
    Args:
        img: Grayscale image of shape (H, W)
        window_size: size of the window function
        k: sensitivity parameter

    Returns:
        response: Harris response image of shape (H, W)
    """

    H, W = img.shape
    window = np.ones((window_size, window_size))

    response = np.zeros((H, W))

    dx = filters.sobel_v(img)
    dy = filters.sobel_h(img)

    ### YOUR CODE HERE
    dx_squared = dx ** 2
    dy_squared = dy ** 2
    dx_dy_multiplied = dx * dy

    half_window_size = window_size//2
    M = np.zeros((2,2))

    # response要跟图像一样大小,只计算出中心那些可以加窗的,边缘那些设置为0
    for i in range(H-window_size+1):
        for j in range(W-window_size+1):
            M[0,0] = np.sum(window * dx_squared[i:i + window_size, j:j + window_size])
            M[0,1] = np.sum(window * dx_dy_multiplied[i:i + window_size, j:j + window_size])
            M[1,0] = M[0,1]
            M[1,1] = np.sum(window * dy_squared[i:i + window_size, j:j + window_size])

            R = np.linalg.det(M) - k * (np.trace(M)**2)

            i_shifted = i + half_window_size
            j_shifted = j + half_window_size
            response[i_shifted][j_shifted] = R
    ### END YOUR CODE

    return response

算法结果:


CV算法:Harris角点(Harris Corner Detector)_第24张图片

你可能感兴趣的:(CV算法:Harris角点(Harris Corner Detector))