harris角点检测算法的原理_harris角点检测算法的原理

harris角点检测算法的原理_harris角点检测算法的原理文章目录一、harris角点检测原理1.1基本思想1.2数学模型3、关于harris角点响应函数R二、harris角点检测源代码2.1计算harris角点响应函数R2.2harris角点检测三

一、harris角点检测原理

1.1基本思想

  使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。
在这里插入图片描述

1.2 数学模型

图像窗口平移[u,v]产生灰度变化E(u,v)为:
在这里插入图片描述
  上式经泰勒展开后的得到
在这里插入图片描述
  对局部微小的移动量 [u,v],所以 可以近似得到下式
在这里插入图片描述
记M的特征值λ1、λ2,可以将图像上的像素点分类成直线、平面与角点:当λ1和λ2 都比较大,且近似相等时,可以认为是角点。对图像点分类如下图:
在这里插入图片描述

3、关于harris角点响应函数R

由于是通过M的两个特征值的大小对图像进行分类,所以,定义角点相应函数R:
在这里插入图片描述
于是上图图像点分类图转化为下图:
在这里插入图片描述
有结论如下:

  • 角点——R为大数值正数
  • 边缘——为大数值负数
  • 平坦区——为小数值

在判断角点的时候,对角点响应函数R进行阈值处理:R > threshold,提取R的局部极大值。

二、harris角点检测源代码

2.1 计算harris角点响应函数R

算法:

  1. 使用高斯倒数滤波器计算图像x,y两个方向的梯度值im_x,im_y(使用高斯倒数滤波器计算可在角点检测过程中抑制噪声强度)
  2. 计算图像两个方向梯度的乘积分别为x方向的平方,y方向的平方,x和y的乘积,同样使用高斯倒数滤波器计算
  3. 计算局部特征结果矩阵M的特征值
  4. 计算响应函数的值
def compute_harris_response(im, sigma=3):
    '''
    对每个像素值计算Harris角点检测器响应函数
    :param im:
    :param sigma:
    :return:
    '''

    # 计算导数
    im_x = np.zeros(im.shape)
    im_y = np.zeros(im.shape)
    filters.gaussian_filter(im, (sigma, sigma), (0, 1), im_x)
    filters.gaussian_filter(im, (sigma, sigma), (1, 0), im_y)

    # 计算Harris矩阵分量
    Ixx = filters.gaussian_filter(im_x * im_x, sigma)
    Ixy = filters.gaussian_filter(im_x * im_y, sigma)
    Iyy = filters.gaussian_filter(im_y * im_y, sigma)

    # 计算特征值和迹
    Idet = Ixx * Iyy - Ixy ** 2
    Itrace = Ixx + Iyy

    #return Idet / Itrace
    print  Idet - 0.04 * (Itrace ** 2)
    return Idet-0.04*Itrace**2

2.2harris角点检测

伪代码:

  1. 输入图像,并将图像转换为灰度图
  2. 对图像检测harris角点
  3. 画出Harris响应图
  4. 选取像素值高于设定阈值的点,并进行局部极大值抑制
  5. 输出图像的角点
# 读入图像
im0 = array(Image.open('data/7/IMG_20200106_175418.jpg'))
im = array(Image.open('data/7/IMG_20200106_175418.jpg').convert('L'))

# 检测harris角点
harrisim = compute_harris_response(im)


# Harris响应函数
harrisim1 = 255 - harrisim

figure()
gray()

#画出Harris响应图
subplot(151)
title("原图",fontproperties=font)
axis('off')
imshow(im0)
subplot(152)
imshow(harrisim1)
print harrisim1.shape
axis('off')
axis('equal')

#设定阈值以及限制并输出
threshold = [0.01, 0.05, 0.1]
for i, thres in enumerate(threshold):
    filtered_coords = harris.get_harris_points(harrisim, 6, thres)
    subplot(1, 5, i+3)
    imshow(im)
    print im.shape
    plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
    axis('off')
    
show()

   局部极大值限制原理为,角点之间的距离必须大于设定的最小距离,这样若有过近或重叠的角点,会被滤除。

三、harris角点响应函数R的分析

3.1不同k值


k=0.01

图像角点结果:
在这里插入图片描述
R值结果:
在这里插入图片描述


k=0.04

图像角点结果:
在这里插入图片描述
R值结果:
在这里插入图片描述


k=0.06

图像角点结果:
在这里插入图片描述
R值结果:
在这里插入图片描述


k=0.08

图像角点结果:
在这里插入图片描述
R值结果:
在这里插入图片描述
分析:
  K值越小,检测到的角点越多,R值趋于小数值,随着K值的增大,检测到的角点减少,响应函数R值较小,R值趋于负数,因为在R=detM-k(traceM)^2中,若k值较小,则R值由主要由detM=λ1λ2值决定,此时λ1λ2都较大,则R值大,大于局部极大值的角点多,所以取到的角点多;若k值较大,k(traceM)的平方值增大,R值变为大值负数,较多角点受局部极大值抑制,取到的角点少一些。所以k值取0.04-0.06为宜

3.2对R不同的计算方法

3.2.1 函数计算

在这里插入图片描述
图像角点结果:
在这里插入图片描述
R值结果:
在这里插入图片描述

3.2.2 商计算

在这里插入图片描述
图像角点结果:
在这里插入图片描述
R值结果:
在这里插入图片描述
分析:
  由上面讨论的结果可知,在R=detM-k(traceM)^2中响应值R受K值大小影响,检测出的角点变化明显。上图结果可知,返回商计算结果时,更易于检测出边缘角点,而返回函数 R=detM-k(traceM)^2结果时,并没有检测出图像中的边缘角点,因此函数计算出的边缘像素点的R值大多被局部极大值抑制导致边缘角点被滤掉。所以,为避免R值易受K值影响,最好采用返回R值的商计算结果

3.3不同图像中的R值

3.3.1角点丰富的图像

图像角点结果:
在这里插入图片描述
R值结果:
在这里插入图片描述

3.3.2平坦的图像

图像角点结果:
在这里插入图片描述
R值结果:
在这里插入图片描述

3.3.3边缘多的图像

图像角点结果:
在这里插入图片描述

R值结果:
在这里插入图片描述

3.3.4分析

  由结果可知,在角点丰富的图中,R值为正值,因为角点丰富的图λ1λ2值都较大即detM值大,则R值大。在平坦的图中,R值为小数值,且平坦的图中含有边缘,因此R值也有负数值;因为在平坦的图中,λ1λ2值都很小,所以R值小。在边缘丰富的图中,λ1和λ2的值一方大一方小,所以R值为大值负数。

3.4小结

  • harris角点响应函数R值易受加权常数k值影响,为得到较准确的角点检测结果通常返回商数计算值。
  • 在角点丰富的图中,R为大数值正数;在边缘多的图中R为大数值负数

今天的文章harris角点检测算法的原理_harris角点检测算法的原理分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83385.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注