java harris corner_CV算法:Harris角点(Harris Corner Detector)

本文详细介绍了Harris Corner Detector,一种用于寻找图像中显著特征点的算法。内容包括角点的定义、Harris算法的数学原理、特征值的应用、算法计算过程以及Python实现。通过计算梯度乘积的和来确定角点,并展示了实际应用中的结果。
摘要由CSDN通过智能技术生成

参考资料

Harris Corner Detector

斯坦福CS131-1718作业3

cornell-CS4670-5670-2016spring lec10_features2_web-Harris(这个比较详细)

Motivation

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

133ee1dde482

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

133ee1dde482

角(Corner)

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

133ee1dde482

Harris Corner Detector

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

133ee1dde482

数学表示

注意做差的是移动前的点跟移动后的点

133ee1dde482

一路演算推导最后发现

主要因素还是梯度乘积或平方的和,现在就可以忘记前面的公式了,主要是梯度的问题。

133ee1dde482

差别E是u和v的函数,呈现一个凸形状

133ee1dde482

水平边缘情况,只有在竖直移动的时候才有变化

133ee1dde482

竖直边缘情况

133ee1dde482

水平截面

133ee1dde482

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

133ee1dde482

133ee1dde482

下图可以看出,大的特征值如果也很大是在边缘(因此对大的特征值施用阈值可以检测出边缘),小的特征值也很大是在角(对小的特征值施加阈值可以检测出角点)。

133ee1dde482

朴素计算法方法,记住最后一部选取局部区域内的最大值,可能是减少角点那里的重复点

133ee1dde482

对的小的特征值施加阈值计算起来比较复杂(要计算开方),所以下面用另外一种近似的方法

133ee1dde482

下面方法计算不用开方

133ee1dde482

具体计算

133ee1dde482

上面第三个步骤

133ee1dde482

结果

133ee1dde482

实际例子

133ee1dde482

133ee1dde482

133ee1dde482

最后算法计算过程

133ee1dde482

最重要的疑问

为什么不直接计算x和y方向的梯度之和,然后阈值化?我们之前的计算是至少在两个主要的方向上变化都很大,直接计算梯度和对斜边没有抵抗力。

133ee1dde482

算法实现

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

算法结果:

133ee1dde482

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值