参考资料
Harris Corner Detector
斯坦福CS131-1718作业3
cornell-CS4670-5670-2016spring lec10_features2_web-Harris(这个比较详细)
Motivation
需要找出一些显著特征点进行匹配
从图中扣出一块,然后要进行匹配,有些任意有些不容易,因此我们要找出一些特征的特征,也就是我们这节要说的“角”(Corner)
角(Corner)
视角变化也仍然可以很好的辨识+跟周围点在任何方向变化都很大——好的特征
Harris Corner Detector
加窗,窗在任何方向上随意移动变化都很大的就是角。
数学表示
注意做差的是移动前的点跟移动后的点
一路演算推导最后发现
主要因素还是梯度乘积或平方的和,现在就可以忘记前面的公式了,主要是梯度的问题。
差别E是u和v的函数,呈现一个凸形状
水平边缘情况,只有在竖直移动的时候才有变化
竖直边缘情况
水平截面
利用特征值后将M对角化,特征值决定了轴的长度(注意是反比),特征向量决定了方向。下面的图无论截取的是哪一层,结果都是一样的,椭圆虽然有大有小,但方向不变。
下图可以看出,大的特征值如果也很大是在边缘(因此对大的特征值施用阈值可以检测出边缘),小的特征值也很大是在角(对小的特征值施加阈值可以检测出角点)。
朴素计算法方法,记住最后一部选取局部区域内的最大值,可能是减少角点那里的重复点
对的小的特征值施加阈值计算起来比较复杂(要计算开方),所以下面用另外一种近似的方法
下面方法计算不用开方
具体计算
上面第三个步骤
结果
实际例子
最后算法计算过程
最重要的疑问
为什么不直接计算x和y方向的梯度之和,然后阈值化?我们之前的计算是至少在两个主要的方向上变化都很大,直接计算梯度和对斜边没有抵抗力。
算法实现
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
算法结果: