Harris角点检测的原理是什么?

1. 原理

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

Harris角点检测原理

将上述思想转换为数学形式,即将局部窗口向各个方向移动(�,�)(u,v)并计算所有灰度差异的总和,表达式如下:

�(�,�)=∑�,��(�,�)[�(�+�,�+�)−�(�,�)]2E(u,v)=​x,y​∑​​w(x,y)[I(x+u,y+v)−I(x,y)]​2​​

其中�(�,�)I(x,y)是局部窗口的图像灰度,�(�+�,�+�)I(x+u,y+v)是平移后的图像灰度,�(�,�)w(x,y)是窗口函数,该可以是矩形窗口,也可以是对每一个像素赋予不同权重的高斯窗口,如下所示:

Harris角点检测02

角点检测中使�(�,�)E(u,v)的值最大。利用一阶泰勒展开有:
�(�+�,�+�)=�(�,�)+���+���I(x+u,y+v)=I(x,y)+I​x​​u+I​y​​v
其中��I​x​​和 ��I​y​​ 是沿x和y方向的导数,可用sobel算子计算。

推导如下:

Harris角点检测03

�M矩阵决定了�(�,�)E(u,v)的取值,下面我们利用�M来求角点,�M是��I​x​​和��I​y​​的二次项函数,可以表示成椭圆的形状,椭圆的长短半轴由�M的特征值�1λ​1​​和�2λ​2​​决定,方向由特征矢量决定,如下图所示:

Harris角点检测04

椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。

Harris角点检测08

共可分为三种情况:

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

Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值�R来判断角点。�R的计算公式为:
�=����−�(������)2R=detM−α(traceM)​2​​
式中,detM为矩阵M的行列式;traceM为矩阵M的迹;α为常数,取值范围为0.04~0.06。事实上,特征是隐含在detM和traceM中,因为:

Harris角点检测09

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

Harris角点检测10

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

2. 实现

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

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

参数:

  • 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()

结果如下:

Harris角点检测10

Harris角点检测的优缺点:

优点:

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

缺点:

  • 对尺度很敏感,不具备几何尺度不变性。
  • 提取的角点是像素级的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值