Harris角点检测

原理

Harris角点检测是在灰度图上,设置一个局部窗口向多个方向随意平移,通过判断窗口内像素值有无明显变化判断有无角点的一种角点检测方法。

灰度变化描述

在这里插入图片描述
在这里插入图片描述

检测流程及代码

1.计算图像(灰度图)的水平和竖直方向的梯度Ix,Iy;

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Dx = cv2.Sobel(img,cv2.CV_32F,1,0,ksize=ksize)
Dy = cv2.Sobel(img,cv2.CV_32F,0,1,ksize=ksize)

2.计算每个像素位置的Harris矩阵M;

M = np.zeros([img.shape[0], img.shape[1], 3], dtype=np.float32)
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        M[i,j,0] = Dx[i,j] * Dx[i,j]
        M[i,j,1] = Dx[i,j] * Dy[i,j]
        M[i,j,2] = Dy[i,j] * Dy[i,j]
#计算3*3块内的梯度和
M = cv2.boxFilter(M, -1, (3, 3), normalize = False)

3.计算每个像素位置的Harris角点响应值R;

R = np.zeros([M.shape[0], M.shape[1]], dtype=np.float32)
for i in range(M.shape[0]):
    for j in range(M.shape[1]):
        a = M[i,j,0]
        b = M[i,j,1]
        c = M[i,j,2]
        R[i,j] = a*c - b*b - k*(a+c)*(a+c)

(3+)非最大值抑制。
4.角点输出。

pos = cv2.goodFeaturesToTrack(R, 0, 0.01, 10)
for i in range(len(pos)):
    cv2.circle(img, (pos[i][0][0], pos[i][0][1]), 5, [255,0,0], thickness=3)
cv2.imshow('Harris',img)
cv2.waitKey(0)

在这里插入图片描述

Opencv函数

cv2.cornerHarris(src, blockSize, ksize, k, dst=None, borderType=None)

src:数据类型为 float32 的输入图像
blockSize:角点检测中考虑的区域大小
ksize:Sobel求导中使用的窗口大小
k:Harris 角点检测方程中的自由参数,取值参数为 [0.04 0.06]
dst:输出图像
borderType:边界的类型

算法特点

1.亮度和对比度的变化对角点无影响。
2.Harris角点检测算子具有旋转不变性(旋转形状不变)。
3.Harris角点检测不具有尺度不变性(同等窗口内的图像随着图像缩放会不同)。
4.阈值决定检测点数量。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值